curl命令

-- TOC --

curl是一个著名的程序,也是一个库,支持的特性非常丰富,在命令行,常用来下载文件或发送各种HTTP请求用于测试。

curl官网:https://curl.se/,有很多可以学习的资料。

指定User-Agent

-A参数指定客户端的用户代理标头,即User-Agent。curl的默认用户代理字符串是curl/[version]

$ curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com

-b参数用来向服务器发送Cookie,

$ curl -b 'foo1=bar;foo2=bar2' https://google.com
$ curl -b cookies.txt https://www.google.com

-c参数将服务器设置的 Cookie 写入一个文件。

$ curl -c cookies.txt https://www.google.com

上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt。

保存输出

-o--output参数将服务器的回应保存成文件,文件名自定义;

-O参数将服务器回应保存成文件,并将URL的最后部分当作文件名。

--limit-rate用来限制 HTTP 请求和回应的带宽,模拟慢网速的环境。

查看返回的http header

使用-i参数,没有此参数时,会把url指向的页面html抓回来,有此参数时,先显示http header信息。

或者,只用-I参数,请求HEAD,同--head

$ curl -I https://www.pynote.net
HTTP/1.1 200 OK
Date: Tue, 22 Mar 2022 02:08:58 GMT
Server: Apache/2.4.41 (Unix) OpenSSL/1.0.2k-fips PHP/7.3.8
X-Powered-By: PHP/7.3.8
Vary: Accept-Encoding,Cookie
Cache-Control: max-age=3, must-revalidate, max-age=604800
Content-Length: 28530
Last-Modified: Tue, 22 Mar 2022 02:06:19 GMT
Expires: Tue, 29 Mar 2022 02:08:58 GMT
Content-Type: text/html; charset=UTF-8

发送GET请求

$ curl <url>
$ curl -X GET <url>
$ curl -v <url>

一个细节:当url中存在query string的时候,需要将整个query string用引号括起来,因为存在&字符。

With the -v or --verbose, curl will output detailed information including the HTTP header information and SSL handshake steps.

发送POST请求

$ curl -X POST [options] <url>

-X选项指定与远程服务器通信时将使用哪种HTTP请求方法。

发送表单数据

curl -X POST -F 'name=Jason' -F 'email=jason@example.com' https://example.com/contact.php

使用该-F选项时,curl使用Content-Type为multipart/form-data发送数据。

$ curl -X POST -F 'a=123' -F 'b=456' http://localhost:8051/123
REQUEST_METHOD:POST
PATH_INFO:/123
QUERY_STRING:
qs:{}
CONTENT_LENGTH:232
CONTENT_TYPE:multipart/form-data; boundary=------------------------788f6dbddca01cb0
REQUEST_BODY:--------------------------788f6dbddca01cb0
Content-Disposition: form-data; name="a"

123
--------------------------788f6dbddca01cb0
Content-Disposition: form-data; name="b"

456
--------------------------788f6dbddca01cb0--

貌似上传文件也是放在表单数据中,文件名前加上@

$ cat test.txt
curl test
$ curl -X POST -F 'file=@test.txt' http://localhost:8051/123
REQUEST_METHOD:POST
PATH_INFO:/123
QUERY_STRING:
qs:{}
CONTENT_LENGTH:196
CONTENT_TYPE:multipart/form-data; boundary=------------------------9bb13378ca822f0a
REQUEST_BODY:--------------------------9bb13378ca822f0a
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain

curl test

--------------------------9bb13378ca822f0a--

发送超大文件,或者流媒体呢?

发送单纯的数据

发出POST请求的另一种方法是使用-d选项,同--data。这导致curl使用application/x-www-form-urlencoded作为Content-Type发送数据。

curl -X POST -d 'name=Jason' -d 'email=jason@example.com' https://example.com/contact.php
curl -X POST -d 'name=Jason&email=jason@example.com' https://example.com/contact.php 

数据都在REQUEST_BODY里面:

$ curl -X POST -d 'a=123' -d 'b=456' http://localhost:8051/123
REQUEST_METHOD:POST
PATH_INFO:/123
QUERY_STRING:
qs:{}
CONTENT_LENGTH:11
CONTENT_TYPE:application/x-www-form-urlencoded
REQUEST_BODY:a=123&b=456

-d参数还可以读取本地文本文件的数据,向服务器发送,依然使用@

$ curl -d '@data.txt' https://google.com/login

--data-urlencode参数等同于-d,发送POST 请求的数据体,区别在于会自动将发送的数据进行URL编码:

$ curl --data 'cc=hello curl :)' http://localhost:8051/123
REQUEST_METHOD:POST
PATH_INFO:/123
QUERY_STRING:
qs:{}
CONTENT_LENGTH:16
CONTENT_TYPE:application/x-www-form-urlencoded
REQUEST_BODY:cc=hello curl :)
$ curl --data-urlencode 'cc=hello curl :)' http://localhost:8051/123
REQUEST_METHOD:POST
PATH_INFO:/123
QUERY_STRING:
qs:{}
CONTENT_LENGTH:24
CONTENT_TYPE:application/x-www-form-urlencoded
REQUEST_BODY:cc=hello%20curl%20%3A%29

指定CONTENT_TYPE

-H参数添加 HTTP 请求的标头,因此可以用来指定CONTENT_TYPE.

$ curl -X POST -H "Content-Type: application/json" -d '{"name": "Jason", "email": "jason@example.com"}' http://localhost:8051
REQUEST_METHOD:POST
PATH_INFO:/
QUERY_STRING:
qs:{}
CONTENT_LENGTH:47
CONTENT_TYPE:application/json
REQUEST_BODY:{"name": "Jason", "email": "jason@example.com"}

跟随重定向

-L参数会让HTTP请求跟随服务器的重定向,curl默认不跟随重定向。

设置代理

-x参数指定 HTTP 请求的代理,需要指定协议类型 protocol://address:port

忽略证书错误

You can ignore SSL certificate errors by using the -k or --insecure flags which is useful if you have a self-signed certificate.

本文链接:https://cs.pynote.net/sf/linux/shell/202203221/

-- EOF --

-- MORE --