2017-08-07 135 views
2

我試圖抓住使用這個命令的SSL證書信息:grep的正則表達式的Perl和捕捉組

openssl s_client -connect gcm-http.googleapis.com:443 

將返回SSL證書信息。我試圖grep -P,但無法弄清楚1)正確的正則表達式,以及2)如何讓Grep真正返回。到目前爲止,使用下面的正則表達式的grep命令不會返回任何內容。

下面是我對工作的信息:

(More unrelated data - Truncated) 
--- 
Certificate chain 
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com 
    i:/C=US/O=Google Inc/CN=Google Internet Authority G2 
1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2 
    i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 
2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 
    i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority 
--- 
Server certificate 

-----BEGIN CERTIFICATE----- 
MIIE3TCCA8WgAwIBAgIISZPzqn6Rx/0wDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE 
BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl 
cm5ldCBBdXRob3JpdHkgRzIwHhcNMTcwNzI1MDgyOTQ0WhcNMTcxMDE3MDgyNzAw 
WjBqMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN 
TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEZMBcGA1UEAwwQKi5n 
b29nbGVhcGlzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL50 
UZFxROM8NwIcSTC9V6XAJkoCcW+xuLtYFUbP+6zomzzxYXtTjh+s33XvtaHoNk1S 
WxBqSX+0YsS1RHzwWT4KwJpkEyrqJ/WDtKs3hQY27Lng6IZmAYomoRXNZBWgXdQ0 
sBddBU9/HtpKu0RpL6qM+7y7Xpp8KHilqPfjvtc8eljvOAdU3RA3w1p2JIov+F5n 
sbD1bMqq3Xx6wbT7FLhzL8P/+g1NI0DC/fzSqW+pS/RLljQGLJrlvfmrV++i69Yg 
pFRHPvTo85171cLjvHNv730SkM4W9SA7oHU+xzmANrT+p/ikcEJrcMnR9pKf08ON 
pN9UgsEff7BZE0jvlu0CAwEAAaOCAaYwggGiMB0GA1UdJQQWMBQGCCsGAQUFBwMB 
BggrBgEFBQcDAjB0BgNVHREEbTBrghAqLmdvb2dsZWFwaXMuY29tghUqLmNsaWVu 
dHM2Lmdvb2dsZS5jb22CGCouY2xvdWRlbmRwb2ludHNhcGlzLmNvbYIWY2xvdWRl 
bmRwb2ludHNhcGlzLmNvbYIOZ29vZ2xlYXBpcy5jb20waAYIKwYBBQUHAQEEXDBa 
MCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0MCsG 
CCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0GA1Ud 
DgQWBBRQbPBTOA3tVXQWc4iuJyyz5dGWMzAMBgNVHRMBAf8EAjAAMB8GA1UdIwQY 
MBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMCEGA1UdIAQaMBgwDAYKKwYBBAHWeQIF 
ATAIBgZngQwBAgIwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29nbGUu 
Y29tL0dJQUcyLmNybDANBgkqhkiG9w0BAQsFAAOCAQEAeClOfrviHl9sZAVSTfYB 
5FuIDKeSJHibXtjHSNsUP+JaAB9x1ABDczyLYWD/4PaD2w8jRXPXcVcqUaQPqyjF 
1um/H/+Eb8+qfwl+Q3RiBAgGgAPw+s6GZK/kGfF9CNPbwhPXizYS6BZZ880/x3ec 
Em0F+i0NbHsufPg4ghtJr2gFC2NWHwhvZtezbQDR2z8ePu1r3hyFwgotefCFsQJv 
zAbVOvXsqHZdom3BLVwkANeh5hRfeW04N48bRVMZo9A0cULTg5LM1AOXGeLbp86z 
D3RHbwtbRBGp2HUjfpt8FqeMzd+DxGlQXEc7l8aFwOgIFvWRJv+SHCXVT3rRHGD+ 
wA== 
-----END CERTIFICATE----- 

.... 
(More unrelated data - Truncated) 

我已經試過這兩個regexs的:

grep -P '((?:-+BEGIN CERTIFICATE-+\n)(.+\n)*(?:-+END CERTIFICATE-+))' 

grep -P '(?:-+BEGIN CERTIFICATE-+\n)(.+\n)(?:-+END CERTIFICATE-+)' 

從本質上講,我想只返回證書本身,而不是----BEGIN CERTIFICATE---------END CERTIFICATE-----

我知道有可能是更好的方法來做正則表達式,但我測試了它(並且它的工作)在regexr.comregex101.com

如果Grep正在成功捕獲它,則執行echo $1不會返回任何內容。

+0

'grep -v - file'? – Cyrus

+0

我需要進一步澄清。執行'openssl'命令會吐出大量的數據。數據的「塊」之一是證書信息。如果只有證書信息,使用'grep -v'會很有效,但不幸的是沒有。我會編輯我的帖子以更具體。 – Patrick

+2

問題是'grep'一次只能看到一行。它也沒有做任何捕獲。 – Schwern

回答

6

只爲記錄,這是一個grep命令,將只提取證書ificate:

grep -zoPe '--BEGIN.*\n\K[^-]+' file | head -c-1 

訣竅是使用-n/--null-data選項(行終止\0,不換行)。此外,我們使用PCRE和PCRE的特殊轉義序列the reset match start \K,這會導致任何先前匹配的字符不包含在最終匹配序列中(我們只需要--BEGIN...\n之後和-...之前的部分)。

head -c-1將刪除最後一個字符,這是對老年人grep S(例如GNU grep V2一個換行符。12)和空字節,用於較新的grep(例如,GNU grep v2.25)。

+0

我建議追加'| grep .'刪除空行。 – Cyrus

+0

你是什麼意思?什麼空行? – randomir

+0

使用GNU grep 2.6.3有一個尾隨的空行。 – Cyrus

6

我沒得到與grep這方面的工作,但有一個Perl的解決方案:

perl -0777 -n -e \ 
    'print $1 if /-+BEGIN CERTIFICATE-+\n(.+\n)*-+END CERTIFICATE-+/s' \ 
    cert.txt 

這將打印的第一個「BEGIN ...」,最後「END 一切。 ..「。

更新

@brian d foyan article有關「獨家觸發器操作」。根據該條規定,這也適用:

perl -n -e \ 
    'print if ($rc = /-+BEGIN CERTIFICATE/ .. /-+END CERTIFICATE-+/ and $rc !~ /(^1|E0)$/)' cert.txt 
+0

太棒了,謝謝!這似乎與一個文件一起工作。我可能會嘗試讓Perl腳本去做這件事。感謝你的幫助! – Patrick

1

使用sed

sed -n '/----BEGIN CERTIFICATE-----/,/----END CERTIFICATE-----/ p' inputfile | 
    sed '1d;$d' 

編輯: 錯過 「CERTIFICATE」

或者用awk:

awk '/----END CERTIFICATE-----/ {pr=0;} 
    pr==1 {print} 
    /----BEGIN CERTIFICATE-----/ {pr=1;}' inputfile