curl 以其广泛的协议支持和灵活的控制能力而著称,而 wget 则因其非交互式、稳定可靠的下载能力和递归功能而广受欢迎。它们是文件下载、API 交互、网站镜像等任务中不可或缺的命令行工具。

工具用途简述特点概括
curl万能 HTTP 请求构造工具支持 GET/POST/PUT/DELETE 等
wget下载文件利器(支持递归、断点)易用、稳定、支持多协议
httpie更易读的 API 请求构造工具json友好,语法直观
scpSSH 安全文件复制简洁、需 SSH 连接
rsync增量同步工具快速、节省带宽
aria2多协议多线程下载器BT、磁链、HTTP 多线程支持

curl 是一个非常强大且灵活的工具,支持多种网络协议,包括 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、SMB、DICT、TELNET 等。它不仅可以下载文件,还可以上传文件、与 API 交互(发送 GET、POST、PUT、DELETE 请求)、处理 Cookie、支持代理等。

1. curl 常用命令示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 基础使用
curl https://example.com

# 下载文件
curl -O https://example.com/file.zip # 保留原文件名
curl -o newname.zip https://example.com/file.zip # 指定保存为 newname.zip

# 提交表单数据(POST 表单)
curl -X POST -d "user=beiziya&pass=123" https://example.com/login

# 提交 JSON 数据
curl -X POST -H "Content-Type: application/json" \
-d '{"name": "杯子", "email": "beizi@site.com"}' \
https://api.example.com/register

# 保存响应头和内容
curl -i https://example.com # 同时输出响应头和响应体
curl -D headers.txt -o body.txt https://example.com # 头保存到 headers.txt,内容保存到 body.txt

# 跟踪跳转
curl -L https://short.url/abcd # 自动跟踪 301/302 跳转

# 上传文件
curl -T local_file.txt ftp://ftp.example.com/uploads/

# 添加 Cookie 和 Header
curl -b "sessionid=xxx" -H "User-Agent: Mozilla" https://example.com

# 事用户认证
curl -u username:password https://protected.example.com/resource

1.1. curl:多协议数据传输工具

curl (Client for URLs) 是一个功能极其强大的命令行工具和库,用于通过各种协议传输数据。它支持 DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Telnet, TFTP 等众多协议。这使得它成为一个万能的数据传输工具,无论你是想下载一个文件、测试一个 API、发送 HTTP 请求还是进行协议调试,curl 都能胜任。

curl 的核心是其能够模拟各种客户端行为,发送自定义请求,并接收服务器响应。它既可以下载文件,也可以用于上传数据。

