Cara menampilkan header permintaan dengan ikal baris perintah

568

Ikal baris perintah dapat menampilkan tajuk respons dengan menggunakan -Dopsi, tetapi saya ingin melihat tajuk permintaan apa yang dikirimkannya. Bagaimana saya bisa melakukan itu?

wwwxml
sumber
28
curl --head http://google.comakan melakukan hal yang sama seperti -Ibendera :)
Abel Terefe
9
Catatan tentang penggunaan --head/ -I: tidak semua server merespons HEADpermintaan yang sama persis (misalnya, Content-Encodingakan hilang jika Anda mencoba memverifikasi bahwa badan akan di-gzip) dan tidak semua server mendukung HEAD. -vbiasanya merupakan pilihan yang lebih aman.
cfeduke

Jawaban:

752

ikal -vatau --verboseopsi menunjukkan header permintaan HTTP, antara lain. Berikut adalah beberapa contoh keluaran:

$ 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
sumber
6
Bagaimana jika saya hanya ingin membangun paket tetapi tidak ingin mengirimnya?
PuercoPop
@ jacobsimeon Saya pikir itu karena tidak hanya menampilkan header Permintaan tetapi juga kepala Respons dan badan Respons .
Pmpr
235

Jawaban populer untuk menampilkan header respons , tetapi OP bertanya tentang header permintaan .

curl -s -D - -o /dev/null http://example.com
  • -s : Hindari menampilkan bilah kemajuan
  • -D -: Dump header ke file, tetapi -mengirimkannya ke stdout
  • -o /dev/null : Abaikan badan respons

Ini lebih baik daripada -Ikarena tidak mengirim HEADpermintaan, yang dapat menghasilkan hasil yang berbeda.

Ini lebih baik daripada -vkarena Anda tidak perlu begitu banyak peretasan untuk membatalkannya.

Kue
sumber
17
Baca pertanyaannya - ini untuk header respons, bukan header permintaan
Graeme Stuart
58
Jawaban ini berguna bagi saya karena saya juga salah membaca pertanyaan.
Liam
2
Perintah ini agak berbeda untuk Windows: curl -sD - -o NULL http://example.com
Sergey Vlasov
2
@SergeyVlasov Sebenarnya, setara dengan /dev/nulldi Windows nul, tidak null.
Francisco Zarabozo
2
Meskipun pertanyaan ini menanyakan header permintaan, google mengarahkan semua orang di sini yang mencari header respons sehingga kami semua senang jawaban ini ada di sini. Dan jawaban ini adalah yang terbaik untuk mendapatkan header respons. Terima kasih!!!
biomiker
96

Saya percaya saklar baris perintah yang Anda cari untuk diteruskan ke ikal adalah -I .

Contoh penggunaan:

$ 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

Selain itu, jika Anda menjumpai kode status HTTP respons 301, Anda mungkin juga ingin meneruskan -Largumen untuk memberi tahu curluntuk mengikuti pengalihan URL, dan, dalam hal ini, cetak header semua halaman (termasuk pengalihan URL), diilustrasikan di bawah ini :

$ 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
sumber
38
The -Ipilihan menunjukkan respon header. Pertanyaannya adalah tentang header permintaan .
Asaf
53
The -Ipilihan penyebab meringkuk untuk melakukan HTTP HEAD, yang bisa mengubah respon dari server. Lebih baik menggunakan -vsaklar saya percaya.
acw
1
Jika Anda mencoba ini dengan hal lain selain HEADpermintaan (seperti -X POST) dan dapatkan "Anda hanya dapat memilih satu permintaan HTTP!" daripada stackoverflow.com/questions/286982/… mungkin akan membantu Anda. Masalahnya adalah bahwa -Imelakukan HEADpermintaan, seperti yang acwdinyatakan dan ketika curlpanggilan Anda diatur untuk melakukan panggilan lain, Anda memiliki dua permintaan HTTP dalam curlpanggilan ...
flu
7
Ini jawaban yang sangat salah. (Saya berjanji saya biasanya sangat baik di sini.) 1. Ia melakukan kebalikan dari apa yang diminta OP. 2. Menggunakan metode permintaan, HEADbukan GETatau POST. 3. Seharusnya TIDAK PERNAH digunakan untuk "hanya melihat header" kecuali Anda mencoba untuk melihat bagaimana server Anda merespons berbeda HEADsebagai lawan dari a GET. Sebagian besar waktu akan sama, tetapi tidak selalu. Hanya untuk melihat tajuk yang digunakan curl -o /dev/null -D /dev/stdout. Itu akan memberikan hasil yang diharapkan 100% dari waktu.
Bruno Bronosky
79

