wget
命令入门教程:网络下载的瑞士军刀
序言
在 Linux/Unix 世界中,wget
是一个强大且被广泛使用的命令行工具,用于从网络上下载文件。它的名字来源于 World Get,意为“网络获取”。与浏览器下载不同,wget
是非交互式的,这意味着它可以在后台运行,即使您关闭终端或断开SSH连接(结合特定选项)也能继续下载。这使得它在自动化脚本、下载大型文件、甚至离线浏览整个网站等场景下非常有用。
本教程将带您从零开始,逐步深入了解 wget
的各种功能和常用选项。无论您是刚接触命令行的新手,还是希望提升下载效率的进阶用户,都能从中受益。
第一部分:初识 wget
– 安装与基本用法
1. wget
的安装
wget
是许多 Linux 发行版和 macOS (通过 Homebrew 或 MacPorts) 中的默认安装工具。如果您的系统上没有安装 wget
,可以通过包管理器轻松安装:
- Debian/Ubuntu 系列:
bash
sudo apt update
sudo apt install wget - Fedora/CentOS/RHEL 系列:
bash
sudo yum install wget
# 或对于较新版本
sudo dnf install wget - macOS (使用 Homebrew):
bash
brew install wget
安装完成后,您可以在终端中输入 wget --version
来检查版本信息,确认安装成功。
2. wget
的基本语法
wget
命令的基本语法非常简单:
bash
wget [选项] [URL]
[选项]
:用于指定下载行为的各种参数,比如设置保存文件名、下载目录、限制速度、断点续传等。[URL]
:您想要下载的资源的统一资源定位符,可以是 HTTP、HTTPS 或 FTP 地址。
3. 下载单个文件
最常见的用法就是下载单个文件。假设您想下载一个名为 example.zip
的文件,位于 http://example.com/files/
目录下,只需执行以下命令:
bash
wget http://example.com/files/example.zip
执行命令后,wget
会连接到指定的 URL,并在当前目录下创建一个名为 example.zip
的文件,并将下载内容保存到其中。终端会显示下载进度,包括文件大小、下载速度、预计剩余时间等信息。
输出示例:
“`
–2023-10-27 10:30:00– http://example.com/files/example.zip
Resolving example.com (example.com)… 93.184.216.34
Connecting to example.com (example.com)|93.184.216.34|:80… connected.
HTTP request sent, awaiting response… 200 OK
Length: 123456789 (118M) [application/zip]
Saving to: ‘example.zip’
example.zip 100%[===================>] 117.74M 1.23MB/s in 97s
2023-10-27 10:31:37 (1.21 MB/s) – ‘example.zip’ saved [123456789/123456789]
“`
- 第一行显示了请求的 URL 和时间。
Resolving
和Connecting
显示了解析域名和建立连接的过程。HTTP request sent, awaiting response... 200 OK
表示服务器成功响应请求(200 是 HTTP 状态码,表示成功)。Length
显示了文件大小和类型。Saving to: ‘example.zip’
显示了文件将保存到本地的文件名。- 进度条
[===================>]
直观展示了下载进度。 - 最后一行总结了下载结果,包括下载速度和保存的文件名及大小。
第二部分:常用选项详解 – 控制下载行为
wget
提供了大量的选项来精细控制下载过程。下面介绍一些最常用的:
1. 指定保存的文件名 (-O
)
有时你可能想将下载的文件保存为其他名称,而不是 URL 中的原名称。使用 -O
(大写字母O) 选项可以实现这一点。
bash
wget -O my_download.zip http://example.com/files/example.zip
这会将文件下载并保存为 my_download.zip
。
注意: 如果您使用 -O
下载多个文件,wget
会将所有内容追加到 同一个 指定文件中,这通常不是你想要的结果。对于下载多个文件到不同位置,通常结合 -P
或使用循环。
2. 指定保存的目录 (-P
)
使用 -P
(大写字母P) 选项可以指定下载文件保存的目录。这对于组织下载的文件非常有用。
bash
wget -P /home/user/downloads http://example.com/files/example.zip
这会将 example.zip
下载到 /home/user/downloads/
目录下。如果该目录不存在,wget
会尝试创建它。
3. 断点续传 (-c
)
网络连接不稳定或下载中断是常有的事。wget
的 -c
或 --continue
选项允许您从上次中断的地方继续下载,避免从头开始。
bash
wget -c http://example.com/large_file.tar.gz
如果在下载 large_file.tar.gz
的过程中中断(例如按 Ctrl+C),下次再执行相同的命令时,加上 -c
选项,wget
会检查本地已存在的文件大小,并请求服务器从文件的末尾处继续传输剩余部分。
工作原理: wget -c
会发送一个 HTTP Range 请求给服务器,告知服务器从文件的某个偏移量开始传输数据。并非所有服务器都支持 Range 请求,但大多数现代Web服务器都支持。
4. 下载到标准输出 (-O -
)
有时您可能不想将文件保存到本地文件,而是直接将下载的内容输出到标准输出 (stdout
)。这在管道 (pipe) 操作中非常有用,可以将下载的内容直接传递给另一个命令处理。
bash
wget -O - http://example.com/some_text_file.txt | less
这个命令会下载文本文件的内容,不保存到文件,而是直接通过管道 (|
) 将其输出给 less
命令进行分页查看。注意这里的 -O -
中的第二个 -
代表标准输出。
5. 后台下载 (-b
)
对于大型文件,您可能希望让 wget
在后台运行,这样您就可以继续使用终端执行其他任务。使用 -b
或 --background
选项可以实现后台下载。
bash
wget -b http://example.com/very_large_archive.rar
执行此命令后,wget
会立即将下载任务放入后台,并在终端中显示一个类似 Continuing in background, pid XXXX.
的消息,其中 XXXX
是后台进程的ID。下载进度和日志信息会写入当前目录下的 wget-log
文件。
要查看后台任务的日志,可以使用 tail
命令:
bash
tail -f wget-log
6. 限制下载速度 (--limit-rate
)
如果您不想让 wget
占用所有网络带宽,可以使用 --limit-rate
选项来限制下载速度。可以指定单位,如 K (千字节)、M (兆字节)。
bash
wget --limit-rate=500k http://example.com/media_file.mp4
这将下载速度限制在 500 KB/s。
bash
wget --limit-rate=2m http://example.com/huge_image.iso
这将下载速度限制在 2 MB/s。
7. 重试与等待 (--tries
, --wait
)
网络连接可能不稳定,下载可能会失败。wget
默认会尝试多次连接和重试。您可以使用 --tries
和 --wait
选项来控制重试次数和每次重试之间的等待时间。
bash
wget --tries=10 --wait=5 http://example.com/flaky_server/resource.dat
这会让 wget
在下载失败时最多重试 10 次,每次重试前等待 5 秒钟。
--tries=N
: 设置重试次数为 N。设置为inf
表示无限重试。--wait=S
: 设置每次重试前的等待时间为 S 秒。
8. 安静模式 (-q
) 和输出日志 (-o
)
默认情况下,wget
会在终端输出下载进度和信息。在脚本中或需要保持终端整洁时,您可能希望抑制这些输出。
-
-q
或--quiet
: 进入安静模式,不显示下载进度条和大多数消息。bash
wget -q http://example.com/silent_download.txt -
-o logfile
或--output-file=logfile
: 将所有的输出信息(包括进度和错误)重定向到指定的日志文件,而不是终端。bash
wget -o download.log http://example.com/file_to_log.pdf结合
-b
使用时,日志默认就是wget-log
,但你可以用-o
指定不同的日志文件。
9. 伪装用户代理 (-U
)
有些网站可能会检查用户代理 (User-Agent) 字符串,以判断请求是来自浏览器还是自动化工具,并可能阻止 wget
的默认用户代理。使用 -U
选项可以模拟不同的用户代理。
bash
wget -U "Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0" http://example.com/protected_resource.html
这会将用户代理设置为 Firefox 浏览器,有时可以绕过简单的反爬虫机制。
10. 使用 HTTP 头部 (--header
)
您可以添加自定义的 HTTP 头部信息到请求中。这对于需要发送特定的认证信息、referrer 或其他自定义头部的场景很有用。
bash
wget --header="Referer: http://example.com/some_page" http://example.com/linked_resource.zip
这会在请求中添加一个 Referer 头部。
第三部分:下载多个文件
wget
不仅能下载单个文件,也能一次下载多个文件。
1. 从文件中读取 URL 列表 (-i
)
如果您有一个包含多个 URL 的列表文件,可以使用 -i
或 --input-file
选项让 wget
批量下载。
首先创建一个文本文件,比如 urls.txt
,每行一个 URL:
http://example.com/file1.zip
http://example.com/images/pic2.jpg
http://another-site.com/document.pdf
然后执行命令:
bash
wget -i urls.txt
wget
会依次读取 urls.txt
中的每个 URL 并尝试下载。
第四部分:下载整个网站(递归下载)
wget
最强大的功能之一是递归下载,它可以从指定的 URL 开始,沿着页面中的链接下载整个网站或网站的一部分。这常用于创建网站的离线副本。
1. 启用递归下载 (-r
)
使用 -r
或 --recursive
选项可以启用递归下载。
bash
wget -r http://example.com/docs/
这个命令会下载 http://example.com/docs/
页面本身,并查找页面中的链接。如果链接指向同一域名下的其他页面或文件,wget
会继续下载这些资源,并重复此过程。
注意: 递归下载可能会下载大量文件,并对目标服务器造成较大负载,请谨慎使用,并确保您有权下载。
2. 控制递归深度 (-l
)
递归下载默认深度是 5 层。你可以使用 -l
或 --level
选项来控制递归的深度。
bash
wget -r -l 2 http://example.com/docs/
这将下载起始页面及其链接到的页面,但不会进一步跟踪第三层链接。
-l 0
或-l inf
: 表示无限深度,会尝试下载整个网站(非常危险,慎用)。-l 1
: 只下载起始 URL 指向的页面/文件,不递归到这些页面中的链接。
3. 过滤文件类型 (-A
, -R
)
在递归下载时,你可能只想下载特定类型的文件,或者排除某些类型。
-
-A acclist
或--accept=acclist
: 只下载符合指定后缀名或通配符的文件。多个模式用逗号分隔。bash
wget -r -A jpg,png,gif http://example.com/gallery/这会递归下载
/gallery/
目录及其子目录下的所有 JPG, PNG, GIF 图片。 -
-R rejlist
或--reject=rejlist
: 排除符合指定后缀名或通配符的文件。bash
wget -r -R html,css,js http://example.com/archive/这会递归下载
/archive/
目录下的所有内容,但会跳过 HTML, CSS, JavaScript 文件。
-A
和 -R
可以一起使用。
4. 下载到指定目录 (-P
与递归)
当结合 -r
和 -P
使用时,-P
指定的是保存整个下载结构的根目录。
bash
wget -r -P /home/user/website_backup http://example.com/
这会将 example.com
网站的内容下载到 /home/user/website_backup/
目录下,并保留网站原有的目录结构。
5. 镜像网站 (-m
)
镜像一个网站通常是为了创建一个完整的离线浏览副本。wget
提供了 -m
或 --mirror
选项,它是一个方便的组合选项,相当于同时使用了 -r -l inf -N -nv
。
-r
: 递归下载。-l inf
: 无限递归深度。-N
或--timestamping
: 启用时间戳。如果本地文件的时间戳比远程文件新,则不重新下载。这对于更新已下载的镜像非常有用。-nv
或--no-verbose
: 关闭详细输出,但会显示错误信息。
bash
wget -m http://example.com/
这个命令会尝试镜像整个 example.com
网站。再次强调,请谨慎使用 -m
或 -l inf
,它们可能导致下载量巨大,并对服务器造成负担。
重要的递归下载注意事项:
- 尊重 robots.txt:
wget
默认会遵守网站的robots.txt
文件中指定的抓取规则。这是一种良好的网络公民行为。如果你需要忽略robots.txt
(不推荐,除非你清楚自己在做什么且有正当理由),可以使用-e robots=off
选项,但这可能违反网站的使用条款。 -
下载频率: 默认情况下,
wget
下载速度很快。对于递归下载,建议使用--wait
和--random-wait
(在指定范围内随机等待) 选项来减缓下载速度,避免给服务器带来过大压力,也降低被封锁的风险。bash
wget -r --wait=5 --random-wait -l 2 http://example.com/some_section/这会在下载每个文件前至少等待 5 秒,并在 5-10 秒之间随机等待一段时间。
-
避免重复下载:
-N
(时间戳) 和-c
(断点续传) 在递归下载中都很有用。-N
确保你不会重复下载未修改的文件,-c
可以在下载中断后继续。-m
选项已经包含了-N
。
第五部分:处理特殊情况
1. HTTP 认证
如果需要下载的资源需要 HTTP 基本认证(用户名和密码),可以使用 --user
和 --password
选项。
bash
wget --user=myuser --password=mypassword http://example.com/protected/private.zip
2. 忽略证书错误
在连接到使用自签名证书或证书过期的 HTTPS 网站时,wget
默认会拒绝连接。如果您确定连接是安全的(例如在内部网络中),可以使用 --no-check-certificate
选项来忽略证书检查。
bash
wget --no-check-certificate https://internal-server/secure_file.tar.gz
警告: 使用此选项会禁用安全检查,使您面临中间人攻击的风险。除非您非常清楚风险并信任目标网站,否则不要使用此选项。
3. 处理 Cookies
有些网站需要 Cookies 来维持会话状态,例如登录后的下载链接。wget
可以加载和保存 Cookies。
--load-cookies file
: 从指定文件加载 Cookies。--save-cookies file
: 将接收到的 Cookies 保存到文件。
通常你需要先用浏览器或其他工具登录网站,导出 Cookies 到文件,然后用 wget
加载该文件进行下载。或者,对于一些简单情况,你也可以尝试用 wget
模拟登录并保存 Cookies:
“`bash
模拟登录(可能需要检查网站的登录表单和方法)
wget –save-cookies cookies.txt –post-data ‘user=myuser&password=mypassword’ http://example.com/login
使用保存的cookies下载需要登录后访问的页面或文件
wget –load-cookies cookies.txt http://example.com/members_area/exclusive_content.zip
“`
请注意,模拟登录是一个更高级的话题,需要分析网站的登录机制,这里只是一个示意。
第六部分:FTP 下载
除了 HTTP/HTTPS,wget
也支持 FTP (File Transfer Protocol)。基本语法类似,但可以使用一些特定的 FTP 选项。
bash
wget ftp://ftp.example.com/public/somefile.iso
对于需要认证的 FTP 服务器:
bash
wget ftp://user:[email protected]/private/document.pdf
或使用 --user
和 --password
选项:
bash
wget --user=ftpuser --password=ftppass ftp://ftp.example.com/private/document.pdf
wget
也支持 FTP 递归下载 (-r
),行为类似于 HTTP 递归。
第七部分:故障排除与常见问题
- 404 Not Found: 文件或页面不存在。检查 URL 是否正确。
- 403 Forbidden: 服务器拒绝访问。您可能没有权限下载该文件,或者服务器阻止了
wget
的用户代理。尝试使用-U
选项。 - Connection Refused: 无法连接到服务器。检查 URL 中的主机名和端口是否正确,以及防火墙设置。
- No such file or directory (when saving): 您指定的保存目录 (
-P
) 不存在,且wget
无法创建。检查目录路径或确保您有权限在该位置创建目录。 - Permission denied (when saving): 您没有权限在指定的目录下创建或写入文件。检查目标目录的权限,或者尝试在您有写入权限的目录下保存。
- Certificate verification failed: HTTPS 证书有问题。如果您确定要继续,可以使用
--no-check-certificate
(请注意风险)。 - 下载中断后没有续传: 确保您使用了
-c
选项。如果使用了-c
仍然无法续传,可能是服务器不支持 HTTP Range 请求。 - 递归下载量过大: 检查
-l
深度设置和-A/-R
过滤选项是否正确。考虑使用--wait
减缓速度。
您始终可以使用 man wget
命令来查看 wget
的完整帮助文档,了解所有可用选项的详细说明。
总结
wget
是一个功能强大、灵活多变的命令行下载工具。从简单的单文件下载到复杂的网站镜像,它都能胜任。掌握 wget
的常用选项,如 -O
, -P
, -c
, -r
, -l
, -A
, -R
, -m
等,将极大地提升您在命令行环境下获取网络资源的效率。
多加实践是掌握 wget
的关键。从下载小文件开始,逐步尝试使用断点续传、限速、批量下载,最后探索递归下载和网站镜像。记住,在使用递归下载等可能对服务器造成负担的功能时,请务必谨慎并尊重网站的规定。
希望这篇教程能够帮助您迈出使用 wget
的第一步!祝您下载愉快!