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/datawgetwget简介
wgetwget的全称是"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/protectedwget的实用技巧
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.txturls.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
评论 (0)