比 curl 更快的 ping URL 方法

Sfi*_*oza 5 debian url bash ping curl

检查指定 URL 是否有效的最快方法是什么?(以 OK http 状态代码响应)?

现在我正在使用 curl,但我有一堆 URL 需要循环测试,所以我正在寻找最快的解决方案。

除了 wget 之外还有其他选项要检查吗?

gho*_*oti 8

我怀疑您将看到的任何性能提升都来自改进您用来建立连接的任何包装器,而不是curl为每个 URL启动的开销。无论是curlnetcat还是wget,您可能都希望分别启动每一个,以便分别处理它们的结果。

但我会以两种方式回答这个问题,只是为了好玩。

首先,你可以真正做在bash TCP连接,而无需启动像卷曲/ wget的/的netcat /读取/ etc中。例如:

#!/usr/bin/env bash

hostlist=(
  www.xe.com
  www.google.com
)

for host in "${hostlist[@]}"; do
  exec 3<>/dev/tcp/$host/80         # open a socket connection on fd/3
  printf "HEAD / HTTP/1.0\n\n" >&3  # send a request
  read -u 3 protocol code message   # read the result (first line only)
  exec 3<&-; exec 3>&-              # close fd/3, in and out
  echo ">> $host -- $code $message ($protocol)"
  printf ">> %s -- %s %s (%s)\n" "$host" "$code" "${message%?}" "$protocol"
done
Run Code Online (Sandbox Code Playgroud)

我在这里找到了一些关于这个 bash 功能的不错的文档。

注意 的处理$message。由于这是 HTTP 协议,因此该行\r的末尾有一个。这将剥离它,以获得更合理的显示。

请注意,寻找“OK”可能不是您想要做的。在我上面的示例中,www.google.com返回 302 重定向而不是 200 OK,这是一个完全有效的响应。

另请注意,尝试以这种方式打开与不存在的主机的连接是错误的。您需要考虑在此脚本中可能遇到的各种错误情况,以及您希望如何处理它们。

第二种选择是使用允许在一个命令行上提供多个 URL 的工具。碰巧,curl这样做。你可以用美丽而奇妙的方式按摩它的输出。例如:

curl -sL -w "%{http_code} %{url_effective}\\n" \ 
 "http://www.xe.com/" -o /dev/null \
 "http://www.google.com" -o /dev/null
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案执行 HTTP GET 而不是 HEAD,因此您正在传输更多数据,但获得更“纯”的结果。如果要使用 HEAD 节省带宽,请使用 curl 的-I选项。(我发现在某些情况下,尤其是在 Java™ 中,HEAD 方法不会定期实现。使用 GET 可能会增加响应与提供给浏览器的响应相同的可能性,但会增加额外带宽.)

您可以根据需要将 URL 列表的扩展脚本化为命令行。当然,如果您正在处理成千上万个 URL,您可能希望将它们包装在第一个解决方案中。

  • curl 接受 `-I` 选项,它会告诉它使用 `HEAD` 请求(至少在我拥有的版本中)。 (2认同)

moe*_*eye 1

也许使用 Netcat?

( netcat $domain 80 | head -n 1 ) << EOF
HEAD / HTTP/1.0
Host: $domain


EOF
Run Code Online (Sandbox Code Playgroud)

输出:

HTTP/1.1 200 OK
Run Code Online (Sandbox Code Playgroud)