我如何告诉 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 代码注入。
我正在编写调用 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 代码注入。