最近有粉丝小伙伴问,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更适合纯粹的文件下载任务。

我建议大家两个工具都学会,这样在不同场景下就能选择最合适的工具。刚开始可能会觉得参数太多记不住,但是用多了自然就熟练了。

最重要的是要多实践,光看教程是学不会的。可以找一些实际的场景来练手,比如写个监控脚本、做个自动化部署什么的,这样印象会更深刻。

如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!

公众号:运维躬行录

个人博客:躬行笔记

标签: none