【问题标题】:How to escape powershell command arguments when calling from Ruby/Chef?从 Ruby/Chef 调用时如何转义 powershell 命令参数?
【发布时间】:2015-12-09 03:42:34
【问题描述】:

我目前遇到了标准的 Bobby Tables 问题,但环境是 Chef + Ruby + powershell。

到目前为止,所有solutions I've seen 似乎都不合适:它们用引号将参数括起来,但不能完全转义参数。 Shellwordsshellescape 看起来很有希望,但它们似乎是特定于 bash 的。

例如,我可能想在 Chef 中构建这个 windows shell 命令:

.\foo.exe BAR="#{node['baz']}"

从 SQL 开发世界中概括,我会天真地期待这样的接口:

cmd = "foo.exe BAR=?"
args = (node['baz'])
run-command(cmd, args)

run-command 将处理转义任何参数。相反,我看到的界面让我想起了糟糕的旧 SQL 时代,那时开发人员不得不将 SQL 构造为字符串,并“手动”转义任何参数。

任何关于如何进行的最佳实践的指针?使用system?谢谢!

编辑: 需要明确的是,上面的参数baz 可以包含任意文本,包括可能的任意字符组合。认为它与Bobby Tables 问题相同。

【问题讨论】:

  • 很可能你不需要太努力。看看this article对你有没有帮助。
  • 感谢您的链接,@Bill_Stewart。不幸的是,这篇文章似乎完全处理了参数中的空格,它的解决方案是用双引号将它们括起来。
  • 您可以使用下载中的showargs.exe 命令行实用程序来查看 PowerShell 构造的实际命令行。

标签: ruby powershell chef-infra


【解决方案1】:

最简单的通用解决方案是对execute 资源的command 属性使用数组形式。这样可以避免所有 shell 解析并逐字运行命令。

execute 'whatever' do
  command ['foo.exe', "BAR=#{node['baz']}"]
end

这不适用于script 样式资源,它需要一个字符串来运行脚本块,包括powershell_script。在那里,您需要更适合 PowerShell 的东西,我不太了解它的规则,无法判断 Shellwords 是否匹配。

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 2010-10-01
    • 2013-02-01
    • 2020-11-17
    • 2010-09-05
    • 1970-01-01
    • 2016-10-28
    • 2014-12-09
    相关资源
    最近更新 更多