Làm thế nào để grep đầu ra của cURL?


70

Tôi cần truy xuất ngày hết hạn của chứng chỉ SSL. Các curlứng dụng không cung cấp thông tin này:

$ 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

Tuy nhiên, khi đường ống đầu ra qua grepkết quả không phải là ít thông tin trên màn hình, mà là nhiều hơn nữa :

$ 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

Tôi nghi ngờ rằng curlphát hiện ra rằng nó không in ra thiết bị đầu cuối và do đó cung cấp đầu ra khác nhau, không phải tất cả đều được công nhận greplà hiện hữu stdoutvà do đó được chuyển qua thiết bị đầu cuối. Tuy nhiên, thứ gần nhất mà tôi có thể tìm thấy man curl (đừng bao giờ google cho điều đó!) Là:

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.

Làm thế nào tôi có thể chỉ nhận được expirydòng ra khỏi curlđầu ra? Hơn nữa, tôi nên đọc gì để hiểu rõ hơn về tình hình?

Có vẻ như đây sẽ là một trường hợp sử dụng tốt cho một mô tả tập tin "stdmeta" .



@EladKarako: Cảm ơn bạn. Đó là một câu trả lời hay, nhưng nó không áp dụng cho tình huống này. Có lẽ trình bao Windows không có khái niệm về trình xử lý tệp đầu ra riêng biệt, nhưng đây là trường hợp khác trong trình bao Linux.
dotancohen

1
Tôi cảm thấy buộc phải thận trọng với gió và người đàn ông Google cuộn tròn. Tôi chắc chắn rằng sẽ buộc phải trả lại một số kết quả đáng giá.
JeremyCanfield

Câu trả lời:


105

curl ghi đầu ra vào stderr, do đó chuyển hướng đó và cũng ngăn chặn tiến trình:

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

Lý do tại sao curlghi thông tin vào stderr là để bạn có thể làm:
curl <url> | someprgramkhông có thông tin đó làm tắc nghẽn đầu vào củasomeprogram


2
-v thực hiện thủ thuật verbose .. cảm ơn
astroanu

2
không cần -vbạn sẽ chuyển khá nhiều văn bản .. đặc biệt là trên nhiều chuyển hướng và bắt tay SSL và trao đổi chứng chỉ !! bạn nên sử dụng hoặc --includechỉ thêm các tiêu đề vào phần thân của phản hồi hoặc tốt hơn là sử dụng --head, ngoài ra, bạn nên loại bỏ \rphần cuối nếu bạn dự định lưu trữ giá trị trong một biến hoặc thậm chí gửi nó đến đầu ra sau này (xem phần của tôi bình luận ở trên với Content-Lengthví dụ)

19

Có thể sử dụng --stderr -làm tham số, để chuyển hướng đầu ra từ stderr (mặc định) sang thiết bị xuất chuẩn. Với tùy chọn này, bạn cũng nên sử dụng --silentđể chặn thanh tiến trình.

$ curl -v --silent https://google.com/ --stderr - | grep expire
*    expire date: 2015-09-01 00:00:00 GMT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.