GNU Wget 是一个强大的命令行工具,用于从网络上下载文件。通过 Wget,你可以使用 HTTP、HTTPS 和 FTP 协议进行文件下载。它支持多种功能,例如:下载多个文件、断点续传、限制带宽、递归下载、后台下载,甚至可以镜像整个网站。

本文将通过实际示例和详细解释,向大家展示如何使用 wget 命令及其常用选项。

如何安装 Wget

在大多数 Linux 发行版中,Wget 通常是预装的。

你可以通过在终端输入以下命令来检查系统中是否安装了 Wget:

wget

如果已安装,终端会返回类似 wget: missing URL 的提示信息。如果未安装,你将看到 wget command not found 的错误提示。

如果你的系统中没有 Wget,可以通过包管理器来安装它。

在 Ubuntu 和 Debian 上安装 Wget

sudo apt install wget

在 CentOS 和 Fedora 上安装 Wget

sudo yum install wget

Wget 命令语法

在学习如何使用 Wget 命令之前,先来看一下其基本语法:

wget [选项] [url]
  • 选项:指定 wget 的操作参数,例如设置下载速度、后台下载等。
  • url:要下载文件或目录的地址。

使用 wget 下载文件

最基本的 wget 命令不带任何选项时,会将指定的文件下载到当前目录。以下示例展示了如何下载 Linux 内核的压缩包:

wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.9.tar.xz

在下载过程中,wget 会显示文件名、文件大小、下载速度以及预计完成时间等信息。下载完成后,文件将保存在当前工作目录中。

如果你不希望看到下载进度等输出信息,可以使用 -q 选项:

wget -q https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.9.tar.xz

如果文件已存在,wget 会在文件名后面加上 .N 以避免覆盖。

使用 wget 将文件另存为其他名称

可以通过 -O 选项指定将下载的文件保存为其他名称:

wget -O latest-hugo.zip https://github.com/gohugoio/hugo/archive/master.zip

以上命令将最新的 Hugo 压缩包保存为 latest-hugo.zip

wget 下载文件到指定目录

默认情况下,wget 会将文件保存在当前目录。如果你想将文件保存到其他目录,可以使用 -P 选项指定路径:

wget -P ~/Download https://github.com/gohugoio/hugo/archive/master.zip

此命令将 hugo 的 master 分支源码 zip 文件保存到 ~/Download 目录。

如何限制 wget 的下载速度

如果你不想让 wget 占用过多带宽,可以使用 --limit-rate 选项限制下载速度:

wget --limit-rate=1m https://go.dev/dl/go1.23.1.src.tar.gz

上面的命令将下载速度限制为 1MB/s。

wget 如何开启断点续传

如果下载过程中网络连接中断,可以通过 -c 选项继续下载,而不是从头开始。

wget -c http://releases.ubuntu.com/24.04/ubuntu-24.04.1-live-server-amd64.iso

如果远程服务器不支持断点续传,wget 将重新开始下载并覆盖已有文件。

wget 后台下载

使用 -b 选项可以将文件在后台下载。例如:

wget -b http://releases.ubuntu.com/24.04/ubuntu-24.04.1-live-server-amd64.iso

默认情况下,输出信息会被重定向到当前目录下的 wget-log 文件中。你可以通过 tail 命令实时查看下载状态:

tail -f wget-log

wget 控制重试次数和间隔时间

Wget 默认会在下载失败时自动重试,用户可以通过 --tries 选项控制重试次数,并通过 --wait 选项设置两次下载之间的间隔时间,以避免对服务器的高频请求。

控制重试次数

wget --tries=5 https://example.com/file.zip

以上命令将重试下载 5 次,超过次数后停止。

设置下载间隔时间

wget --wait=10 https://example.com

为了避免过于频繁的请求,也可以通过 --random-wait 选项使 Wget 在请求之间随机等待一段时间,这在爬取数据或批量下载时尤为重要,避免触发服务器的反爬机制。

使用随机等待时间

wget --random-wait -r https://example.com

此命令会在每次下载请求之间等待 10 秒,适用于递归下载时降低服务器压力。

修改 Wget 的 User-Agent

有时候,某些服务器会阻止 Wget 的默认 User-Agent。在这种情况下,你可以使用 -U 选项来模拟其他浏览器:

wget --user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0" http://wget-forbidden.com/

该命令模拟了 Firefox 浏览器的请求。

使用 wget 下载多个文件

如果你需要一次性下载多个文件,可以使用 -i 选项并提供包含下载链接的文件。例如:

wget -i linux-distros.txt

使用 -i 选项,可以通过 txt 文件指定多个下载链接,每行一个 URL,Wget 将自动批量下载。

linux-distros.txt 文件内容:

http://mirrors.edge.kernel.org/archlinux/iso/latest/archlinux-x86_64.iso
https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.7.0-amd64-netinst.iso
https://download.fedoraproject.org/pub/fedora/linux/releases/40/Server/x86_64/iso/Fedora-Server-dvd-x86_64-40-1.14.iso

你也可以将 - 作为文件名,从标准输入中读取下载链接。

wget 忽略文件大小

在某些情况下,远程服务器可能会发送错误的文件大小信息,导致下载问题。使用 --ignore-length 选项可以忽略这些错误的大小信息。

忽略错误的文件大小信息

wget --ignore-length https://example.com/file.zip

wget 日志记录与输入文件

Wget 支持将操作日志输出到文件中,这在批量下载或调试时非常实用。

将日志输出到文件

wget -o download.log https://example.com/file.zip

