Linux wget 命令详解:从基础到高级下载技巧

摘要 :wget 是 Linux 下经典的命令行下载工具,支持断点续传、后台下载、限速、递归镜像网站等核心功能。本文从 wget 的工作机制出发,详解 -c(断点续传)、-b(后台下载)、--limit-rate(限速)、--mirror(镜像网站)等高频参数,并结合批量下载、模拟浏览器、认证下载等实战场景给出可复用的命令示例。最后通过 wget 与 curl 的对比、性能优化技巧和常见问题排查,帮助读者全面掌握 wget 的使用方法。

wget 是 Linux 系统中最经典的命令行下载工具之一。相比图形化下载器,它支持断点续传、后台下载、限速等功能,尤其适合服务器环境下的自动化任务。这篇文章从实现原理到实战技巧,带你掌握 wget 的精髓。

wget 的核心机制

wget 的设计哲学是"非交互式下载"------不需要用户守在屏幕前,它自己会处理重试、超时、重定向等问题。

基本工作流程:

  1. 解析 URL,建立 TCP 连接
  2. 发送 HTTP/HTTPS/FTP 请求
  3. 接收响应,写入本地文件
  4. 遇到中断时记录进度,支持续传

这意味着你可以把它丢到后台,或者写进 crontab 定时任务,它自己会搞定一切。

必须掌握的常用参数

1. 指定文件名和路径

bash 复制代码
# 下载时重命名
wget -O backup.tar.gz https://example.com/file.tar.gz

# 指定下载目录
wget -P /tmp/downloads https://example.com/file.zip

-O 会覆盖同名文件,-P 则保留原始文件名。两个参数可以组合使用。

2. 断点续传:网络中断的救星

bash 复制代码
# 启用断点续传
wget -c https://example.com/large-file.iso

原理是 wget 会在本地记录已下载的字节数,下次连接时发送 Range: bytes=已下载字节数- 请求头,服务器返回剩余数据。前提是服务器支持断点续传(响应头包含 Accept-Ranges: bytes)。

3. 后台下载与日志记录

bash 复制代码
# 后台运行,日志输出到 wget-log
wget -b https://example.com/bigfile.zip

# 指定日志文件
wget -b -o download.log https://example.com/bigfile.zip

后台模式下,wget 会将输出重定向到文件,即使关闭终端也不会中断。

4. 限速:避免拖垮网络

bash 复制代码
# 限制下载速度为 1MB/s
wget --limit-rate=1m https://example.com/file.iso

这在服务器环境下尤其有用,防止下载占满带宽影响其他服务。支持 k(KB/s)和 m(MB/s)单位。

5. 递归下载整个网站

bash 复制代码
# 镜像整个网站
wget --mirror --convert-links --adjust-extension https://example.com
  • --mirror:启用镜像模式(等同于 -r -N -l inf --no-remove-listing
  • --convert-links:将链接转换为本地链接
  • --adjust-extension:根据 Content-Type 添加正确的文件扩展名

6. 处理 HTTPS 证书问题

bash 复制代码
# 忽略证书检查(测试环境)
wget --no-check-certificate https://self-signed.badssl.com/

测试自签名证书的服务器时,这个参数很有用。生产环境不建议使用。

实战场景

批量下载文件列表

bash 复制代码
# 从文件读取 URL 列表
cat > urls.txt << EOF
https://example.com/file1.zip
https://example.com/file2.zip
https://example.com/file3.zip
EOF

wget -i urls.txt

-i 参数从文件读取 URL,每行一个,适合批量下载场景。

模拟浏览器请求

bash 复制代码
# 添加 User-Agent 和 Referer
wget --user-agent="Mozilla/5.0" \
     --referer="https://example.com" \
     https://example.com/download/file.zip

有些网站会检查 User-Agent 和 Referer,用这个方法可以绑过简单的反爬虫检测。

下载需要认证的资源

bash 复制代码
# HTTP Basic 认证
wget --user=username --password=secret https://example.com/protected.zip

# 使用 Cookie
wget --header="Cookie: session=abc123" https://example.com/user/file.zip

超时与重试控制

bash 复制代码
# 设置超时时间为 30 秒,最多重试 5 次
wget --timeout=30 --tries=5 https://example.com/file.zip

网络不稳定时,合理设置超时和重试次数能提高成功率。

wget vs curl:如何选择

特性 wget curl
设计目标 下载文件 数据传输
断点续传 原生支持 需手动实现
递归下载 支持 不支持
协议支持 HTTP/HTTPS/FTP HTTP/HTTPS/FTP/SCP/SFTP等
上传功能 不支持 支持
库支持 libcurl

简单说:下载文件用 wget,API 调试用 curl

性能优化技巧

1. 并发下载大文件

wget 本身不支持多线程,但可以用 xargs 启动多个实例:

bash 复制代码
# 分块下载(需要服务器支持 Range 请求)
# 先获取文件大小
size=$(curl -sI https://example.com/bigfile.zip | grep -i content-length | awk '{print $2}')
# 然后手动分块下载

更好的选择是使用 axelaria2 等多线程下载工具。

2. 连接池复用

下载多个小文件时,使用 --keep-session-cookies 复用连接:

bash 复制代码
wget --keep-session-cookies --save-cookies cookies.txt \
     --load-cookies cookies.txt \
     -i urls.txt

3. DNS 缓存优化

bash 复制代码
# 强制使用指定 DNS
wget --no-dns-cache --inet4-only https://example.com/file.zip

某些情况下禁用 DNS 缓存可以解决解析错误问题。

常见问题排查

下载卡住不动

检查网络连接和防火墙规则:

bash 复制代码
# 测试连通性
curl -I https://example.com/file.zip

# 查看详细过程
wget -d https://example.com/file.zip

-d 参数输出调试信息,能看到请求头和响应头的完整内容。

文件名乱码

URL 中的中文会被编码,下载后文件名显示为 %E4%B8%AD%E6%96%87。解决方法:

bash 复制代码
# 使用 --restrict-file-names 控制编码
wget --restrict-file-names=nocontrol https://example.com/中文文件.zip

下载不完整

检查磁盘空间和权限:

bash 复制代码
df -h /tmp
ls -l /tmp/downloads

某些文件系统(如 FAT32)有 4GB 文件大小限制。

总结

wget 的核心价值在于自动化友好------后台运行、断点续传、限速控制,这些特性让它成为服务器下载的首选工具。掌握常用参数后,你可以在脚本中灵活运用,构建可靠的下载流程。

核心要点回顾

  • -c 断点续传是必背参数
  • -b 后台下载适合大文件
  • --limit-rate 限速保护带宽
  • --mirror 递归下载整个网站
  • -i 从文件批量下载

相关工具推荐

相关推荐
AlfredZhao11 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346617 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪18 小时前
linux 拷贝文件或目录到指定的位置
linux
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
小宇宙Zz1 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信