Linux 使用 curl 命令进行网络请求
curl 命令利用 url 在命令行下工作的传输工具,它支持包括 file、ftp、ftps、http、https、imap、imaps、ldap、ldaps、mqtt、pop、pop3s、rtmp、rtmps、rtsp、scp、sftp、smb、smbs、smtp、smtps、telnet 和 tftp 等协议。
除了上述协议外,它还支持代理、用户身份验证、POST 请求、SSL 连接、cookie、metalink、dict、gopher 等。
一、语法及选项
语法:curl [options] [URL...]
选项:
- -d, --data <data> 主要是针对 http 协议的 post 请求指定要在消息体中发送的数据。
- -i, --include 显示包含 http 消息头返回的信息输出。
- -I, --header 只获取 http 协议的消息头信息,若是作用在 FTP 协议时,只获取文件大小和最后一次修改时间信息。
- -H, --header <header> 主要是针对 http 协议的消息头进行设置,常用的有 -H "Content-Type:application/json"。
- -o, --output <file> 将服务器的响应保存成文件,等同于 wget 命令。
- -X, --request <command> 指定 http 协议的请求方式,默认为 GET 请求。
其他常用参数分类
# 调试类
- -v, --verbose 输出信息
- -q, --disable 在第一个参数位置设置后 .curlrc 的设置直接失效,这个参数会影响到 -K, --config -A, --user-agent -e, --referer
- -K, --config FILE 指定配置文件
- -L, --location 跟踪重定向 (H)
# CLI显示设置
- -s, --silent Silent模式。不输出任务内容
- -S, --show-error 显示错误. 在选项 -s 中,当 curl 出现错误时将显示
- -f, --fail 不显示 连接失败时HTTP错误信息
- -i, --include 显示 response的header (H/F)
- -I, --head 仅显示 响应文档头
- -l, --list-only 只列出FTP目录的名称 (F)
- -#, --progress-bar 以进度条 显示传输进度
# 数据传输类
- -X, --request [GET|POST|PUT|DELETE|…] 使用指定的 http method 例如 -X POST
- -H, --header <header> 设定 request里的header 例如 -H "Content-Type: application/json"
- -e, --referer 设定 referer (H)
- -d, --data <data> 设定 http body 默认使用 content-type application/x-www-form-urlencoded (H)
- --data-raw <data> ASCII 编码 HTTP POST 数据 (H)
- --data-binary <data> binary 编码 HTTP POST 数据 (H)
- --data-urlencode <data> url 编码 HTTP POST 数据 (H)
- -G, --get 使用 HTTP GET 方法发送 -d 数据 (H)
- -F, --form <name=string> 模拟 HTTP 表单数据提交 multipart POST (H)
- --form-string <name=string> 模拟 HTTP 表单数据提交 (H)
- -u, --user <user:password> 使用帐户,密码 例如 admin:password
- -b, --cookie <data> cookie 文件 (H)
- -j, --junk-session-cookies 读取文件中但忽略会话cookie (H)
- -A, --user-agent user-agent设置 (H)
# 传输设置
- -C, --continue-at OFFSET 断点续转
- -x, --proxy [PROTOCOL://]HOST[:PORT] 在指定的端口上使用代理
- -U, --proxy-user USER[:PASSWORD] 代理用户名及密码
# 文件操作
- -T, --upload-file <file> 上传文件
- -a, --append 添加要上传的文件 (F/SFTP)
# 输出设置
- -o, --output <file> 将输出写入文件,而非 stdout
- -O, --remote-name 将输出写入远程文件
- -D, --dump-header <file> 将头信息写入指定的文件
- -c, --cookie-jar <file> 操作结束后,要写入 Cookies 的文件位置
二、常见用法
1、发送GET请求
# curl URL
# curl URL?a=1&b=nihao
2、发送POST请求
# curl -X POST -d 'a=1&b=nihao' URL
3、发送json格式请求
# curl -H "Content-Type: application/json" -X POST -d '{"abc":123,"bcd":"nihao"}' URL
# curl -H "Content-Type: application/json" -X POST -d @test.json URL
其中,-H 代表 header 头,-X 是指定什么类型请求(POST/GET/HEAD/DELETE/PUT/PATCH),-d 代表传输什么数据。这几个是最常用的。
查看所有curl命令: man curl 或者 curl -h
- 请求头:H,A,e
- 响应头:I,i,D
- cookie:b,c,j
- 传输:F(POST),G(GET),T(PUT),X
- 输出:o,O,w
- 断点续传:r
- 调试:v,--trace,--trace-ascii,--trace-time
三、实例
1、保存页面内容
# curl -o home.html http://www.sina.com.cn
用 -O(大写的),后面的url要具体到某个文件,不然抓不下来。我们还可以用正则来抓取东西
# curl -O http://www.mydomain.com/linux/index.html
2、模拟用户登录
此参数相当于设置http头 Authorization:
# curl --user user:password http://blog.mydomain.com/login.php
使用用户名、密码认证,此参数会覆盖“-n”、“--netrc”和“--netrc-optional”选项
模拟表单信息,模拟登录,保存cookie信息
# curl -c ./cookie_c.txt -F log=aaaa -F pwd=****** http://blog.mydomain.com/login.php
模拟表单信息,模拟登录,保存头信息
# curl -D ./cookie_D.txt -F log=aaaa -F pwd=****** http://blog.mydomain.com/login.php
-c(小写)产生的cookie和-D里面的cookie是不一样的
3、使用cookie文件
# curl -b ./cookie_c.txt http://blog.mydomain.com/wp-admin
断点续传,-C(大写的)
# curl -C -O http://www.sina.com.cn
4、传送数据
最好用登录页面测试,因为你传值过去后,回抓数据,你可以看到你传值有没有成功
# curl -d log=aaaa http://blog.mydomain.com/login.php
5、显示抓取错误 -f
# curl -f http://www.sina.com.cn/asdf
curl: (22) The requested URL returned error: 404
# curl http://www.sina.com.cn/asdf
6、分段下载
循环下载
# curl -O http://mydomain.net/~zzh/screen[1-10].JPG
循环(匹配)下载
# curl -O http://mydomain.net/~{zzh,nick}/[001-201].JPG # >like zzh/001.JPG
循环(引用)下载
# curl -o #2_#1.jpg http://mydomain.net/~{zzh,nick}/[001-201].JPG # like >001_zzh.jpg
断点续传
# curl -c -O http://mydomain.net/~zzh/screen1.JPG
分块下载音视频
# curl -r 0 -10240 -o "zhao.part1" http://mydomain.net/~zzh/zhao1.mp3 &\
# curl -r 10241 -20480 -o "zhao.part1" http://mydomain.net/~zzh/zhao1.mp3 &\
# curl -r 20481 -40960 -o "zhao.part1" http://mydomain.net/~zzh/zhao1.mp3 &\
# curl -r 40961 - -o "zhao.part1" http://mydomain.net/~zzh/zhao1.mp3
...
# cat zhao.part* > zhao.mp3
7、下载进度
不显示下载进度信息 -s
# curl -s -o aaa.jpg
显示下载进度条 -#
# curl -# -O http://www.mydomain.com/linux/25002_3.html
######################################################################## 100.0%
8、FTP方式
通过ftp下载文件
# curl -u 用户名:密码 -O http://blog.mydomain.com/demo/curtain/bbstudy_files/style.css
或者用下面的方式
# curl -O ftp://xukai:test@192.168.242.144:21/www/focus/enhouse/index.php
通过ftp上传
# curl -T xukai.php ftp://xukai:test@192.168.242.144:21/www/focus/enhouse/
9、模拟浏览器访问
通过代理
# curl -x 123.45.67.89:1080 -o page.html http://mydomain.net
保存cookie
# curl -x 123.45.67.89:1080 -o page1.html -D cookie0001.txt http://mydomain.net
使用cookie
# curl -x 123.45.67.89:1080 -o page1.html -D cookie0002.txt -b cookie0001.txt http://mydomain.net
模仿浏览器
# curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x123.45.67.89:1080 -o page.html -D cookie0001.txt http://mydomain.net
伪造referer
# curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x123.45.67.89:1080 -e "mail.yahoo.com" -o page.html -D cookie0001.txt http://mydomain.net