如何使用 ping 或类似命令通过 Internet 检测文件?

Egy*_*din 10 command-line scripts ping

我有一个 shell 脚本可以通过 Internet 下载我的一些东西。我如何知道某个文件是否存在于 Internet 上?假设我想知道是否http://192.168.1.1/backup/01012011.zip存在?我尝试使用ping命令,但它显示错误,我猜这是因为/字符。

任何人都可以帮助我吗?还是有另一种方法?

小智 13

您可以使用--spiderwget 选项,它实际上并不下载文件,而只是检查它是否存在。在你的例子中:

wget --spider http://192.168.1.1/backup/01012011.zip

这将返回一条包含200 OK文件是否存在的消息,或者返回一个错误,例如,404 Not Found如果它不存在,或者403 Forbidden您没有获取它的权限。


Nat*_*man 8

当然还有另一种方法 - 但这需要了解通过 Internet 发出请求时实际发生的情况。当您在 Web 浏览器中访问页面时,数据将使用称为 HTTP 的协议传输(是的,这就是您经常http://在 URL 开头看到的原因)。

HTTP 是一种基于文本的协议。客户端和服务器之间通过发送标头和请求正文来交换信息。标头包含许多关于请求和正在传输的信息的状态信息。您感兴趣以帮助您解决问题的标题根本不是标题 - 它是传输的第一行并包含一个称为状态代码的数字。该号码是 3 位数字,用于传达状态信息。如果请求成功,结果通常为 200(并非总是如此——也有例外)。

有一件事是肯定的 - 如果您请求的文件在 Web 服务器上不存在,则服务器应回复状态代码 404。这表明无法找到资源。(出于好奇,这里是 HTTP 状态代码及其含义的列表。)

好吧,足够的理论。让我们看看我们如何在终端上做到这一点。使用 HTTP 获取请求的一个很好的工具是 cURL,它在 Ubuntu 存储库中可用,它也为我们提供了检查状态代码的能力。您可以使用以下命令安装它:

sudo apt-get install curl
Run Code Online (Sandbox Code Playgroud)

安装后,您可以像这样调用它:

curl [website]
Run Code Online (Sandbox Code Playgroud)

...并且给定 URL 的内容将被打印到终端。这是您的 Web 浏览器在访问该 URL 时看到的信息。这对我们有什么帮助?好吧,仔细看看命令标志curl。如果我们传递参数--head,cURL 将返回请求的标头。用 URL 试试。您将获得以下形式的行列表:

header-name: header-value
Run Code Online (Sandbox Code Playgroud)

请注意,当然,第一行看起来不像这样。还记得我们之前谈到的状态码吗?您会在第一行注意到它是三位数字。我们现在需要做的是使用 Perl 从第一行提取它 - 我们可以在终端中使用 Perl 的-e标志来完成它,让我们将 Perl 代码直接传递给 Perl 解释器。我们还需要向 cURL ( --silent)添加一个额外的标志,以防止它显示进度条并弄乱我们的 Perl 脚本。

这是我们需要的……它非常复杂,因为需要从 shell 中转义很多:

perl -e "\$s=\`curl [URL] --head --silent\`; \$s=~m/(\\d{3})/;print \$1"

这基本上是用 cURL 获取 URL 并通过 Perl 正则表达式运行它,提取状态代码并将其打印出来。

现在您需要做的就是输入您正在检查的文件的 URL 并将其与“404”进行比较。如果您得到“404”,则可以假设该文件不存在。

当然,这在终端中可能非常难以操作,因此您可以编写一个小脚本,使其不仅更易于理解,而且更易于执行:

#!/usr/bin/perl

# Get the URL
$url = $ARGV[0];

# Fetch the header
$header = `curl $url --head --silent`;

# Try to find the status code
$header =~ m/(\d{3})/;

# Return the result
exit(0) if $1 == 404;
exit(1);
Run Code Online (Sandbox Code Playgroud)

只需将其复制并粘贴到文件中即可。对于本示例,我将调用文件url_check. 然后使用以下命令使文件可执行:

chmod 755 url_check
Run Code Online (Sandbox Code Playgroud)

然后您可以使用以下简单命令检查任何文件:

./url_check [网址]

如果服务器返回 404,则返回值将为“0”,否则为“1”。然后,您可以像处理任何其他命令一样在 shell 中链接此命令。