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

xt0899hw  于 2023-11-19  发布在  其他
关注(0)|答案(9)|浏览(120)

我有一个URL列表,我需要检查,看看他们是否仍然工作或没有。我想写一个bash脚本,为我这样做。
我只需要返回的HTTP状态码,即200、404、500等等。

  • 编辑 * 请注意,如果页面显示“404 not found”但返回200 OK消息,则存在问题。这是Web服务器配置错误,但您可能必须考虑这种情况。

有关更多信息,请参见Check if a URL goes to a page containing the text "404"

plupiseo

plupiseo1#

Curl有一个特定的选项--write-out

$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url>
200

字符串

  • -o /dev/null丢弃通常的输出
  • --silent扔掉进度表
  • --head发出HEAD HTTP请求,而不是GET请求
  • --write-out '%{http_code}\n'打印所需的状态代码

要将其 Package 在一个完整的Bash脚本中:

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


(眼尖的读者会注意到,这对每个URL使用了一个curl进程,这会增加fork和TCP连接的代价。如果多个URL组合在一个curl中,速度会更快,但没有空间来写curl需要做的可怕的重复选项。)

slsn1g29

slsn1g292#

wget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'

字符串
仅为您打印状态代码

hc2pp10m

hc2pp10m3#

扩展Phil已经提供的答案。如果使用xargs进行调用,在bash中添加并行性是一件轻而易举的事情。
代码如下:

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

字符串

  • -n1*:仅使用一个值(来自列表)作为curl调用的参数
  • -P10*:随时保持10个curl进程存活(即10个并行连接)

检查curl手册中的write_out参数,以获取更多可以使用它提取的数据(时间等)。
如果它帮助别人,这是我目前使用的电话:

xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective};%{http_code};%{time_total};%{time_namelookup};%{time_connect};%{size_download};%{speed_download}\n' < url.lst | tee results.csv


它只是将一堆数据输出到一个CSV文件中,这个文件可以导入任何办公工具。

wdebmtf2

wdebmtf24#

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

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

字符串
解释如下:
--quiet
关闭Wget的输出。

  • 来源- wget手册页 *

--spider
[...]它不会下载页面,只要检查它们是否在那里。[...]

  • 来源- wget手册页 *

--server-response
打印HTTP服务器发送的头和FTP服务器发送的响应。

  • 来源- wget手册页 *

关于--server-response,他们没有说的是,这些头输出被打印到标准错误(sterr),因此需要将redirect打印到stdin。
将输出发送到标准输入,我们可以将其通过管道发送到awk以提取HTTP状态码。该代码为:

  • 第二个($2)非空字符组:{$2}
  • 在header的第一行:NR==1

因为我们想打印它... {print $2}

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

bnl4lu3b

bnl4lu3b5#

使用curl只获取HTTP头(而不是整个文件)并解析它:

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

字符串

bcs8qyzn

bcs8qyzn6#

wget -S -i *file*将从文件中的每个URL获取头。
通过grep过滤状态代码。

ix0qys7i

ix0qys7i7#

我发现了一个用Python编写的工具“webchk”。返回一个URL列表的状态码。https://pypi.org/project/webchk/
输出如下所示:

▶ 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)

字符串
希望有帮助!

wr98u20j

wr98u20j8#

请记住,curl并不总是可用的(特别是在容器中),这个解决方案存在一些问题:

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

字符串
这将返回退出状态0,即使URL不存在。
或者,这里是一个合理的使用wget的容器健康检查:

wget -S --spider -q -t 1 "${url}" 2>&1 | grep "200 OK" > /dev/null


虽然它可能不会给予您确切的状态,但它至少会给予您一个有效的基于退出代码的健康响应(即使在端点上有重定向)。

xesrikrc

xesrikrc9#

由于https://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P(xargs中并行作业的输出有混合的风险),我将使用GNU Parallel而不是xargs来并行化:

cat url.lst |
  parallel -P0 -q curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' > outfile

字符串
在这种情况下,使用xargs可能是安全的,因为输出很短,所以使用xargs的问题是,如果后来有人修改代码来做更大的事情,它将不再安全。或者如果有人读到这个问题,认为他可以用其他东西替换curl,那么这也可能是不安全的。
示例url.lst

https://fsfe.org
https://www.fsf.org/bulletin/2010/fall/gnu-parallel-a-design-for-life
https://www.fsf.org/blogs/community/who-actually-reads-the-code
https://publiccode.eu/

相关问题