深入解析与高级应用

  1. 基本下载与显示:
    • curl <URL>: 默认会向 URL 发送 GET 请求,并将服务器响应(通常是文件内容)输出到标准输出。
      • 示例: curl example.com (显示网页内容)
      • 示例: curl -O <URL>: 将 URL 对应的内容保存到当前目录下,文件名与 URL 中的文件名相同。
        • curl -O https://example.com/file.zip
      • 示例: curl -o <filename> <URL>: 将 URL 对应的内容保存到指定文件中。
        • curl -o my_page.html example.com
  2. HTTP/HTTPS 高级请求: curl 在 HTTP/HTTPS 方面功能尤其强大。
    • -X <METHOD> (request method): 指定 HTTP 请求方法(GET, POST, PUT, DELETE, HEAD 等)。
      • 示例: curl -X POST https://api.example.com/data
    • -H <header> (header): 添加自定义 HTTP 请求头
      • 用途: 发送认证令牌、指定 Content-Type、自定义 User-Agent 等。
      • 示例: curl -H "Authorization: Bearer my_token" -H "Content-Type: application/json" https://api.example.com/resource
    • -d <data> (data): 发送 POST 请求的数据。默认以 application/x-www-form-urlencoded 格式发送。
      • 用途: 提交表单数据或 JSON 数据。
      • 示例 (表单): curl -d "name=John Doe&age=30" https://example.com/submit
      • 示例 (JSON): curl -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com/data
    • --data-binary <data>: 发送原始二进制数据,不进行 URL 编码。
      • 用途: 上传文件内容或发送原始请求体。
      • 示例: curl --data-binary @image.jpg https://example.com/upload (上传本地文件 image.jpg 的内容)
    • -F <name=value> (form): 发送 multipart/form-data 类型的数据(用于文件上传)。
      • 示例: curl -F "file=@/path/to/local/file.txt" -F "description=My file" https://example.com/upload
    • -u <user:password> (user): 指定认证的用户名和密码
      • 用途: HTTP Basic Authentication。
      • 示例: curl -u admin:password http://api.example.com/protected
    • -L (location): 跟随 HTTP 3xx 重定向
      • 用途: 访问被重定向的 URL。
      • 示例: curl -L http://old-domain.com
    • -I (head): 只获取 HTTP 响应头,不下载内容。
      • 用途: 快速检查 URL 是否可达、状态码、服务器信息等。
      • 示例: curl -I https://example.com
    • --verbose (or -v): 显示详细的通信过程,包括请求头、响应头、SSL/TLS 握手信息等。
      • 用途: 调试网络请求、分析协议行为。
      • 示例: curl -v https://api.example.com/test
  3. Cookies:
    • -b <file> (cookie-jar): 从文件中读取 cookies 发送
    • -c <file> (cookie-jar): 将接收到的 cookies 写入文件
      • 用途: 模拟浏览器会话,进行带有会话管理功能的测试。
      • 示例: curl -c cookies.txt https://example.com/login -> curl -b cookies.txt https://example.com/profile
  4. SSL/TLS 控制:
    • -k (insecure): 禁用 SSL/TLS 证书验证
      • 风险: 生产环境不推荐,但调试自签名证书或临时测试时有用。
      • 示例: curl -k https://self-signed.example.com
    • --cacert <file>: 指定 CA 证书文件,用于验证服务器证书。
    • --cert <file>: 指定客户端证书文件。
  5. 代理:
    • -x <[protocol://]host[:port]> (proxy): 通过代理服务器发送请求
      • 示例: curl -x http://myproxy.com:8080 http://example.com
  6. 速度限制与超时:
    • --limit-rate <speed>: 限制传输速度。
    • --connect-timeout <seconds>: 连接超时。
    • -m <seconds> (max-time): 总操作超时。
  7. curl 与其他工具:
    • curl 是一个数据传输工具,它的输出通常是原始的 HTTP 响应体。你经常需要结合其他工具来解析这些数据:
      • curl ... | jq '.' (解析 JSON)
      • curl ... | xmllint --format - (格式化 XML)
      • curl ... | grep "keyword" (过滤特定内容)

curl 的优势

  • 协议支持广泛: 几乎能处理所有常见的网络协议。
  • 高度可定制: 可以完全控制请求头、请求体、认证、Cookie、代理等。
  • 脚本友好: 命令行接口简洁,易于在脚本中集成。
  • 调试利器: 详细的 -v 输出和错误处理能力使其成为网络协议调试的首选。
  • 跨平台: 在所有主流操作系统上均可用。

实际应用场景

  • API 测试与交互: 模拟各种 HTTP 请求(GET/POST/PUT/DELETE),测试 RESTful API 接口。
  • 网站内容抓取: 获取网页 HTML 内容,进行数据分析或自动化。
  • 文件下载与上传: 安全高效地下载和上传文件(支持 FTP, SFTP, HTTP/S)。
  • 网络服务健康检查: 通过发送特定请求检查服务的响应状态。
  • 自动化脚本: 用于 CI/CD 流程、监控脚本等自动化任务中进行网络通信。
  • 协议调试: 深入分析 HTTP/HTTPS、FTP 等协议的通信过程。

2. wget 常用命令示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 基本下载 下载文件到当前目录
wget https://example.com/file.zip

# 下载文件到指定目录
wget -P /path/to/directory https://example.com/file.txt

# 断点续传
wget -c https://example.com/largefile.iso

# 后台下载
wget -b https://example.com/very_large_file.iso

# 下载一个目录下(或其子目录)的文件,并将其本地链接转换为可离线浏览的相对链接
wget -r -np -k https://example.com/docs/

# 镜像网站(递归下载)
wget --mirror --convert-links --page-requisites --no-parent https://www.example.com

# 使用代理
wget -e use_proxy=yes -e http_proxy=127.0.0.1:7890 https://example.com

# 从列表批量下载
wget -i urllist.txt # urllist.txt 每行一个 URL

2.1. wget:非交互式网络下载器

wget 是一个非交互式的命令行下载工具,主要用于从 Web 和 FTP 服务器下载文件。它特别适合在后台运行,并在网络不稳定时具有强大的断点续传能力。与 curl 相比,wget 更专注于文件的下载,而不是通用的数据传输和协议测试。

wget 的核心能力是稳定地下载文件,包括支持递归下载整个网站、处理重定向、以及在下载中断后恢复。

深入解析与高级应用

  1. 基本下载:
    • wget <URL>: 将 URL 指定的文件下载到当前目录。
      • 示例: wget https://example.com/file.zip
    • wget -O <filename> <URL>: 将下载内容保存到指定文件中。
      • 示例: wget -O my_archive.tar.gz http://example.com/archive.tar.gz
  2. 断点续传 (-c):
    • wget -c <URL>: 从上次中断的地方继续下载
      • 用途: 对于大文件或网络连接不稳定的情况非常有用。
      • 示例: wget -c https://large_file.iso (即使下载中断,下次运行此命令也能从上次断点继续)
  3. 递归下载 (-r):
    • wget -r <URL>: 递归下载整个网站或指定目录
      • 用途: 下载网站镜像、离线浏览。
      • 风险: 小心使用,可能下载大量不必要的内容,甚至触发服务器限制。
      • 示例: wget -r https://example.com/docs/
    • -l <depth> (level): 设置递归下载的深度
      • 示例: wget -r -l 2 https://example.com (只下载两层目录)
    • -np (no-parent): 不追溯到父目录。配合 -r 使用,防止下载不相关的内容。
    • -k (convert links): 将下载的 HTML 文档中的链接转换为相对链接,以便离线浏览。
    • -p (page-requisites): 下载所有显示网页所需的图片、CSS、JS 等文件
      • 示例: wget -r -l inf -np -k -p http://example.com/ (下载整个网站并转换为离线浏览)
  4. 后台下载 (-b):
    • wget -b <URL>: 在后台执行下载,并将日志输出到 wget-log 文件。
      • 用途: 启动长时间下载后可以关闭终端。
      • 示例: wget -b https://very_large_file.zip
  5. 限速与重试:
    • --limit-rate=<speed>: 限制下载速度
      • 示例: wget --limit-rate=100k https://example.com/file.zip (限制为 100 KB/s)
    • --tries=<number>: 设置重试次数。默认通常是 20 次。
    • --retry-connrefused: 即使连接被拒绝也重试。
  6. HTTP/HTTPS 相关:
    • --user-agent=<agent-string>: 设置 User-Agent 字符串
    • --header=<header-string>: 添加自定义 HTTP 头
    • --post-data=<data> / --post-file=<file>: 发送 POST 请求
    • --no-check-certificate: 不验证 SSL/TLS 证书(与 curl -k 类似,不推荐生产使用)。
  7. 认证:
    • --user=<user> / --password=<password>: HTTP 或 FTP 认证。
    • --ask-password: 交互式地询问密码。

curl vs. wget 总结

  • curl: 更像是数据传输的瑞士军刀。它专注于数据的输入和输出,支持更多协议,能够精确控制请求的每个细节(如各种 HTTP 头、请求方法、数据体),并且输出可以很容易地被管道到其他工具进行处理。它是进行 API 测试、Web 调试、协议分析和复杂数据交互的首选。
  • wget: 更专注于文件的下载和网站的镜像。它具有强大的递归下载、断点续传和后台运行能力,更适合于自动化下载任务、创建本地网站副本等场景。

实际应用场景

  • curl:
    • 测试 RESTful API 端点。
    • 通过 POST 请求提交数据到 Web 表单或服务。
    • 获取 HTTP 响应头以调试 Web 服务器。
    • 模拟用户代理或 referrer 来访问特定内容。
    • 在脚本中与各种网络服务进行数据交换。
  • wget:
    • 下载软件包、ISO 镜像或其他大型文件。
    • 创建网站的本地备份或离线镜像。
    • 在服务器上执行非交互式文件下载任务。
    • 编写下载脚本,利用其断点续传和重试机制。

这两款工具在功能上有所重叠,但各自的侧重点和设计哲学不同。在实际工作中,你会发现它们都是不可或缺的,通常会根据具体任务的特点来选择使用哪一个。


3. httpie 常用命令示例(推荐调试 API)

1
2
3
4
5
6
7
8
# 基本 GET 请求
http https://api.example.com/users

# 提交 JSON 数据
http POST https://api.example.com/users name=beizi age=30

# 使用 Header 和 Auth
http GET https://api.example.com/profile "Authorization:Bearer <token>"

4. scprsync 命令示例(远程复制)

1
2
3
4
5
6
7
8
# 上传本地文件到远程服务器
scp file.txt user@192.168.1.100:/home/user/

# 从远程服务器复制到本地
scp user@192.168.1.100:/home/user/file.txt ./

# 使用 rsync 进行增量备份
rsync -avz file.txt user@remote:/path/ # -a归档,-v显示,-z压缩

5. aria2c 命令示例(多线程 + 多协议下载)

1
2
3
4
5
6
7
8
9
# 基本下载
aria2c https://example.com/file.zip

# 多线程下载(16线程)
aria2c -x 16 -s 16 https://example.com/bigfile.iso

# 下载 BT 或磁力链接
aria2c file.torrent
aria2c "magnet:?xt=urn:btih:xxxx..."