Contents

请求而不保存文件在本地

1. 概述

考虑一种情况,我们想向服务器发出一个虚拟请求,但我们不想下载资源。我们可能会这样做以检查服务器是否已启动或预热缓存或出于其他原因。

wgetcurl 命令可用于请求文件并避免保存数据作为响应。

2. 使用wget命令

GNU wget是一个开源的、非交互式的命令行实用程序,用于从 Web 下载文件。使用wget,我们可以使用 HTTP、HTTPS 和 FTP 协议下载文件。

wget提供了几个选项,允许我们下载多个文件、恢复下载、带宽限制、递归下载、后台下载、镜像站点等。 现在让我们看看如何使用wget来避免保存文件。

2.1. 输出重定向

在 Linux 中,命令从终端获取输入并将输出返回到终端。输出重定向帮助我们将输出转移到默认终端以外的地方。我们可以将输出重定向到文件、目录或作为另一个命令的输入。

wget使用输出重定向的概念将输出重定向到一个目录,并以不同的名称保存文件。通常,我们可以将任何输出重定向到*/dev/null*以避免将文件保存到机器:

Resolving github.com (github.com)... 140.82.113.3
Connecting to github.com (github.com)|140.82.113.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Resolving codeload.github.com (codeload.github.com)... 140.82.114.9
Connecting to codeload.github.com (codeload.github.com)|140.82.114.9|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/zip]
Saving to: '/dev/null'
/dev/null             [ <=>                        ]   1.49M  --.-KB/s    in 0.1s    
2022-02-09 17:49:13 (10.1 MB/s) - '/dev/null' saved [1564839]

在上面的命令中,  -O选项将输出重定向到一个文件。我们将输出重定向到一个特殊文件*/dev/null。*它是一个标准文件,丢弃所有写入其中的数据,同时返回执行写入操作的成功。

让我们验证一下wget命令没有在本地保存 master.zip文件:

$ ls -lah
total 0
drwxr-xr-x. 2 root root  6 Feb  9 17:36 .
drwxr-xr-x. 7 root root 97 Feb  9 17:36 ..

默认情况下,wget命令将输出重定向到当前 shell:

wget -O- https://xxx.com/master.zip

这一次,  master.zip文件的内容会显示在终端上,并且文件不会被保存。

在上面的输出中,wget命令输出打印在终端上。它包括一堆有用的网络信息。但是,如果我们也希望丢弃该输出怎么办。为此,我们可以使用 -q 选项:

wget -qO /dev/null https://xxx.com/master.zip

我们使用*-q标志来安静wget*命令输出。

2.2. 使用*–delete-after*标志

请求文件而不保存的一种天真的方法是,我们首先下载该文件并在下载完成后将其删除。wget命令的*–delete-after*标志可以开箱即用地执行此操作:

Resolving github.com (github.com)... 140.82.113.3
Connecting to github.com (github.com)|140.82.113.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Resolving codeload.github.com (codeload.github.com)... 140.82.114.10
Connecting to codeload.github.com (codeload.github.com)|140.82.114.10|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/zip]
Saving to: 'master.zip.tmp'
master.zip.tmp       [ <=>                        ]   1.49M  --.-KB/s    in 0.1s    
2022-02-09 17:54:50 (10.0 MB/s) - 'master.zip.tmp' saved [1564839]
Removing master.zip.tmp.

在这里,请求的资源master.zip首先作为临时文件下载。然后它会删除下载的文件。–delete-after标志隐含地执行此操作。

2.3. 使用*–spider*标志

wget命令中的*–spider*选项只是检查资源是否可用而不下载它:

Spider mode enabled. Check if remote file exists.
Resolving github.com (github.com)... 140.82.112.4
Connecting to github.com (github.com)|140.82.112.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Spider mode enabled. Check if remote file exists.
Resolving codeload.github.com (codeload.github.com)... 140.82.112.10
Connecting to codeload.github.com (codeload.github.com)|140.82.112.10|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/zip]
Remote file exists.

与我们目前讨论的其他两种方法不同,这种方法不会下载机器上的资源。因此,这是最优化的解决方案。

3. 使用curl命令

curllibcurl 库的命令行实用程序。它有助于在客户端和服务器之间传输数据。

让我们使用curl命令来检查资源是否可用:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   146  100   146    0     0   1327      0 --:--:-- --:--:-- --:--:--  1315

就像wget命令一样,我们使用重定向操作符将下载的内容重定向到*/dev/null*。最后,我们可以使用ls 命令验证是否没有下载文件。