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.

Jeff Schaller
sumber

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.

ДМИТРИЙ МАЛИКОВ
sumber
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.

Tim Kennedy
sumber
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]}
nicerobot
sumber
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
UNIXMAN
sumber
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/
Petunjuk Kiri Di dalam
sumber
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