Làm cách nào để có được (chỉ) trạng thái http của trang web trong tập lệnh shell?


13

Tôi hình curl sẽ làm công việc. Tôi đã viết trong một kịch bản:

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

Vấn đề ở đây là bất kể tôi làm gì tôi cũng không thể khiến nó dừng in dưới đây để xuất bản:

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

Tôi muốn một cronjob chạy tập lệnh này và nếu nó viết một tin nhắn như vậy thì mỗi lần tôi chạy nó tôi sẽ nhận được email vì một cái gì đó đã được in ra thiết bị xuất chuẩn trong cron, mặc dù trang web có thể ổn.

Làm cách nào để có được mã trạng thái mà không bị rác vào thiết bị xuất chuẩn? Mã này hoạt động ngoại trừ rác thưởng cho thiết bị xuất chuẩn ngăn tôi sử dụng nó.

Câu trả lời:


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

Vì vậy, độ phân giải của bạn sẽ giống như

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

Kết quả là Error 301 on google.com, ví dụ.


Cảm ơn bạn! điều này làm tôi thất vọng rất nhiều (và họ nên đề cập đến vấn đề này dưới "thước đo tiến độ" trong trang man)

10

bạn muốn

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

Điều đó sẽ cung cấp cho bạn mã HTTP_STATUS làm đầu ra duy nhất.


2

Tôi sẽ làm như thế này để đảm bảo tôi được chuyển hướng đến máy chủ cuối cùng và nhận được phản hồi từ nó:

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

2

Sử dụng điều này như điều kiện của bạ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

như đã chỉ ra ở trên curl có thể cung cấp phản hồi 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

Ví dụ 1 với -schúng tôi làm im lặng tiến trình & -o /dev/nullcho phép chúng tôi bỏ qua phản hồi nhưng -wlà đồng minh của bạn ở đây:

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

Điều này có thể được đơn giản hóa hơn nữa theo cách tự nhiên bằng cách yêu cầu url_effective và 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

Ví dụ 2 chúng tôi thấy phản hồi http ban đầu của chúng tôi, các miền được yêu cầu ban đầu và chuyển hướng máy chủ đã trả lời:

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

Tuy nhiên, nếu cuối cùng bạn đang tìm cách thiết lập phản hồi 200 ngay cả sau khi chuyển hướng 301 hoặc 302: Sau đó, bạn có thể và bỏ 'redirect_url' đã nói ở trên

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

Ví dụ 3 chúng tôi thêm -Lhướng dẫn curl để theo đuổi (các) chuyển hướng:

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

Chào mừng đến với U & L. Câu đầu tiên của bạn nói "như được chỉ ra ở trên" gây nhầm lẫn vì vị trí câu trả lời của bạn phụ thuộc vào phiếu bầu và cài đặt người dùng. Tốt hơn là sử dụng một số dòng "Như @some_user đã chỉ ra ở trên" (với some_usertên thật) hoặc "Như những người khác đã chỉ ra"
Anthon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.