cURL의 출력을 grep하는 방법은 무엇입니까?


70

SSL 인증서의 만료 날짜를 검색해야합니다. curl응용 프로그램은이 정보를 제공한다 :

$ curl -v https://google.com/
* Hostname was NOT found in DNS cache
*   Trying 212.179.180.121...
* Connected to google.com (212.179.180.121) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using ECDHE-ECDSA-AES128-GCM-SHA256
* Server certificate:
*        subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=*.google.com
*        start date: 2014-10-22 13:04:07 GMT
*        expire date: 2015-01-20 00:00:00 GMT
*        subjectAltName: google.com matched
*        issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*        SSL certificate verify ok.
> GET / HTTP/1.1
> User-Agent: curl/7.35.0
> Host: google.com
> Accept: */*
> 
< HTTP/1.1 302 Found
< Cache-Control: private
< Content-Type: text/html; charset=UTF-8
< Location: https://www.google.co.il/?gfe_rd=cr&ei=HkxbVMzCM-WkiAbU6YCoCg
< Content-Length: 262
< Date: Thu, 06 Nov 2014 10:23:26 GMT
* Server GFE/2.0 is not blacklisted
< Server: GFE/2.0
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="https://www.google.co.il/?gfe_rd=cr&amp;ei=HkxbVMzCM-WkiAbU6YCoCg">here</A>.
</BODY></HTML>
* Connection #0 to host google.com left intact

그러나,을 통해 출력을 파이프하면 grep결과 것은 아니다 아니라 화면에 대한 정보는하지만, 훨씬 더 :

$ curl -v https://google.com/ | grep expire
* Hostname was NOT found in DNS cache
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 212.179.180.84...
* Connected to google.com (212.179.180.84) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
} [data not shown]
* SSLv3, TLS handshake, Server hello (2):
{ [data not shown]
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* SSLv3, TLS handshake, CERT (11):
{ [data not shown]
* SSLv3, TLS handshake, Server key exchange (12):
{ [data not shown]
* SSLv3, TLS handshake, Server finished (14):
{ [data not shown]
* SSLv3, TLS handshake, Client key exchange (16):
} [data not shown]
* SSLv3, TLS change cipher, Client hello (1):
} [data not shown]
* SSLv3, TLS handshake, Finished (20):
} [data not shown]
* SSLv3, TLS change cipher, Client hello (1):
{ [data not shown]
* SSLv3, TLS handshake, Finished (20):
{ [data not shown]
* SSL connection using ECDHE-ECDSA-AES128-GCM-SHA256
* Server certificate:
*        subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=*.google.com
*        start date: 2014-10-22 13:04:07 GMT
*        expire date: 2015-01-20 00:00:00 GMT
*        subjectAltName: google.com matched
*        issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*        SSL certificate verify ok.
> GET / HTTP/1.1
> User-Agent: curl/7.35.0
> Host: google.com
> Accept: */*
> 
< HTTP/1.1 302 Found
< Cache-Control: private
< Content-Type: text/html; charset=UTF-8
< Location: https://www.google.co.il/?gfe_rd=cr&ei=IkxbVMy4K4OBbKuDgKgF
< Content-Length: 260
< Date: Thu, 06 Nov 2014 10:23:30 GMT
* Server GFE/2.0 is not blacklisted
< Server: GFE/2.0
< 
{ [data not shown]
100   260  100   260    0     0    714      0 --:--:-- --:--:-- --:--:--   714
* Connection #0 to host google.com left intact

I는 의심curl그것이 단말기에 인쇄되지 않는 것을 검출하고있다 따라서 인식하지 모두 다른 출력 준다 grep로서 존재 stdout하므로 단말기에 전달된다. 그러나, 나는 찾을 수있는이에 가장 가까운 것은 man curl (! 이제까지 그것을 위해 구글하지 않음) 이 있습니다 :

PROGRESS METER
   curl  normally  displays  a  progress meter during operations, indicating the amount of transferred data, transfer speeds and estimated time
   left, etc.

   curl displays this data to the terminal by default, so if you invoke curl to do an operation and it is about to write data to the  terminal,
   it disables the progress meter as otherwise it would mess up the output mixing progress meter and response data.

   If you want a progress meter for HTTP POST or PUT requests, you need to redirect the response output to a file, using shell redirect (>), -o
   [file] or similar.

   It is not the same case for FTP upload as that operation does not spit out any response data to the terminal.

   If you prefer a progress "bar" instead of the regular meter, -# is your friend.

출력 에서 expiry라인을 어떻게 얻을 수 curl있습니까? 또한 상황을 더 잘 이해하려면 무엇을 읽고 있어야합니까?

"stdmeta"파일 디스크립터 의 좋은 사용 사례 인 것 같습니다 .



@EladKarako : 감사합니다. 좋은 답변이지만이 상황에는 적용 할 수 없습니다. 아마도 Windows 쉘에는 별도의 출력 파일 핸들러 개념이 없지만 Linux 쉘에서는 다른 경우입니다.
dotancohen

1
나는 바람에주의를 기울여야하고 구글 맨 컬을 강요 당한다고 느낀다. 나는 그것이 가치있는 결과를 반환해야한다고 확신합니다.
JeremyCanfield

답변:


105

curl은 출력을 stderr에 기록하므로 리디렉션하고 진행 상황을 억제하십시오.

curl -v --silent https://google.com/ 2>&1 | grep expire

curlstderr에 정보를 쓰는 이유 는 다음과 같습니다.
curl <url> | someprgram정보가 입력을 방해하지 않으면 서someprogram


2
-v verbose의 속임수를 .. thanks
astroanu

2
-v당신은 많은 텍스트를 파이프 할 필요가 없습니다 . 특히 여러 리디렉션 및 SSL 핸드 셰이크 및 인증서 교환에 !! 당신이 중 하나를 사용해야 --include만 응답의 몸에 헤더를 추가하거나 더 나은 아직 사용 --head도, 당신은 더 나은를 제거, \r당신은 변수에 값을 저장하거나 나중에 출력을 보낼 계획하는 경우 참조 (마지막에 내 위의 설명과 함께 Content-Length예)

19

--stderr -stderr (기본값)에서 stdout으로 출력을 경로 재 지정 하기 위해 매개 변수 로 사용할 수 있습니다 . 이 옵션을 사용 --silent하면 진행률 표시 줄을 억제하는 데 사용해야 합니다.

$ curl -v --silent https://google.com/ --stderr - | grep expire
*    expire date: 2015-09-01 00:00:00 GMT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.