学而实习之 不亦乐乎

Linux 使用 curl 命令进行网络请求

2023-10-13 07:00:08

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