我有一个URL列表,我需要检查,看看他们是否仍然工作或没有。我想写一个bash脚本,为我这样做。
我只需要返回的HTTP状态码,即200、404、500等等。
- 编辑 * 请注意,如果页面显示“404 not found”但返回200 OK消息,则存在问题。这是Web服务器配置错误,但您可能必须考虑这种情况。
有关更多信息,请参见Check if a URL goes to a page containing the text "404"
我有一个URL列表,我需要检查,看看他们是否仍然工作或没有。我想写一个bash脚本,为我这样做。
我只需要返回的HTTP状态码,即200、404、500等等。
有关更多信息,请参见Check if a URL goes to a page containing the text "404"
9条答案
按热度按时间plupiseo1#
Curl有一个特定的选项
--write-out
:字符串
-o /dev/null
丢弃通常的输出--silent
扔掉进度表--head
发出HEAD HTTP请求,而不是GET请求--write-out '%{http_code}\n'
打印所需的状态代码要将其 Package 在一个完整的Bash脚本中:
型
(眼尖的读者会注意到,这对每个URL使用了一个curl进程,这会增加fork和TCP连接的代价。如果多个URL组合在一个curl中,速度会更快,但没有空间来写curl需要做的可怕的重复选项。)
slsn1g292#
字符串
仅为您打印状态代码
hc2pp10m3#
扩展Phil已经提供的答案。如果使用xargs进行调用,在bash中添加并行性是一件轻而易举的事情。
代码如下:
字符串
检查curl手册中的
write_out
参数,以获取更多可以使用它提取的数据(时间等)。如果它帮助别人,这是我目前使用的电话:
型
它只是将一堆数据输出到一个CSV文件中,这个文件可以导入任何办公工具。
wdebmtf24#
这依赖于广泛可用的
wget
,几乎无处不在,甚至在Alpine Linux上也是如此。字符串
解释如下:
--quiet
个关闭Wget的输出。
--spider
个[...]它不会下载页面,只要检查它们是否在那里。[...]
--server-response
个打印HTTP服务器发送的头和FTP服务器发送的响应。
关于
--server-response
,他们没有说的是,这些头输出被打印到标准错误(sterr),因此需要将redirect打印到stdin。将输出发送到标准输入,我们可以将其通过管道发送到
awk
以提取HTTP状态码。该代码为:$2
)非空字符组:{$2}
NR==1
因为我们想打印它...
{print $2}
。型
bnl4lu3b5#
使用
curl
只获取HTTP头(而不是整个文件)并解析它:字符串
bcs8qyzn6#
wget -S -i *file*
将从文件中的每个URL获取头。通过
grep
过滤状态代码。ix0qys7i7#
我发现了一个用Python编写的工具“webchk”。返回一个URL列表的状态码。https://pypi.org/project/webchk/
输出如下所示:
字符串
希望有帮助!
wr98u20j8#
请记住,curl并不总是可用的(特别是在容器中),这个解决方案存在一些问题:
字符串
这将返回退出状态0,即使URL不存在。
或者,这里是一个合理的使用wget的容器健康检查:
型
虽然它可能不会给予您确切的状态,但它至少会给予您一个有效的基于退出代码的健康响应(即使在端点上有重定向)。
xesrikrc9#
由于https://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P(
xargs
中并行作业的输出有混合的风险),我将使用GNU Parallel而不是xargs
来并行化:字符串
在这种情况下,使用
xargs
可能是安全的,因为输出很短,所以使用xargs
的问题是,如果后来有人修改代码来做更大的事情,它将不再安全。或者如果有人读到这个问题,认为他可以用其他东西替换curl
,那么这也可能是不安全的。示例
url.lst
:型