2011-06-22 74 views
3

我有一個bash腳本來檢查url列表的HTTP狀態代碼,但我意識到有些顯示爲「200」,但實際顯示包含「錯誤404」的頁面。我該如何檢查?檢查URL是否轉到包含文本「404」的頁面

這裏是我當前的腳本:

#!/bin/bash 
while read LINE; do 
    curl -o /dev/null --silent --head --write-out '%{http_code}\n' "$LINE" 
done < url-list.txt 

(我是從一個先例的問題:script to get the HTTP status code of a list of urls ?

編輯似乎是在腳本中的錯誤:它返回「200」,但如果我wget -o log相同的地址我得到「404找不到」

+0

上面的腳本,應該工作正常。如果頁面不存在,並且網站沒有返回狀態代碼404,那麼您無法做太多的工作,或者至少您不能依賴此方法。 – c00kiemon5ter

回答

3

的樂趣 - 這裏是一個BASH的解決方案:

dosomething() { 
     code="$1"; url="$2" 
     case "$code" in 
       200) echo "OK for $url";; 
       302) echo "redir for $url";; 
       404) echo "notfound for $url";; 
       *) echo "other $code for $url";; 
     esac 
} 

#MAIN program 
while read url 
do 
     uri=($(echo "$url" | sed 's~http://\([^/][^/]*\)\(.*\)~\1 \2~')) 
     HOST=${uri[0]:=localhost} 
     FILE=${uri[1]:=/} 
     exec {SOCKET}<>/dev/tcp/$HOST/80 
     echo -ne "GET $FILE HTTP/1.1\nHost: $HOST\n\n" >&${SOCKET} 
     res=($(<&${SOCKET} sed '/^.$/,$d' | grep '^HTTP')) 
     dosomething ${res[1]} "$url" 
done << EOF 
http://stackoverflow.com 
http://stackoverflow.com/some/bad/url 
EOF 
+0

我得到一個語法錯誤:「(」unexpected「(expect」done「)uri = ... – Manu

+0

奇怪 - 你可能需要更新版本的bash,我有GNU bash,4.2 .0(1)-release(i386-apple-darwin10.7.0) - 和工作正常 – jm666

+0

GNU bash,版本4.2.8(1)-release(i686-pc-linux-gnu):D – Manu

1

那麼,你可以grok響應正文,並尋找「404」,「錯誤404」,「未找到」,「404未找到」等打印解放軍intext,但這很可能會導致假陰性和假陽性。儘管如果服務器發送了200個應該是404的應用程序,但有些人沒有做好他們的工作。

+0

「有人沒有做好自己的工作」告訴我有關它 – Manu

+0

我不認爲我會有很多誤報,我從一個域中檢查URL,並且所有404都包含相同的文本。 – Manu

+1

哦。然後,只需在響應正文中查找該循環的子字符串即可。你可以用幾行Perl來完成,或者如果你感覺幸運的話,只需grep 404並檢查返回值。如果你知道404s通常是100%相同的,你可以檢查響應長度標題(記住錯誤的邊界,你也介意檢查crc32)。如果身體足夠可預測,有很多方法可以做到這一點。 (我會去的Perl子字符串) – sapht