2016-11-28 4 views
0

요리법을 쓸 때마다 요리사는 결코 sed를 올바르게 사용하지 않는 것 같습니다. 나는 일반적으로 몇 가지 창조적 인 grep'ing로 해결할 수 있지만,이 경우에는 아닙니다. 일부 인증서 파일에서 Distinguished Name을 추출하려고합니다. 작은 따옴표 앞에 백 슬래시를 제거하면이 명령은 명령 행에서 잘 실행됩니다. 요리사도 실수를하지 않습니다. "작동하지 않는"부분은 "sd"가 전혀 실행되지 않은 것처럼 "DN"변수에 저장된 출력이 openssl 명령 내용 일 뿐이 기 때문에 발생합니다. 나는 또한 이것을 루비 코드처럼 실행하여 잘 실행했다. 이 문제를 해결하는 요리사 인 것처럼 보입니다.요리사가 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 '/./#/ g'와 같은 더 간단한'sed' 명령을 시도해보십시오. –

+0

요리사 : 12.15.19 및 로그? –

답변

1

Ruby에서 대문자로 시작하는 이름은 상수이며 아마도 관련이 있습니다. 대신 dn을 사용하십시오. 또한이 작업을 수행하는 동안 루비 코드에서 정규 표현식을 사용하는 것이 쉽고 빠를 것입니다. 따옴표를 수정하는 방법을 정할 필요가 없으므로 (아마도 백 슬래시가 필요하지 않습니다). 당신이 더욱 가고 싶어하면

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" 

당신이있을 수 있습니다 @coderanger와 같은 Ruby 문제는 DN이 ​​Ruby에서 상수이므로 다음과 같은 오류 메시지가 표시되어야합니다.

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