2016-11-28 103 views
0

每當我寫食譜時,廚師似乎都不會正確使用sed。我通常可以用一些創造性的grep來解決它,但在這種情況下不能。我只是試圖從一些證書文件中提取可分辨名稱。在單引號之前刪除反斜槓,這個命令在命令行上執行得很好。廚師也不會拋出任何錯誤。 「不工作」部分進來了,因爲存儲在「DN」變量中的輸出只是openssl命令的內容,就好像sed從未運行過一樣。我也將它作爲直接的Ruby代碼運行,並且執行得很好。這似乎只是廚師正在解決這個問題。廚師沒有正確處理sed

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

哪個版本的廚師?有些日誌可能會有助於得到那裏的錯誤... – Tensibai

+1

嘗試在shell/Terminal中運行'type sed',並使用您看到的完整路徑而不是裸食譜中的'sed'。也可以嘗試一個更簡單的'sed'命令,比如'sed's /./#/ g''。 –

+0

廚師:12.15.19和哪個日誌? –

回答

1

在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 
0

我不能複製您的問題在撬會話:

[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