我如何告诉 linux bash 忽略反引号?

How do I tell linux bash to ignore backticks?

我正在编写调用 mysql 命令并执行查询的厨师食谱。问题是传递给这个命令的查询可以有反引号,我无法控制它。 EG 我会这样做:

execute "update_customer_segment_custom_condition_#{no_space_segment_name}" do action :run command "mysql --user=#{user} #{db_name} --execute="CALL someStoredProcedure(\"A String\", \"A QUERY CONTAINING BACKTICKS OVER WHICH I HAVE NO CONTROL THAT NEEDS TO BE PASSED VERBATIM\");" end

但 Bash 总是抱怨语法,因为它试图解释反引号并计算。我怎样才能让它完全忽略那个角色?

仅供参考,这是在 chef execute 块中作为 command 调用的,因此使用 # 作为变量。

您也可以在 Chef 中使用 execute 资源而不是 bash。这不会使用 bash,因此反引号没有特殊含义。

编辑:

更具体地说明您发布的示例资源

execute "update_customer_segment_custom_condition_#{no_space_segment_name}" do
  command ['mysql', "--user=#{user}", db_name, '--execute="CALL someStoredProcedure(\"A String\", \"A QUERY CONTAINING BACKTICKS OVER WHICH I HAVE NO CONTROL THAT NEEDS TO BE PASSED VERBATIM\");"']
end 

command 的数组形式关闭了 shell 的任何处理。

这可能是因为您使用 ruby 构建了一个字符串(我不知道 ruby),然后将其传递到 shell 执行操作 运行

这已经有问题了,因为你的双引号在中间字符串中终止:

command "mysql --user=#{user} #{db_name} --execute="CALL someStoredProcedure(\"A String\ ", \"A QUERY CONTAINING BACKTICKS OVER WHICH I HAVE NO CONTROL THAT NEEDS TO BE PASSED VERBATIM\");"

所以我想知道ruby是否没有在这里为最后补充的"给出语法错误。

您要生成的字符串(可能)如下所示:

mysql --user=#{user} #{db_name} --execute="CALL someStoredProcedure(\"A String\", \"A QUERY\");"

你需要这样生成它:

mysql --user=#{user} #{db_name} --execute='CALL someStoredProcedure("A String", "A QUERY");"

而带有 "A QUERY" 的部分你需要用 '\'' 替换所有出现的 ' 否则你仍然可以获得 shell 代码注入。