Bir kabuk betiğindeki bir sitenin http durumunu (yalnızca) nasıl edinebilirim?


13

Curl'un işi yapacağını düşünüyorum. Bir senaryoda yazdım:

#!/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

Burada sorun ne olursa olsun, stdout için aşağıdaki yazdırmayı durduramıyorum:

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

Bu komut dosyasını çalıştırmak için bir cronjob istiyorum ve böyle bir mesaj yazıyorsa, o zaman her çalıştırdığımda, bir şey cron içinde stdout'a basılmış olduğu için bir e-posta alırım, ancak site iyi olabilir.

Stdout'a önemsiz girmeden durum kodunu nasıl alabilirim? Bu kod, stdout'a bonus önemsiz dışında onu kullanmamı engeller.

Yanıtlar:


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

Yani resiniz şöyle görünmeli

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

Sonuç, Error 301 on google.comörneğin.


Teşekkür ederim! bu beni çok kızdırdı. (ve bunu man sayfasındaki "ilerleme ölçer" altında belirtmelidirler)

10

İstediğiniz

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

Bu size tek çıktı olarak HTTP_STATUS kodunu verecektir.


2

Ben son ana bilgisayara yönlendirilir ve ondan yanıt almak için bunu yapmak istiyorum:

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

2

Bunu sizin durumunuz olarak kullanın ...

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

Yukarıda belirtildiği gibi kıvırmak doğal olarak http yanıtı sağlayabilir:

#!/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

Örnek 1 -s, ilerlemeyi -o /dev/nullsusturuyoruz ve yanıtı çöpe atmamıza izin veriyor, ancak -wmüttefikiniz burada:

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

Bu, url_effective ve redirect_url öğelerini sorarak kıvrımda yerel olarak daha da basitleştirilebilir:

#!/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

Örnek 2, ilk http yanıtımızı, istenen orijinal alan adlarını görüyoruz ve sunucunun yanıt verdiği yönlendirmeyi görüyoruz:

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

Ancak sonuçta 301 veya 302 yönlendirmesinden sonra bile 200 yanıt oluşturmak istiyorsanız: O zaman yukarıda belirtilen 'redirect_url'

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

Örnek 3, -Lhangi yönlendirmeleri yönlendirmek için kıvrılma talimatı ekledik:

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

U & L'ye hoş geldiniz. İlk cümleniz, cevabınızın konumu oylara ve kullanıcı ayarlarına bağlı olduğu için "yukarıda belirtildiği gibi" belirtmektedir. Bazı satır "some_user yukarıda belirtildiği gibi" ( some_usergerçek bir adla) veya "Diğerleri belirttiği gibi" kullanmak daha iyidir
Anthon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.