我必须检查200个http URL的状态,并找出其中哪些是断开的链接。链接存在于一个简单的文本文件中(比如我的〜文件夹中的URL.txt)。我正在使用Ubuntu 14.04,我是一个Linux新手。但我知道bash shell非常强大,可以帮助我实现我想要的。
我的确切要求是阅读包含URL列表的文本文件,并自动检查链接是否正常工作,并将响应写入包含URL及其相应状态(工作/损坏)的新文件。
答案 0 :(得分:15)
我创建了一个文件“checkurls.sh”并将其放在我的主目录中,其中urls.txt文件也位于该目录中。我使用
为文件赋予了执行权限 $chmod +x checkurls.sh
checkurls.sh的内容如下:
#!/bin/bash
while read url
do
urlstatus=$(curl -o /dev/null --silent --head --write-out '%{http_code}' "$url" )
echo "$url $urlstatus" >> urlstatus.txt
done < $1
最后,我使用以下命令从命令行执行它 -
$./checkurls.sh urls.txt
瞧!它有效。
答案 1 :(得分:6)
#!/bin/bash
while read -ru 4 LINE; do
read -r REP < <(exec curl -IsS "$LINE" 2>&1)
echo "$LINE: $REP"
done 4< "$1"
用法:
bash script.sh urls-list.txt
样品:
http://not-exist.com/abc.html
https://kernel.org/nothing.html
http://kernel.org/index.html
https://kernel.org/index.html
输出:
http://not-exist.com/abc.html: curl: (6) Couldn't resolve host 'not-exist.com'
https://kernel.org/nothing.html: HTTP/1.1 404 Not Found
http://kernel.org/index.html: HTTP/1.1 301 Moved Permanently
https://kernel.org/index.html: HTTP/1.1 200 OK
对于一切,请阅读Bash Manual。另见man curl
,help
,man bash
。
答案 2 :(得分:1)
如何为已接受的解决方案添加一些并行性。让我们修改脚本chkurl.sh
,使其更容易阅读,并且一次只处理一个请求:
#!/bin/bash
URL=${1?Pass URL as parameter!}
curl -o /dev/null --silent --head --write-out "$URL %{http_code} %{redirect_url}\n" "$URL"
现在您使用以下方式检查列表:
cat URL.txt | xargs -P 4 -L1 ./chkurl.sh
这可以使作业完成速度提高4倍。
答案 3 :(得分:0)
如果您的输入文件每行包含一个网址,则可以使用脚本读取每一行,然后尝试ping网址,如果ping成功则网址有效
#!/bin/bash
INPUT="Urls.txt"
OUTPUT="result.txt"
while read line ;
do
if ping -c 1 $line &> /dev/null
then
echo "$line valid" >> $OUTPUT
else
echo "$line not valid " >> $OUTPUT
fi
done < $INPUT
exit
ping选项:
-c count
Stop after sending count ECHO_REQUEST packets. With deadline option, ping waits for count ECHO_REPLY packets, until the timeout expires.
您也可以使用此选项来限制等待时间
-W timeout
Time to wait for a response, in seconds. The option affects only timeout in absense
of any responses, otherwise ping waits for two RTTs.
答案 4 :(得分:0)
这里是我的完整脚本,该脚本检查作为参数传递的文件中列出的URL,例如“ checkurls.sh listofurls.txt”。
它的作用:
代码:
#!/bin/sh
EMAIL=" your@email.com"
DATENOW=`date +%Y%m%d-%H%M%S`
LOG_FILE="checkurls.log"
c=0
while read url
do
((c++))
LOCK_FILE="checkurls$c.lock"
urlstatus=$(/usr/bin/curl -H 'Cache-Control: no-cache' -o /dev/null --silent --head --write-out '%{http_code}' "$url" )
if [ "$urlstatus" = "200" ]
then
#echo "$DATENOW OK $urlstatus connection->$url" >> $LOG_FILE
[ -e $LOCK_FILE ] && /bin/rm -f -- $LOCK_FILE > /dev/null && /bin/mail -s "NOTIFICATION URL OK: $url" $EMAIL <<< 'The URL is back online'
else
echo "$DATENOW FAIL $urlstatus connection->$url" >> $LOG_FILE
if [ -e $LOCK_FILE ]
then
#no action - awaiting URL to be fixed
:
else
/bin/mail -s "NOTIFICATION URL DOWN: $url" $EMAIL <<< 'Failed to reach or URL problem'
/bin/touch $LOCK_FILE
fi
fi
done < $1
# REMOVE LOG FILE IF LARGER THAN 100MB
# alow up to 2000 lines average
maxsize=120000
size=$(/usr/bin/du -k "$LOG_FILE" | /bin/cut -f 1)
if [ $size -ge $maxsize ]; then
/bin/rm -f -- $LOG_FILE > /dev/null
echo "$DATENOW LOG file [$LOG_FILE] has been recreated" > $LOG_FILE
else
#do nothing
:
fi
请注意,更改文本文件中列出的URL的顺序将影响任何现有的锁定文件(请删除所有.lock文件,以免造成混淆)。通过使用url作为文件名,但可以使用某些字符(如@ /?)来改进此功能。 &必须针对操作系统进行处理。
答案 5 :(得分:0)
我最近发布了 deadlink,一个用于查找文件中损坏链接的命令行工具。安装
pip install deadlink
并用作
deadlink check /path/to/file/or/directory
或
deadlink replace-redirects /path/to/file/or/directory
后者将替换指定文件中的永久重定向 (301)。
示例输出: