curl与wget实战:Linux下HTTP请求的自动化脚本化方案
作为HTTP协议的经典命令行工具,通过脚本化封装可实现文件下载、API调用、自动化测试等高频场景的效率革命。可替代Python/Go等语言实现80%的HTTP自动化需求,尤其在资源受限的嵌入式Linux环境中更具优势。echo "服务不可用" | mail -s "告警" admin@example.com。&& echo "API调用成功" || echo "API调用失败"echo "所有文件

在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="https://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="https://example.com/docs/file1.pdf https://example.com/docs/file2.pdf" |
|
|
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 "$(basename $url)" "$url" 2>> "$LOG_FILE" & |
|
|
done |
|
|
# 等待所有后台任务完成 |
|
|
wait |
|
|
echo "所有文件下载完成,日志见$LOG_FILE" |
核心参数:
- -c断点续传
- -t 3重试3次
- -O自定义文件名
- --header模拟浏览器请求
三、高级脚本化方案
定时任务集成
bash
|
# 每天凌晨2点同步远程日志 |
|
|
0 2 * * * /usr/bin/curl -s "https://logs.example.com/sync" --data-urlencode "token=SECRET" > /dev/null |
错误处理增强
bash
|
if ! curl -f -o /dev/null "https://api.example.com/health"; then |
|
|
echo "服务不可用" | mail -s "告警" admin@example.com |
|
|
fi |
跨平台兼容性
bash
|
# 使用条件判断适配不同系统 |
|
|
if command -v curl &> /dev/null; then |
|
|
HTTP_CMD="curl -s" |
|
|
else |
|
|
HTTP_CMD="wget -qO-" |
|
|
fi |
|
|
$HTTP_CMD "https://example.com/data" | jq . |
四、性能优化建议
- 连接复用: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流水线实现全链路自动化。
更多推荐


所有评论(0)