在Linux运维与开发中,curl和wget作为HTTP协议的经典命令行工具,通过脚本化封装可实现文件下载、API调用、自动化测试等高频场景的效率革命。本文从实战角度解析两者的核心能力与脚本化技巧。
一、工具特性对比与选型****
| 维度 | curl | wget |
|---|---|---|
| 核心定位 | HTTP协议调试与数据传输 | 递归下载与离线资源获取 |
| 协议支持 | HTTP/1.1、HTTP/2、HTTPS、FTP等 | HTTP/HTTPS、FTP,支持断点续传 |
| 脚本优势 | 精细控制请求头/体,支持JSON/XML | 内置递归爬取逻辑,适合批量下载 |
| 典型场景 | API调用、服务健康检查、性能测试 | 静态资源备份、网站镜像、日志归档 |
二、自动化脚本化实战****
1. API自动化调用(curl)****
bash
| #!/bin/bash | |||
|---|---|---|---|
| # 定义变量 | |||
| API_URL="api.example.com/users" | |||
| TOKEN="Bearer abc123xyz" | |||
| # 发送带认证的POST请求 | |||
| curl -X POST "$API_URL" \ | |||
| -H "Authorization: $TOKEN" \ | |||
| -H "Content-Type: application/json" \ | |||
| -d '{"name":"test","email":"test@example.com"}' \ | |||
| -o response.json -sS \ | |||
| && echo "API调用成功" | echo "API调用失败" | ||
| # 解析JSON响应 | |||
| USER_ID=$(jq -r '.id' response.json 2>/dev/null) | |||
| if [ -n "$USER_ID" ]; then | |||
| echo "创建用户ID: $USER_ID" >> api_log.txt | |||
| fi |
关键技巧:
· -sS静默模式+错误输出
· jq工具解析JSON响应
· 结合&&/||实现条件执行
2. 批量资源下载(wget)****
bash
| #!/bin/bash | |
|---|---|
| # 下载网站所有PDF文件 | |
| URL_LIST="example.com/docs/file1.… example.com/docs/file2.…" | |
| LOG_FILE="download.log" | |
| # 多线程并发下载(GNU wget支持) | |
| for url in $URL_LIST; do | |
| wget -c -q -t 3 --show-progress \ | |
| --header="User-Agent: MyBot/1.0" \ | |
| -O "url)" "LOG_FILE" & | |
| done | |
| # 等待所有后台任务完成 | |
| wait | |
| echo "所有文件下载完成,日志见$LOG_FILE" |
核心参数:
· -c断点续传
· -t 3重试3次
· -O自定义文件名
· --header模拟浏览器请求
三、高级脚本化方案****
1.
定时任务集成
2.
3.
bash
4.
5.
| # 每天凌晨2点同步远程日志 | |
|---|---|
| 0 2 * * * /usr/bin/curl -s "logs.example.com/sync" --data-urlencode "token=SECRET" > /dev/null |
6.
7.
错误处理增强
8.
9.
bash
10.
11.
| if ! curl -f -o /dev/null "api.example.com/health"; then | ||
|---|---|---|
| echo "服务不可用" | mail -s "告警" admin@example.com | |
| fi |
12.
13.
跨平台兼容性
14.
15.
bash
16.
17.
| # 使用条件判断适配不同系统 | ||
|---|---|---|
| if command -v curl &> /dev/null; then | ||
| HTTP_CMD="curl -s" | ||
| else | ||
| HTTP_CMD="wget -qO-" | ||
| fi | ||
| $HTTP_CMD "example.com/data" | jq . |
18.
四、性能优化建议****
· 连接复用:curl --keepalive-time 60(减少TCP握手开销)
· 并发控制:xargs -P 4(限制最大并发数)
· 缓存复用:wget --cache=on --directory-prefix=./cache
通过脚本化封装,curl和wget可替代Python/Go等语言实现80%的HTTP自动化需求,尤其在资源受限的嵌入式Linux环境中更具优势。实际项目中建议结合crontab、systemd timer或CI/CD流水线实现全链路自动化。