别再傻傻分不清了!curl和wget到底该用哪个?一文搞懂这两个下载神器
最近有粉丝小伙伴问,curl和wget有什么区别,什么时候用哪个比较好。说实话,这两个工具我用了好多年,刚开始的时候也是一脸懵逼,经常搞混。
记得刚开始接触那会儿,领导让我写个脚本下载文件,我就随便用了个wget,结果遇到需要POST数据的时候就傻眼了,折腾了半天才发现curl更合适。后来慢慢摸索,才算是把这两个工具的门道摸清楚了。
今天就来跟大家聊聊这两个命令行下载工具的区别和使用技巧,希望能帮到正在纠结的朋友们。
curl是什么鬼?
curl这个名字其实挺有意思的,全称是"Client URL",顾名思义就是一个URL客户端工具。它最大的特点就是支持的协议特别多,HTTP、HTTPS、FTP、FTPS、SCP、SFTP、LDAP等等,基本上你能想到的网络协议它都支持。
我平时用curl最多的场景就是测试API接口。比如说要测试一个REST API,用curl简直不要太方便:
[root@webtest ~]# curl -X GET https://v2.jinrishici.com/token
{"status":"success","data":"5w1dZp7lNh+NpR0Ws6OG6TGCqp/2UgMf"}
这样就能快速看到接口返回的数据,比打开浏览器或者用Postman要快多了。
curl还有个很牛的地方就是它的参数特别丰富,几乎可以模拟任何HTTP请求。想要发送POST请求?没问题:
curl -X POST -H "Content-Type: application/json" -d '{"name":"张三","age":25}' https://api.example.com/users
需要带认证信息?也很简单:
curl -u username:password https://api.example.com/protected
或者用Bearer token:
curl -H "Authorization: Bearer your_token_here" https://api.example.com/data
wget又是个什么东西?
wget的全称是"Web Get",从名字就能看出来,它主要是用来从网络上获取文件的。相比curl,wget更专注于下载这一件事,但是在下载方面它做得确实很出色。
wget最让我印象深刻的就是它的递归下载功能。有一次需要备份一个静态网站,用wget一条命令就搞定了:
wget -r -np -k -L -p https://example.com/
这条命令会把整个网站都下载下来,包括CSS、JS、图片等所有资源,而且还会自动调整链接,下载完直接就能在本地打开。
wget还有个很实用的功能就是断点续传。下载大文件的时候网络断了不用担心,加个-c参数就能接着下载:
wget -c https://example.com/bigfile.zip
这个功能在网络不稳定的时候简直是救命稻草。
两者的主要区别在哪里?
用了这么多年,我觉得最大的区别就是设计理念不同。curl更像是一个瑞士军刀,什么都能干,但是每样都不是最专业的;wget就像是一个专业的下载工具,在下载这件事上做得特别精细。
从使用场景来说,我一般是这样选择的:
- 需要测试API、发送复杂HTTP请求的时候用curl
- 单纯下载文件,特别是大文件或者需要递归下载的时候用wget
- 需要在脚本里处理HTTP响应数据的时候用curl
- 需要镜像整个网站或者批量下载的时候用wget
curl的高级用法
说到curl的高级用法,那可真是太多了。我经常用到的几个技巧分享给大家:
保存响应头信息
有时候需要查看服务器返回的头信息,可以用-I参数:
curl -I https://www.baidu.com
或者既要响应体又要响应头:
curl -i https://api.example.com/data
跟随重定向
默认情况下curl不会跟随重定向,需要加-L参数:
curl -L https://short.url/abc123
设置超时时间
网络不好的时候设置个超时时间很有必要:
curl --connect-timeout 10 --max-time 30 https://slow.server.com
使用代理
需要通过代理访问的时候:
curl --proxy http://proxy.server:8080 https://example.com
上传文件
curl还能上传文件,这个功能很多人不知道:
curl -X POST -F "file=@/path/to/file.txt" https://upload.example.com
保存和使用Cookie
处理需要登录的网站时,Cookie管理很重要:
# 保存cookie
curl -c cookies.txt -d "username=admin&password=123456" https://example.com/login
# 使用cookie
curl -b cookies.txt https://example.com/protected
wget的实用技巧
wget虽然看起来简单,但是用好了也很强大。
限制下载速度
在服务器上下载大文件的时候,为了不影响其他服务,可以限制下载速度:
wget --limit-rate=200k https://example.com/bigfile.zip
后台下载
下载大文件时可以放到后台运行:
wget -b https://example.com/hugefile.iso
下载进度会保存在wget-log文件里,可以用tail命令查看:
tail -f wget-log
批量下载
有个URL列表文件的话,可以批量下载:
wget -i urls.txt
urls.txt文件里每行一个URL就行。
设置重试次数
网络不稳定的时候可以设置重试:
wget --tries=3 --waitretry=2 https://unstable.server.com/file.zip
递归下载的高级选项
递归下载网站的时候,有很多参数可以控制行为:
wget -r -np -nd -A "*.pdf" -R "*.html" https://example.com/documents/
这条命令会递归下载所有PDF文件,但是排除HTML文件,而且不创建目录结构。
实际工作中的应用场景
在实际工作中,我经常遇到这样的场景:
监控网站可用性
写个简单的脚本监控网站是否正常:
#!/bin/bash
response=$(curl -s -o /dev/null -w "%{http_code}" https://mywebsite.com)
if [ $response -eq 200 ]; then
echo "网站正常"
else
echo "网站异常,状态码:$response"
fi
自动化部署脚本
部署的时候经常需要下载最新的安装包:
#!/bin/bash
# 获取最新版本号
latest_version=$(curl -s https://api.github.com/repos/user/project/releases/latest | grep tag_name | cut -d '"' -f 4)
# 下载最新版本
wget https://github.com/user/project/releases/download/${latest_version}/project-${latest_version}.tar.gz
API接口测试
测试POST接口的时候,curl特别方便:
# 测试用户注册接口
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"username": "testuser",
"email": "test@example.com",
"password": "123456"
}' \
https://api.example.com/register
文件备份
定期备份重要文件到远程服务器:
#!/bin/bash
# 打包文件
tar -czf backup-$(date +%Y%m%d).tar.gz /important/data/
# 上传到远程服务器
curl -T backup-$(date +%Y%m%d).tar.gz ftp://backup.server.com/backups/ --user username:password
常见问题和解决方案
用这两个工具的时候,经常会遇到一些问题,我把常见的几个列出来:
SSL证书问题
有时候遇到自签名证书或者证书有问题的网站,可以跳过证书验证:
# curl跳过证书验证
curl -k https://self-signed.example.com
# wget跳过证书验证
wget --no-check-certificate https://self-signed.example.com/file.zip
不过这样做有安全风险,生产环境要谨慎使用。
中文文件名乱码
下载中文文件名的文件时可能会乱码,可以设置编码:
wget --restrict-file-names=nocontrol https://example.com/中文文件.zip
大文件下载超时
下载大文件时经常会超时,可以调整超时设置:
# curl设置超时
curl --connect-timeout 30 --max-time 3600 -O https://example.com/bigfile.zip
# wget设置超时
wget --timeout=30 --read-timeout=3600 https://example.com/bigfile.zip
最后
说了这么多,其实curl和wget都是非常优秀的工具,关键是要根据实际需求来选择。curl更适合做接口测试和复杂的HTTP操作,wget更适合纯粹的文件下载任务。
我建议大家两个工具都学会,这样在不同场景下就能选择最合适的工具。刚开始可能会觉得参数太多记不住,但是用多了自然就熟练了。
最重要的是要多实践,光看教程是学不会的。可以找一些实际的场景来练手,比如写个监控脚本、做个自动化部署什么的,这样印象会更深刻。
如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!
公众号:运维躬行录
个人博客:躬行笔记