ฉันจะรับสถานะ http ของไซต์ในเชลล์สคริปต์ได้อย่างไร


13

ฉันคิดว่าขดจะทำงาน ฉันเขียนในสคริปต์:

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

ปัญหาที่นี่ไม่ว่าฉันจะทำอะไรฉันไม่สามารถหยุดพิมพ์ด้านล่างเพื่อ stdout:

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

ฉันต้องการ cronjob เพื่อเรียกใช้สคริปต์นี้และถ้ามันเขียนข้อความเช่นนั้นทุกครั้งที่ฉันเรียกใช้มันฉันจะได้รับอีเมลเพราะมีบางสิ่งที่พิมพ์ไปยัง stdout ใน cron แม้ว่าไซต์นั้นอาจจะใช้ได้

ฉันจะรับรหัสสถานะโดยไม่ทำให้ขยะกลายเป็น stdout ได้อย่างไร รหัสนี้ใช้งานได้ยกเว้นโบนัสขยะที่ stdout ทำให้ฉันไม่สามารถใช้งานได้

คำตอบ:


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

ดังนั้นความละเอียดของคุณควรดูเหมือน

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

ผลลัพธ์คือError 301 on google.comตัวอย่าง


ขอขอบคุณ! สิ่งนี้ทำให้ฉันรำคาญมาก (และพวกเขาควรพูดถึงสิ่งนี้ภายใต้ "มิเตอร์วัดความคืบหน้า" ในหน้า man)


2

ฉันต้องการทำเช่นนี้เพื่อให้แน่ใจว่าฉันถูกเปลี่ยนเส้นทางไปยังโฮสต์สุดท้ายและรับการตอบกลับจากมัน:

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

2

ใช้สิ่งนี้เป็นเงื่อนไขของคุณ ...

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

ตามที่ระบุไว้ข้างต้น curl สามารถให้การตอบสนอง 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

ตัวอย่างที่ 1 กับ-sเราเงียบความคืบหน้า & -o /dev/nullช่วยให้เราทิ้งการตอบสนอง แต่-wเป็นพันธมิตรของคุณที่นี่:

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

สิ่งนี้สามารถลดความซับซ้อนของภาษาได้โดยการขอ url_effective และ 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

ตัวอย่างที่ 2 เราเห็นการตอบกลับ http เริ่มต้นโดเมนที่ร้องขอดั้งเดิมและเปลี่ยนเส้นทางเซิร์ฟเวอร์ที่ตอบกลับด้วย:

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

อย่างไรก็ตามหากคุณต้องการสร้างการตอบกลับ 200 ครั้งในที่สุดแม้หลังจากการเปลี่ยนเส้นทาง 301 หรือ 302: จากนั้นคุณสามารถและวาง '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

ตัวอย่างที่ 3 เราเพิ่ม-Lที่แนะนำให้ curl ไล่ล่าการเปลี่ยนเส้นทาง:

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

ยินดีต้อนรับสู่ U&L ประโยคแรกของคุณระบุว่า "ดังที่ได้กล่าวไว้ข้างต้น" ซึ่งทำให้สับสนเนื่องจากตำแหน่งของคำตอบของคุณนั้นขึ้นอยู่กับคะแนนโหวตและการตั้งค่าของผู้ใช้ มันเป็นการดีกว่าที่จะใช้บางบรรทัด "ตามที่ @some_user ชี้ไปที่ด้านบน" (โดยsome_userใช้ชื่อจริง) หรือ "ตามที่คนอื่น ๆ ได้ชี้ให้เห็น"
Anthon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.