我怎么告诉linux bash忽略反引号?

时间:2015-01-06 00:47:29

标签: mysql linux bash chef

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

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总是抱怨语法,因为它试图解释反引号并进行评估。我怎么能告诉它完全忽略那个角色?

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

2 个答案:

答案 0 :(得分:2)

您还可以在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的任何处理。

答案 1 :(得分:0)

这可能是因为你用ruby构建了一个字符串(我不知道ruby),然后将它传递给shell执行动作

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

命令“ mysql --user =#{user}#{db_name} --execute = ”CALL someStoredProcedure(\“一个字符串\”,“我有一个有问题的背景信息”)没有控制需要通过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代码注入。