Bash 获取URL列表的HTTP状态代码的脚本?

Bash 获取URL列表的HTTP状态代码的脚本?,bash,curl,http-status-codes,Bash,Curl,Http Status Codes,我有一个URL列表,我需要检查,看看它们是否仍然有效。我想为我写一个bash脚本 我只需要返回HTTP状态码,即200、404、500等等。没别的了 编辑注意,如果页面显示“404未找到”,但返回200 OK消息,则会出现问题。这是一个配置错误的Web服务器,但您可能需要考虑这种情况。 有关详细信息,请参见wget-S-i*文件*将从文件中的每个url获取标题 通过grep过滤特定的状态代码。用于仅获取HTTP头(而不是整个文件)并对其进行解析: $ curl -I --stderr /dev

我有一个URL列表,我需要检查,看看它们是否仍然有效。我想为我写一个bash脚本

我只需要返回HTTP状态码,即200、404、500等等。没别的了

编辑注意,如果页面显示“404未找到”,但返回200 OK消息,则会出现问题。这是一个配置错误的Web服务器,但您可能需要考虑这种情况。


有关详细信息,请参见

wget-S-i*文件*
将从文件中的每个url获取标题

通过
grep
过滤特定的状态代码。

用于仅获取HTTP头(而不是整个文件)并对其进行解析:

$ curl -I  --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2
200

Curl有一个特定选项,
——write out
,用于:

$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url>
200
(目光敏锐的读者会注意到,这会对每个URL使用一个curl进程,这会造成fork和TCP连接惩罚。如果将多个URL组合在一个curl中,速度会更快,但没有空间写出curl所需的可怕重复选项。)


仅为您打印状态代码

扩展菲尔已经提供的答案。如果您使用xargs进行调用,那么在bash中添加并行性是很容易的

代码如下:

xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' < url.lst

它只是将一组数据输出到一个csv文件中,该文件可以导入任何office工具。

这依赖于广泛可用的
wget
,几乎无处不在,即使在Alpine Linux上也是如此

wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
解释如下:

——安静

关闭Wget的输出

来源-wget手册页

--spider

[…]它不会下载页面,只需检查页面是否存在。[……]

来源-wget手册页

--服务器响应

打印HTTP服务器发送的标题和FTP服务器发送的响应

来源-wget手册页

关于
--server response
他们没有说的是,这些头文件的输出是打印到的,因此需要打印到stdin

将输出发送到标准输入,我们可以通过管道将其发送到
awk
,以提取HTTP状态代码。该代码是:

  • 第二个(
    $2
    )非空白字符组:
    {$2}
  • 在标题的第一行:
    NR==1
因为我们想把它打印出来<代码>{print$2}

wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
由于(来自
xargs
中并行作业的输出存在混合风险),我将使用GNU并行而不是
xargs
来并行化:

cat url.lst |
  parallel -P0 -q curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' > outfile
在这种特殊情况下,使用
xargs
可能是安全的,因为输出非常短,因此使用
xargs
的问题在于,如果以后有人更改代码以执行更大的操作,它将不再安全。或者,如果有人读到这个问题,认为他可以用其他东西替换
curl
,那么这可能也不安全。

我发现了一个用Python编写的工具“WebHK”。返回URL列表的状态代码。

输出如下所示:

▶ webchk -i ./dxieu.txt | grep '200'
http://salesforce-case-status.dxi.eu/login ... 200 OK (0.108)
https://support.dxi.eu/hc/en-gb ... 200 OK (0.389)
https://support.dxi.eu/hc/en-gb ... 200 OK (0.401)

希望有帮助!

非常好。我可以在文件中的每个url上执行该命令吗?@Manu:是的,我已经编辑了我的答案,以显示一种可能的方式包装curl命令。它假设url-list.txt每行包含一个url。我不知道为什么上面的脚本总是在输出中获得000,但当我只运行一次命令而没有循环时它是有效的…@KarolFiturski我也有同样的问题(你可能已经解决了,但只是以防万一其他人发现了这个问题…)在我的例子中,输入文件的行尾有回车符,导致URL类似
http://example.com/\r
在进行循环时,我遇到了这个问题,我能够通过将以Windows类型结尾的行切换到Linux类型来修复它。当wget说404时,curl告诉我200…:(
-I
标志导致curl发出HTTP头请求,该请求与某些服务器的正常HTTP GET分开处理,因此可以返回不同的值。没有它,该命令仍然可以工作。+1在重定向url时显示多个代码,每个代码位于新行。必须摆脱--spider才能处理我试着去做,但是很有效。公平地说,我的脚本的“bug”只有在服务器返回HTTP代码200但正文文本显示“404未找到”时才会出现",这是一个行为不端的Web服务器。如果响应代码为200,wget的退出状态将为0,如果响应代码为404,则为8,如果响应代码为302,则为4…您可以使用$?变量访问上一个命令的退出状态。并行性、文件输入和csv。这正是我要找的。太棒了,让我开心了。这太棒了,正是我要找的,谢谢先生。继续e问题,如何在csv结果中包含页面的页面标题?@estani-如何将页面的页面标题包含到.csv文件中。很抱歉重新发布,忘记标记您,以便您收到有关此问题的通知。非常感谢。@MitchellK这根本不处理http调用的内容。如果“页面标题”(不管是什么)在url中,然后你可以添加它。如果不是,你需要解析整个页面来提取它的“标题”(假设你指的是http检索到的html页面)。在堆栈溢出处寻找其他答案或问这个特定的问题。我将此答案与
2>和1 | head-1 | awk'{print$2}
wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
cat url.lst |
  parallel -P0 -q curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' > outfile
▶ webchk -i ./dxieu.txt | grep '200'
http://salesforce-case-status.dxi.eu/login ... 200 OK (0.108)
https://support.dxi.eu/hc/en-gb ... 200 OK (0.389)
https://support.dxi.eu/hc/en-gb ... 200 OK (0.401)