Opsi verbose berguna, tetapi jika Anda ingin melihat segala sesuatu yang dikeriting (termasuk badan HTTP yang dikirim, dan bukan hanya header), saya sarankan menggunakan salah satu opsi di bawah ini:

  • --trace-ascii - # stdout
  • --trace-ascii output_file.txt # file
William Denniss
sumber
Saya tidak berpikir begitu karena itu menunjukkan header & tubuh respons juga!
Pmpr
56

Anda mendapatkan hasil tajuk yang bagus dengan perintah berikut:

 curl -L -v -s -o /dev/null google.de
  • -L, --location ikuti arahan ulang
  • -v, --verbose lebih banyak output, menunjukkan arah
  • -s, --silent jangan tampilkan bilah kemajuan
  • -o, --output /dev/null jangan tampilkan tubuh yang diterima

Atau versi yang lebih pendek:

 curl -Lvso /dev/null google.de

Hasil dalam:

* 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

Seperti yang Anda lihat curloutput baik header keluar dan masuk dan melompati data tubuh meskipun memberitahu Anda seberapa besar tubuh.

Selain itu untuk setiap baris arah ditunjukkan sehingga mudah dibaca. Saya merasa berguna untuk melacak rantai pengalihan yang panjang.

Benibr
sumber
4
Saya suka ini lebih baik daripada -vopsi dengan suara lebih tinggi. Juga, hanya untuk singkatnya ini juga bisa curl -Lvso /dev/null <target>selama odatang di akhir.
pekik
12

Perintah seperti di bawah ini akan menampilkan tiga bagian: header permintaan, header respons, dan data (dipisahkan oleh CRLF). Ini menghindari informasi teknis dan kebisingan sintaksis yang ditambahkan oleh curl.

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

Perintah akan menghasilkan output berikut:

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>

Deskripsi:

  • -vs - tambahkan header (-v) tetapi hapus progress bar (-s)
  • 2>&1 - gabungkan stdout dan stderr menjadi stdout tunggal
  • sed - edit respons yang dihasilkan oleh curl menggunakan perintah di bawah ini
  • /^* /d - hapus baris yang dimulai dengan '*' (info teknis)
  • /bytes data]$/d - hapus baris yang diakhiri dengan 'data byte]' (info teknis)
  • s/> // - hapus awalan '>'
  • s/< // - hapus awalan '<'
igorpcholkin
sumber
7

Saya harus mengatasi masalah ini sendiri, ketika debugging aplikasi web. -vbagus, tapi agak terlalu bertele-tele untuk seleraku. Ini adalah solusi (khusus bash) yang saya buat:

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

Ini berfungsi karena output dari -vdikirim ke stderr, bukan stdout. Dengan mengarahkan ini ke subkulit, kita dapat sedmenghapus garis yang dimulai dengan *. Karena output nyata tidak melewati subkulit, itu tidak terpengaruh. Menggunakan subkulit agak berat, tapi itu cara termudah untuk mengarahkan stderr ke perintah lain. (Seperti yang saya catat, saya hanya menggunakan ini untuk pengujian, jadi itu berfungsi dengan baik untuk saya.)

jpfx1342
sumber
4

opsi -v untuk curl terlalu bertele-tele dalam output kesalahan yang berisi terkemuka *(baris status) atau >(bidang kepala permintaan) atau <(bidang kepala respons). untuk mendapatkan hanya bidang kepala permintaan:

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

untuk mendapatkan hanya bidang kepala permintaan:

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

atau untuk membuangnya ke /tmp/test.txtfile dengan opsi -D

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

untuk memfilter -voutput, Anda harus mengarahkan output error ke terminal dan output std ke / dev / null, opsi -s adalah untuk melarang metering progres

toolchainX
sumber
1

Jika Anda ingin lebih banyak alternatif, Anda dapat mencoba menginstal klien HTTP baris perintah Modern seperti httpie yang tersedia untuk sebagian besar Sistem Operasi dengan manajer paket seperti minuman, apt-get, pip, yum dll.

misal: - Untuk OSX

brew install httpie

Kemudian Anda dapat menggunakannya pada command line dengan berbagai opsi

http GET https://www.google.com

masukkan deskripsi gambar di sini

Sudharshan
sumber