3

我有一个包含 ruby​​_block 的 Chef 食谱,其中包含:

myoutput = `keytool -import -alias #{al} -keystore #{ks} -storepass #{pw} -file #{ca} -trustcacerts -noprompt`
puts ":" + myoutput + ":"
Chef::Log.error('Error installing CA Cert') unless myoutput.include? "Certificate was added to keystore"

(所有变量都已正确设置。)以下是相关输出:

Certificate was added to keystore
::
[2013-07-03T21:26:41-07:00] ERROR: Error installing CA Cert

注意 ::。为什么 myoutput 设置不正确?当我手动运行该命令时,我得到了预期的输出。反引号中的命令做了它应该做的事情,所以我知道它正在运行,但由于某种原因,命令的标准输出没有分配给 myoutput,我不知道为什么。有任何想法吗?谢谢——戴夫

编辑:原因是因为这个特定的“keytool”调用的输出是stderr,而不是stdout。

4

2 回答 2

6

可能是输出被定向到 STDERR 而不是 STDOUT。尝试这个:

myoutput = `keytool -import -alias #{al} -keystore #{ks} -storepass #{pw} -file #{ca} -trustcacerts -noprompt 2>&1`

我没有任何要导入的证书来测试它,但是`keytool`单独运行会将输出发送到 STDERR,而`keytool 2>&1`工作正常。所以我猜这个应用程序通常会写入 STDERR(很奇怪)。

于 2013-07-04T06:01:46.490 回答
3

2016 更新

你可以做

require 'mixlib/shellout'
cmd = Mixlib::ShellOut.new("keytool -import -alias #{al} -keystore #{ks} -storepass #{pw} -file #{ca} -trustcacerts -noprompt")
cmd.run_command
# you can now use cmd.stdout and cmd.stderr

Chef 文档现在表明您不应使用反引号,而应使用mixlib-shellout库:

始终使用 mixlib-shellout 进行脱壳。永远不要使用反引号、Process.spawn、popen4 或其他任何东西!

mixlib-shellout 模块提供了一个简化的脱壳接口,同时仍然收集标准输出和标准错误,并提供对环境、工作目录、uid、gid 等的完全控制。

有关更多详细信息,请参阅文档的这一部分。

于 2016-06-27T15:49:55.317 回答