Jak wyświetlić nagłówki żądań z zawinięciem wiersza poleceń

567

Zwijanie wiersza poleceń może wyświetlać nagłówek odpowiedzi za pomocą -Dopcji, ale chcę zobaczyć, jaki nagłówek żądania wysyła. Jak mogę to zrobić?

wwwxml
źródło
28
curl --head http://google.comzrobi to samo co -Iflaga :)
Abel Terefe
9
Uwaga na temat używania --head/ -I: nie wszystkie serwery odpowiadają dokładnie tak samo na HEADżądania (na przykład Content-Encodingbyłyby brakujące, gdybyś próbował sprawdzić, czy treść zostanie zgipowana) i nie wszystkie serwery obsługują HEAD. -vjest zwykle bezpieczniejszym wyborem.
cfeduke

Odpowiedzi:

751

curl -vlub --verboseopcja pokazuje między innymi nagłówki żądania HTTP. Oto kilka przykładowych danych wyjściowych:

$ curl -v http://google.com/
* About to connect() to google.com port 80 (#0)
*   Trying 66.102.7.104... connected
* Connected to google.com (66.102.7.104) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.16.4 (i386-apple-darwin9.0) libcurl/7.16.4 OpenSSL/0.9.7l zlib/1.2.3
> Host: google.com
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.com/
< Content-Type: text/html; charset=UTF-8
< Date: Thu, 15 Jul 2010 06:06:52 GMT
< Expires: Sat, 14 Aug 2010 06:06:52 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 219
< X-XSS-Protection: 1; mode=block
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to host google.com left intact
* Closing connection #0
Asaf
źródło
6
Co jeśli chcę po prostu zbudować pakiet, ale nie chcę go wysłać?
PuercoPop,
@jobsobsimeon Myślę, że to dlatego, że pokazuje nie tylko nagłówki żądania, ale także nagłówki odpowiedzi i treść odpowiedzi .
Pmpr
234

Popularna odpowiedź do wyświetlania nagłówków odpowiedzi , ale OP zapytał o nagłówki żądań .

curl -s -D - -o /dev/null http://example.com
  • -s : Unikaj pokazywania paska postępu
  • -D -: Zrzuca nagłówki do pliku, ale -wysyła go do standardowego wyjścia
  • -o /dev/null : Zignoruj ​​treść odpowiedzi

Jest to lepsze niż -Iponieważ nie wysyła HEADżądania, które może dawać różne wyniki.

Jest to lepsze niż -vdlatego, że nie potrzebujesz tylu hacków, aby je rozwikłać.

JaffaTheCake
źródło
17
Przeczytaj pytanie - dotyczy nagłówków odpowiedzi, a nie nagłówków zapytań
Graeme Stuart,
56
Ta odpowiedź jest dla mnie przydatna, ponieważ również źle odczytałem pytanie.
Liam
2
To polecenie jest nieco inne w systemie Windows: curl -sD - -o NULL http://example.com
Siergiej Własow
2
@SergeyVlasov W rzeczywistości odpowiednikiem /dev/nullw systemie Windows nulnie jest null.
Francisco Zarabozo,
2
Chociaż pytanie to wymaga nagłówków żądań, Google kieruje wszystkich tutaj, którzy szukają nagłówków odpowiedzi, więc wszyscy cieszymy się, że ta odpowiedź jest tutaj. Ta odpowiedź jest najlepsza do uzyskiwania nagłówków odpowiedzi. Dzięki!!!
biomiker
96

Wierzę, że przełącznik wiersza poleceń, który chcesz przekazać do zwijania, to -I.

Przykładowe użycie:

$ curl -I http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287  
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:05 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

Ponadto, jeśli napotkasz kod stanu odpowiedzi HTTP o wartości 301, możesz również przekazać -Lprzełącznik argumentów, aby nakazał curlśledzenie przekierowań adresów URL, i w tym przypadku wydrukuj nagłówki wszystkich stron (w tym przekierowań adresów URL), jak pokazano poniżej :

$ curl -I -L http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 302 Found
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Set-Cookie: UID=b8c37e33defde51cf91e1e03e51657da
Location: noaccess.php
Content-Type: text/html

HTTP/1.1 200 OK
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Content-Type: text/html
evandrix
źródło
38
-IOpcja pokazuje reakcji nagłówków. Pytanie dotyczyło nagłówków żądania .
Asaph,
53
Te -Iopcje przyczyny zwijają się zrobić HTTP HEAD, co mogłoby zmienić odpowiedzi z serwera. -vUważam, że lepiej użyć przełącznika.
acw
1
Jeśli spróbujesz tego z czymkolwiek innym niż HEADprośba (np. -X POST) I otrzymasz komunikat „Możesz wybrać tylko jedno żądanie HTTP!” niż stackoverflow.com/questions/286982/... prawdopodobnie Ci pomoże. Chodzi o to, że -Iwykonuje HEADżądanie, jak acwpodano, a kiedy twoje curlpołączenie zostało skonfigurowane do wykonania innego połączenia, masz dwa żądania HTTP w curlpołączeniu ...
grypa
7
To bardzo zła odpowiedź. (Obiecuję, że jestem tu zazwyczaj bardzo uprzejmy.) 1. Robi to przeciwieństwo tego, o co prosi OP. 2. Używa metody żądania HEADzamiast GETlub POST. 3. NIGDY nie należy go używać do „tylko wyświetlania nagłówków”, chyba że próbujesz zobaczyć, w jaki sposób Twój serwer reaguje inaczej na „a” HEADna „a” GET. Przez większość czasu będzie tak samo, ale nie zawsze. Aby zobaczyć tylko nagłówki, użyj curl -o /dev/null -D /dev/stdout. To da oczekiwane rezultaty w 100% przypadków.
Bruno Bronosky
79

Opcja verbose jest przydatna, ale jeśli chcesz zobaczyć wszystko , co robi curl (w tym przesyłane treści HTTP, a nie tylko nagłówki), sugeruję użycie jednej z poniższych opcji:

  • --trace-ascii - # standardowe
  • --trace-ascii output_file.txt # plik
William Denniss
źródło
Nie sądzę, ponieważ pokazuje nagłówki odpowiedzi i treść!
Pmpr
56

Otrzymujesz ładny wynik w nagłówku za pomocą następującego polecenia:

 curl -L -v -s -o /dev/null google.de
  • -L, --location śledź przekierowania
  • -v, --verbose większa wydajność wskazuje kierunek
  • -s, --silent nie pokazuj paska postępu
  • -o, --output /dev/null nie pokazuj otrzymanego ciała

Lub krótsza wersja:

 curl -Lvso /dev/null google.de

Prowadzi do:

* Rebuilt URL to: google.de/
*   Trying 2a00:1450:4008:802::2003...
* Connected to google.de (2a00:1450:4008:802::2003) port 80 (#0)
> GET / HTTP/1.1
> Host: google.de
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.de/
< Content-Type: text/html; charset=UTF-8
< Date: Fri, 12 Aug 2016 15:45:36 GMT
< Expires: Sun, 11 Sep 2016 15:45:36 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 218
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
<
* Ignoring the response-body
{ [218 bytes data]
* Connection #0 to host google.de left intact
* Issue another request to this URL: 'http://www.google.de/'
*   Trying 2a00:1450:4008:800::2003...
* Connected to www.google.de (2a00:1450:4008:800::2003) port 80 (#1)
> GET / HTTP/1.1
> Host: www.google.de
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 12 Aug 2016 15:45:36 GMT
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=ISO-8859-1
< P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."
< Server: gws
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< Set-Cookie: NID=84=Z0WT_INFoDbf_0FIe_uHqzL9mf3DMSQs0mHyTEDAQOGY2sOrQaKVgN2domEw8frXvo4I3x3QVLqCH340HME3t1-6gNu8R-ArecuaneSURXNxSXYMhW2kBIE8Duty-_w7; expires=Sat, 11-Feb-2017 15:45:36 GMT; path=/; domain=.google.de; HttpOnly
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
<
{ [11080 bytes data]
* Connection #1 to host www.google.de left intact

Jak widać, curlzarówno nagłówki wychodzące, jak i przychodzące, pomija dane body, chociaż mówi, jak duże jest ciało.

Dodatkowo dla każdej linii wskazany jest kierunek, aby był łatwy do odczytania. Uważam, że szczególnie przydatne jest śledzenie długich łańcuchów przekierowań.

Benibr
źródło
4
Podoba mi się to bardziej niż -vopcja z większymi głosami. Również dla zwięzłości może to być curl -Lvso /dev/null <target>tak długo, jak oprzyjdzie koniec.
wrzask
12

Polecenie takie jak poniższe wyświetli trzy sekcje: nagłówki żądania, nagłówki odpowiedzi i dane (oddzielone przez CRLF). Pozwala to uniknąć informacji technicznych i hałasu syntaktycznego dodawanego przez zwijanie.

curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'

Polecenie wygeneruje następujące dane wyjściowe:

GET / HTTP/1.1
Host: www.stackoverflow.com
User-Agent: curl/7.54.0
Accept: */*

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://stackoverflow.com/
Content-Length: 149
Accept-Ranges: bytes
Date: Wed, 16 Jan 2019 20:28:56 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-bma1622-BMA
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1547670537.588756,VS0,VE105
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Set-Cookie: prov=e4b211f7-ae13-dad3-9720-167742a5dff8; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly

<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="https://stackoverflow.com/">here</a></body>

Opis:

  • -vs - dodaj nagłówki (-v), ale usuń pasek postępu (-s)
  • 2>&1 - połącz stdout i stderr w jedno stdout
  • sed - edytuj odpowiedź wygenerowaną przez curl przy użyciu poniższych poleceń
  • /^* /d - usuń wiersze zaczynające się od „*” (informacje techniczne)
  • /bytes data]$/d - usuń wiersze kończące się na „bajty danych]” (informacje techniczne)
  • s/> // - usuń prefiks „>”
  • s/< // - usuń prefiks „<”
Igorpcholkin
źródło
7

Sam musiałem rozwiązać ten problem podczas debugowania aplikacji internetowych. -vjest świetne, ale jak na moje gusta trochę za szczegółowe. Oto rozwiązanie (tylko bash), które wymyśliłem:

curl -v http://example.com/ 2> >(sed '/^*/d')

Działa to, ponieważ dane wyjściowe -vsą wysyłane do stderr, a nie do standardowego wyjścia . Przekierowując to do podpowłoki, możemy sedusunąć linie zaczynające się od *. Ponieważ rzeczywiste wyjście nie przechodzi przez podpowłokę, nie ma to wpływu. Korzystanie z podpowłoki jest trochę trudne, ale jest to najprostszy sposób przekierowania stderr na inne polecenie. (Jak zauważyłem, używam tego tylko do testowania, więc działa dla mnie dobrze).

jpfx1342
źródło
4

opcja -v dla curl jest zbyt szczegółowa w wyniku błędu, który zawiera wiodące *(linia statusu) lub >(pole nagłówka żądania) lub <(pole nagłówka odpowiedzi). aby uzyskać tylko pole nagłówka żądania:

curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '>' | cut -c1-2 --complement

aby uzyskać tylko pole nagłówka żądania:

curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '<' | cut -c1-2 --complement

lub zrzucić go do /tmp/test.txtpliku z opcją -D

curl -D /tmp/test.txt -sS www.stackoverflow.com > /dev/null

w celu filtrowania danych -vwyjściowych należy skierować wyjście błędu do terminala, a wyjście standardowe do / dev / null, opcja -s zabrania pomiaru postępu

toolchainX
źródło
1

Jeśli chcesz uzyskać więcej alternatyw, możesz spróbować zainstalować klienta HTTP Modern wiersza poleceń, takiego jak httpie który jest dostępny dla większości systemów operacyjnych z menedżerami pakietów, takimi jak brew, apt-get, pip, yum itp.

np .: - Dla OSX

brew install httpie

Następnie możesz użyć go w wierszu poleceń z różnymi opcjami

http GET https://www.google.com

wprowadź opis zdjęcia tutaj

Sudharshan
źródło