我正在编写一个调用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
进行调用,因此使用#作为变量。
答案 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代码注入。