Bagaimana saya mendapatkan (hanya) status http dari sebuah situs dalam skrip shell?


13

Saya pikir ikal akan melakukan pekerjaan itu. Saya menulis dalam sebuah skrip:

#!/bin/sh

function test {
    res=`curl -I $1 | grep HTTP/1.1 | awk {'print $2'}`
    if [ $res -ne 200 ]
    then
        echo "Error $res on $1"
    fi
}  

test mysite.com
test google.com

Masalahnya di sini adalah apa pun yang saya lakukan, saya tidak bisa menghentikannya untuk mencetak di bawah ini ke stdout:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

Saya ingin cronjob menjalankan skrip ini dan jika ia menulis pesan seperti itu maka setiap kali saya menjalankannya saya akan mendapatkan email karena sesuatu telah dicetak ke stdout di cron, walaupun situsnya mungkin baik-baik saja.

Bagaimana cara mendapatkan kode status tanpa sampah ke stdout? Kode ini berfungsi kecuali bonus sampah ke stdout yang mencegah saya menggunakannya.

Jawaban:


12
   -s/--silent
          Silent or quiet mode. Don't show progress meter 
          or error messages.  Makes Curl mute.

Jadi res Anda akan terlihat seperti

res=`curl -s -I $1 | grep HTTP/1.1 | awk {'print $2'}`

Hasilnya Error 301 on google.com, misalnya.


Terima kasih! ini sangat membuatku marah. (dan mereka harus menyebutkan ini di bawah "meteran kemajuan" di halaman manual)

10

kamu ingin

...
res=$( curl -w %{http_code} -s --output /dev/null $1)
...

Itu akan memberi Anda kode HTTP_STATUS sebagai satu-satunya hasil.


2

Saya akan melakukannya seperti ini untuk memastikan saya dialihkan ke host terakhir dan mendapatkan respons dari itu:

res=($(curl -sLI "${1}" | grep '^HTTP/1' | tail -1))
((res[1] == 200)) || echo ${res[2]}

2

Gunakan ini sebagai kondisi Anda ...

res=`curl -s --head <URL> | head -n 1 | grep -c HTTP/1.1 200 OK`

if [ $res -eq 1 ]
then
MSG = " OKAY"
EXIT_CODE = 0
else
MSG = " NOT OKAY"
EXIT_CODE = 2
fi

1

seperti yang ditunjukkan di atas ikal asli dapat memberikan respons http:

#!/bin/bash
#example1.sh
function test {
  RESPONSE=$(curl -so /dev/null -w "%{http_code}\n" ${1})
  if [[ $RESPONSE != 200 ]]; then
    echo "Error ${RESPONSE} on ${1}"
  fi
}    
test mysite.com
test google.com

Contoh 1 dengan -skami membungkam kemajuan & -o /dev/nullmembiarkan kami membuang respons tetapi -wsekutu Anda di sini:

$ ./example1.sh 
Error 000 on mysite.com
Error 301 on google.com

Ini dapat disederhanakan lebih lanjut secara native di curl dengan meminta url_effective dan redirect_url:

#!/bin/bash
#example2.sh
function test {
  curl -so /dev/null -w "%{http_code}\t%{url_effective}\t%{redirect_url}\n" ${1}
}  
test mysite.com
test google.com

Contoh 2 kita melihat respons http awal kami, domain yang diminta asli, dan mengarahkan server merespons dengan:

$ ./example2.sh 
000 HTTP://mysite.com/  
301 HTTP://google.com/  http://www.google.com/

Namun jika Anda pada akhirnya ingin membangun 200 tanggapan bahkan setelah pengalihan 301 atau 302: Maka Anda dapat dan menghapus 'redirect_url' yang disebutkan di atas.

#!/bin/bash
#example3.sh
function test {
  curl -sLo /dev/null -w "%{http_code}\t%{url_effective}\n" ${1}
}  
test mysite.com
test google.com

Contoh 3 kita tambahkan -Lyang menginstruksikan curl untuk mengejar redirect:

$ ./example3.sh 
000 HTTP://mysite.com/
200 http://www.google.com/

Selamat datang di U&L. Kalimat pertama Anda menyatakan "sebagaimana ditunjukkan di atas" yang membingungkan karena posisi jawaban Anda bergantung pada suara dan pengaturan pengguna. Lebih baik menggunakan beberapa baris "Seperti yang ditunjukkan @some_user di atas" (dengan some_usernama sebenarnya) atau "Seperti yang ditunjukkan orang lain"
Anthon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.