2016-11-28 6 views
0

Immer wenn ich ein Rezept schreibe, scheint Chef nie sed richtig zu verwenden. Ich kann generell mit etwas kreativem Grep'ing umgehen, aber nicht in diesem Fall. Ich versuche nur, den Distinguished Name aus einigen Cert-Dateien zu extrahieren. Wenn Sie den umgekehrten Schrägstrich vor den einfachen Anführungszeichen entfernen, wird dieser Befehl in der Befehlszeile problemlos ausgeführt. Chef wirft auch keine Fehler. Der "nicht funktionierende" Teil kommt herein, weil die Ausgabe, die in der "DN" -Variable gespeichert ist, nur der Inhalt des openssl-Befehls ist, als ob der sed nie überhaupt ausgeführt worden wäre. Ich habe das auch als direkten Ruby-Code ausgeführt und es hat gut funktioniert. Es scheint nur Chef zu sein, der das Problem löst.Chef nicht sed korrekt verarbeiten

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

Welche Version des Kochs? Einige Logs könnten hilfreich sein, um herauszufinden, was dort nicht stimmt ... – Tensibai

+1

Versuchen Sie, 'type sed' in Ihrer Shell/Terminal auszuführen und den vollständigen Pfad zu verwenden, den Sie sehen, anstatt blank' sed' in Ihrem Rezept. Versuchen Sie auch einen einfacheren 'sed'-Befehl, wie zum Beispiel' sed 's /./#/ g''. –

+0

Koch: 12.15.19 und welches Protokoll? –

Antwort

1

Namen mit einem Großbuchstaben in Ruby beginnen, sind Konstanten, die wahrscheinlich in Zusammenhang steht. Verwenden Sie stattdessen dn. Auch wenn Sie dies tun können, wird es einfacher und schneller, die Regex in Ruby-Code zu tun, da Sie nicht herausfinden müssen, wie Sie Ihr Angebot reparieren können (Sie brauchen diese Backslashes wahrscheinlich nicht).

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

Wenn Sie weiter gehen wollte noch konnte man shell_out völlig Graben:

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

Ich kann Ihre Frage in einer Sitzung hebeln nicht replizieren:

[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" 

Sie können eine haben Problem mit Ruby wie @cerangeranger schlägt vor, weil DN eine Konstante in Ruby ist, sollten Sie solche Fehlermeldungen dann sehen:

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