厨师没有正确处理 sed

Chef not processing sed correctly

每当我写食谱时,Chef 似乎从来没有正确使用过 sed。我通常可以通过一些创造性的 grep'ing 来解决它,但在这种情况下不行。我只是想从一些证书文件中提取专有名称。删除单引号前的反斜杠,此命令在命令行上执行得很好。 Chef 也不会抛出任何错误。 "not working" 部分出现是因为存储在 "DN" 变量中的输出只是 openssl 命令内容,就好像 sed 根本就不是 运行 一样。我也 运行 这是直接的 Ruby 代码,它执行得很好。似乎只是 Chef 导致了这个问题。

filesAndExpArray = splitArray.map! do |file|
  DN = shell_out("openssl x509 -noout -subject -in #{file} | sed \'s/^.*CN=//\'")
  DN = DN.stdout
  file + ";" + DN
end

在Ruby中以大写字母开头的名称是常量,这可能是相关的。请改用 dn。此外,虽然您可以这样做,但在 Ruby 代码中执行正则表达式会更容易和更快,因为您不需要弄清楚如何修复您的引用(您可能不需要那些反斜杠) .

filesAndExpArray = splitArray.map do |file|
  cmd = shell_out("openssl x509 -noout -subject -in #{file}")
  dn = cmd.stdout[/^.*CN=(.*)$/, 1]
  file + ";" + dn
end

如果您想走得更远,您可以完全放弃 shell_out

filesAndExpArray = splitArray.map do |file|
  subject = OpenSSL::X509::Certificate.new(IO.read(file)).subject
  cn = subject.to_a.find {|part| part.first == 'CN'}
  dn = cn && cn[1]
  file + ";" + dn
end

我无法在窥探会话中复制您的问题:

[2] pry(main)> file = "server.crt"
=> "server.crt"
[11] pry(main)> require 'chef/mixin/shell_out'
=> true
[12] pry(main)> include Chef::Mixin::ShellOut
=> Object
[13] pry(main)> shell_out!("openssl x509 -noout -subject -in #{file} | sed \'s/^.*CN=//\'").stdout
=> "*.<CENSORED>.org\n"

您可能遇到了 Ruby 的问题,就像@coderanger 建议的那样,因为 DN 在 Ruby 中是一个常量,您应该会看到这样的错误消息:

(pry):15: warning: already initialized constant DN
(pry):14: warning: previous definition of DN was here