使用Linux wget命令的7个方便的技巧

408 阅读3分钟

Wget是一个免费的工具,用于从网上下载文件。它从互联网上获取数据,并将其保存到一个文件中,或在你的终端中显示。从字面上看,这也是网络浏览器所做的,如Firefox或Chromium,只是在默认情况下,它们在图形窗口中呈现信息,通常需要用户主动控制它们。wget 工具被设计成非交互式的,这意味着你可以编写脚本或安排wget ,以下载文件,无论你是否在你的电脑前。

用wget下载一个文件

你可以通过提供一个特定URL的链接,用wget 下载一个文件。如果你提供一个默认为index.html 的URL,那么就会下载索引页。默认情况下,该文件会被下载到你当前工作目录下的一个同名文件中。

$ wget http://example.com
--2021-09-20 17:23:47-- http://example.com/
Resolving example.com... 93.184.216.34, 2606:2800:220:1:248:1893:25c8:1946
Connecting to example.com|93.184.216.34|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1256 (1.2K) [text/html]
Saving to: 'index.html'

你可以通过使用带破折号的--output-document - 字符,使wget 将数据发送到标准输出(stdout),而不是。

$ wget http://example.com --output-document - | head -n4



   Example Domain

你可以使用--output-document 选项(简称-O )来命名你的下载,你想怎么命名就怎么命名。

$ wget http://example.com --output-document foo.html

继续部分下载

如果你正在下载一个非常大的文件,你可能会发现你不得不中断下载。有了--continue ( 简称-c ),wget 可以确定下载的中断位置,并继续进行文件传输。这意味着下次你下载一个4GB的Linux发行版ISO时,当出现问题时,你永远不必再回到起点了。

$ wget --continue https://example.com/linux-distro.iso

下载一连串的文件

如果你需要下载的不是一个大文件,而是几个文件,wget 可以帮你解决这个问题。假设你知道你要下载的文件的位置和文件名模式,你可以使用Bash语法来指定一个整数范围的开始和结束点,以代表文件名的序列。

$ wget http://example.com/file_{1..4}.webp

镜像整个网站

你可以使用--mirror 选项下载整个站点,包括其目录结构。这个选项与运行--recursive --level inf --timestamping --no-remove-listing ,这意味着它是无限递归的,所以你会得到你指定的域上的所有内容。取决于该网站有多老,这可能意味着你得到的内容比你意识到的要多很多。

如果你使用wget 来归档一个网站,那么--no-cookies --page-requisites --convert-links 这些选项也很有用,可以确保每一个页面都是新鲜的、完整的,而且网站的副本或多或少是自成一体的。

修改HTML头文件

用于数据交换的协议有很多元数据被嵌入到计算机发送的通信数据包中。HTTP头文件是数据初始部分的组成部分。当你浏览一个网站时,你的浏览器会发送HTTP请求头信息。使用--debug 选项可以看到wget 在每个请求中发送哪些头信息。

$ wget --debug example.com
---request begin---
GET / HTTP/1.1
User-Agent: Wget/1.19.5 (linux-gnu)
Accept: */*
Accept-Encoding: identity
Host: example.com
Connection: Keep-Alive
---request end---

你可以用--header 选项修改请求头。例如,有时模仿一个特定的浏览器是很有用的,无论是为了测试还是为了说明编码不良的网站只对特定的用户代理正确工作。

要识别为在Windows上运行的Microsoft Edge。

$ wget --debug --header="User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59" http://example.com

你也可以伪装成一个特定的移动设备。

$ wget --debug \
--header="User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1" \
http://example.com

查看响应头信息

与浏览器请求时发送头信息的方式相同,头信息也包含在响应中。你可以用--debug 选项查看响应头。

$ wget --debug example.com
[...]
---response begin---
HTTP/1.1 200 OK
Accept-Ranges: bytes
Age: 188102
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Etag: "3147526947"
Server: ECS (sab/574F)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1256
---response end---
200 OK
Registered socket 3 for persistent reuse.
URI content encoding = 'UTF-8'
Length: 1256 (1.2K) [text/html]
Saving to: 'index.html'

对301响应的回应

200响应代码意味着一切都按预期进行。另一方面,301响应意味着一个URL已经被永久地移动到一个不同的位置。这是一个网站管理员重新定位内容的常见方法,同时留下一个 "痕迹",以便访问旧位置的人仍然可以找到它。默认情况下,wget 跟随重定向,这可能是你通常希望它做的。

然而,你可以用--max-redirect 选项来控制wget ,当它遇到301响应时做什么。你可以把它设置为0 ,不跟随重定向。

$ wget --max-redirect 0 http://iana.org
--2021-09-21 11:01:35-- http://iana.org/
Resolving iana.org... 192.0.43.8, 2001:500:88:200::8
Connecting to iana.org|192.0.43.8|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://www.iana.org/ [following]
0 redirections exceeded.

另外,你也可以把它设置为其他数字,以控制wget 的重定向数量。

扩展一个缩短的URL

--max-redirect 选项对于在实际访问缩短的URL之前查看它们很有用。缩短的URL对印刷媒体很有用,因为用户不能直接复制和粘贴一个长的URL,或者在有字符限制的社交网络上(这在像Mastodon这样的现代和开源社交网络上不是一个问题)。然而,它们也可能有点危险,因为它们的目的地在本质上是隐蔽的。通过结合--head 选项来查看HTTP头,以及--location 选项来解开URL的最终目的地,你可以在不加载完整资源的情况下窥探一个缩短的URL。

$ wget --max-redirect 0 "https://bit.ly/2yDyS4T"
--2021-09-21 11:32:04-- https://bit.ly/2yDyS4T
Resolving bit.ly... 67.199.248.10, 67.199.248.11
Connecting to bit.ly|67.199.248.10|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://example.com/ [following]
0 redirections exceeded.

输出的倒数第二行,以Location开头,显示了预期的目的地。

使用wget

一旦你练习把探索网络的过程看成是一个单一的命令,wget ,就会成为一种快速有效的方式,从互联网上获取你需要的信息,而不需要费心去看图形界面。为了帮助你把它纳入你的常规工作流程,我们已经创建了一个小抄,其中包括常见的wget 用途和语法,包括使用它来查询API的概述。 在这里下载Linuxwget 小抄。