如何使用bash shell脚本从文本文件中检查URL的状态

时间:2014-08-05 09:25:42

标签: linux bash http url ubuntu

我必须检查200个http URL的状态,并找出其中哪些是断开的链接。链接存在于一个简单的文本文件中(比如我的〜文件夹中的URL.txt)。我正在使用Ubuntu 14.04,我是一个Linux新手。但我知道bash shell非常强大,可以帮助我实现我想要的。

我的确切要求是阅读包含URL列表的文本文件,并自动检查链接是否正常工作,并将响应写入包含URL及其相应状态(工作/损坏)的新文件。

6 个答案:

答案 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 curlhelpman 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”。

它的作用:

  • 使用curl检查网址并返回HTTP状态代码
  • 当url返回200以外的其他代码时发送电子邮件通知
  • 为失败的网址创建一个临时锁定文件(可以改善文件命名)
  • 当网址再次可用时发送电子邮件通知
  • 在网址可用后删除锁定文件,以避免进一步的通知
  • 将事件记录到文件中并处理增加的日志文件大小(AKA日志 旋转,如果需要记录代码200,则取消注释回声)

代码:

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

示例输出:

enter image description here