2016-11-28 1 views
0

Всякий раз, когда я пишу рецепт, Шеф-повар никогда, кажется, не использует sed правильно. Обычно я могу обойти это с помощью какого-то творческого grep'ing, но не в этом случае. Я просто пытаюсь извлечь Distinguished Name из некоторых файлов cert. Удаляя обратную косую черту перед одинарными кавычками, эта команда выполняется отлично в командной строке. Шеф-повар также не бросает никаких ошибок. «Нерабочая» часть приходит, потому что вывод, который хранится в переменной «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

Попробуйте запустить 'type sed' в своей оболочке/терминале и используя полный путь, который вы видите, а не голый' sed' в своем рецепте. Также попробуйте более простую команду 'sed', например' sed '/./#/ 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