-o 选项可以将下载过程中的日志输出到 download.log 文件中。-a 选项则允许将日志追加到现有文件中。

使用 wget 从 FTP 和 FTPS 下载文件

要从密码保护的 FTP 和 FTPS(带加密的 FTP)服务器下载文件,可以指定用户名和密码:

wget --ftp-user=FTP_USERNAME --ftp-password=FTP_PASSWORD ftp://ftp.example.com/filename.tar.gz

wget 镜像网站

你可以使用 -m 选项将整个网站镜像到本地:

wget -m https://example.com

如果你想在本地浏览下载的网站,需要加上以下选项:

wget -m -k -p https://example.com

-k 选项会将下载文件中的链接转换为本地链接,-p 选项确保下载显示页面所需的所有文件。

wget 递归下载与链接跟随

镜像网站功能使用了 -m 选项,这是递归下载的一种方式。但是,递归下载还可以通过更多的选项进行定制,特别是在处理大型网站或多级目录时。

递归下载选项

wget -r https://example.com

-r 选项启用递归下载,Wget 会自动跟随网站内的链接并下载指定层级以内的所有文件。

设置递归下载的深度

wget -r -l 3 https://example.com

-l 选项可以设置递归下载的最大深度。上面的命令会下载深度为 3 的页面内容。

当执行递归下载时,用户可以指定只下载特定类型的文件,或排除某些文件类型。这在下载大型网站时特别有用,以避免下载不需要的文件。

指定接受或拒绝的文件类型

wget -r -A "*.jpg,*.png" https://example.com

-A 选项允许你指定接受的文件类型,以上命令只下载 .jpg.png 格式的图片文件。

wget -r -R "*.gif" https://example.com

-R 选项则用于排除某些文件类型,比如只排除 .gif 文件。

wget 处理部分内容下载(Range 请求)

Wget 支持使用 HTTP Range 请求下载文件的特定部分,这在需要从大文件中下载部分内容时非常有用。

下载文件的特定部分

wget --header="Range: bytes=0-499" https://example.com/largefile.zip

此命令将仅下载文件的前 500 字节。

wget 跳过证书检查

如果你需要从 SSL 证书无效的站点下载文件,可以使用 --no-check-certificate 选项:

wget --no-check-certificate https://domain-with-invalid-ss.com

wget 的 HTTP 和 HTTPS 选项

wget 下载文件时可以设置 HTTP/HTTPS 特定的高级选项,比如处理 HTTP 身份验证、Cookies、压缩等。

处理 HTTP 身份验证

wget --user=USERNAME --password=PASSWORD https://example.com/protected-file.zip

当你需要从需要认证的网站下载文件时,--user--password 选项允许你传递凭据。

发送 Cookies

wget --load-cookies cookies.txt https://example.com

某些网站需要登录后才能下载文件,通过 --load-cookies 选项可以在请求中发送之前存储的 Cookies。

wget 通过 HTTPS 使用客户端证书

如果需要使用客户端证书来访问 HTTPS 资源,Wget 允许你指定证书文件和私钥。

使用客户端证书

wget --certificate=/path/to/cert.pem --private-key=/path/to/key.pem https://example.com

wget 的代理设置

在某些受限网络环境下,可能需要通过代理服务器进行下载。Wget 提供了支持 HTTP、HTTPS 和 FTP 代理的功能。

使用代理下载

wget -e use_proxy=yes -e http_proxy=proxy_server_address:port https://example.com

-e 选项允许你在命令行中直接设置代理服务器。

wget 下载并输出到标准输出

以下命令示例展示了如何将下载内容输出到标准输出并通过管道传递给其他命令:

wget -q -O - "http://wordpress.org/latest.tar.gz" | tar -xzf - -C /var/www

此命令将在下载最新的 WordPress 压缩包后,直接解压到 /var/www 目录。

wget -qO- https://example.com/file.tar.gz | tar -xz

这个命令会静默下载文件并直接解压,常用于一键安装脚本中。

wget 的时间戳功能

时间戳是一个常用功能,尤其是在需要定期同步远程文件时,Wget 可以根据文件的时间戳判断是否需要重新下载。

基于时间戳的下载

wget -N https://example.com/file.zip

-N 选项会让 Wget 检查本地文件的时间戳,如果服务器上的文件更新了,则重新下载,否则跳过下载。

wget 机器人排除协议

Wget 支持遵循 robots.txt 文件中的规则,这在抓取网站时非常重要,可以避免下载网站管理员禁止抓取的部分。如果需要忽略 robots.txt 规则,可以使用 --execute robots=off 选项。

忽略 robots.txt

wget --execute robots=off https://example.com

wget 本地启动配置文件(Wgetrc)

Wget 提供了启动文件 wgetrc,允许你将常用的配置保存下来,避免每次使用时手动指定。

Wget 会自动读取全局和用户级别的 wgetrc 配置文件。你可以通过编辑这些文件来定制 Wget 的默认行为,例如:

# ~/.wgetrc
limit-rate=500k
wait=5

此配置将限制下载速度为 500 KB/s,并在每次请求间隔 5 秒。

wget 退出状态码

Wget 的退出状态码可以用于脚本编写时判断下载的成功与否,尤其在批处理任务中非常重要。常见状态码包括:

  • 0:成功。
  • 1:通用错误。
  • 4:网络故障。
  • 8:服务器错误。

结语

通过 Wget,你可以轻松实现多文件下载、断点续传、网站镜像等功能。不同的选项组合使得 wget 成为一个灵活且功能强大的工具。

想了解更多关于 Wget 的内容,可以访问 GNU Wget 手册


也可以看看