quickly start Curl

列出常用的Curl命令以备忘。

请求页面

默认使用get,直接在终端输出response。

1
2
3
4
5
6
7
8
# 直接请求,此时response的内容可能会是301 Moved。
curl https://google.com

# 使用-L选项,允许重定向, 终端会输出Google首页的HTML。
curl -L https://google.com

# 使用-I, 只查看header部分, 终端将只输出Headers内容。
curl -I -L https://google.com

下载文件

将输出结果存储在文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# -O: 「 大写O 」不指定目标文件名,直接使用URL中的文件名,response保存在index.html文件中。
curl -O https://www.centos.org/index.html

# -o:「 小写o 」指定目标文件名, response保存在centos.html文件中。
curl -o centos.html https://www.centos.org

# 不使用 -o/O, 直接保存到指定文件
curl https://www.centos.org > centos.html

# -z: 版本比本地指定文件版本要新时,才下载
curl -z centos.html https://www.centos.org > centos.html

# 给定时间点,在该时间点之后有更新,才下载
curl -z "Jan 1 2018" https://www.centos.org > centos.html

# -C: 从上一次下载中断的地方继续下载, -C 也可跟-T一起使用,继续上传。
curl -C -o centos.html https://www.centos.org

# 一次下载多个文件: curl -O URL1 -O URL2,建议指定目标文件名,如果都是index.html会被覆盖
curl -O https://www.centos.org/index.html -O https://github.com/index.html

指定代理

使用-x.

1
2
# 基本格式 curl -x your-proxy:your-port URL
curl -x http://127.0.0.1:1087 https://www.youtube.com

这里的x为小写,大写的X有另外的意思,比如下面这个。

指定请求

使用-X指定其他请求命令

1
2
# 指定request command为DELETE,删除某个gist
curl -X DELETE -H "Authorization: token OAUTH_TOKEN" https://api.github.com/gists/gist_id

上传文件

使用-T

1
2
3
4
5
6
7
8
9
10
11
# 上传通常都需要授权,使用-u,带上用户名和密码信息
curl -T uploadfile -u user:password ftp://ftp.upload.com/file

# -a : 将本地文件追加到服务器中某个文件
curl -T uploadfile -a -u user:password ftp://ftp.upload.com/file

# -C: 从上一次中断的地方继续上传
curl -C -T uploadfile -u user:password ftp://ftp.upload.com/file

# 上传多个文件:
curl -T file1 ftp://ftp.com/moo.exe -T file2 ftp://ftp.com/moo2.txt

限制网速

使用--limit-rate

1
2
3
4
5
# 限制下载速度不超过10KB/s
curl -O --limit-rate 10K https://www.youtube.com/index.html

# 限制上传速度不超过1MB/s
curl -T --limit-rate 1M ftp://ftp.upload.com/file

授权访问

涉及到用户名的部分,使用 -u

以GitHub API的授权为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 基本授权,用户名和密码
curl -u username:password https://api.github.com

# 或者下面这种更安全,回车,终端会提示输入密码,密码不明文输入,以防浏览历史记录时泄露密码
curl -u username https://api.github.com

# 指定代理,并授权访问
curl -u username https://api.github.com -x http://127.0.0.1:1087

# OAuth2 token,作为参数
curl https://api.github.com/?access_token=OAUTH-TOKEN

# OAuth2 token,放在header中传递,使用 -H
curl -H "Authorization: token OAUTH-TOKEN" https://api.github.com

存取cookies

某些场景下需要存储cookies. 比如访问GitHub:

1
2
3
4
5
6
# 返回的header中带有Set-Cookie
curl -I https://github.com

# 部分输出
Set-Cookie: has_recent_activity=1; path=/; expires= xxxxx
Set-Cookie: logged_in=no; domain=.github.com; path=/; expires= xxxx; secure; HttpOnly

通常的Set-Cookie是带有sessionId=xxxx,每次访问指定的path时都要求带上sessionId。

保存及使用cookies:

1
2
3
4
5
# 保存cookie: Netscape HTTP Cookie File
curl -c cookies.txt https://github.com

# 使用保存的cookies
curl -b cookies.txt https://github.com

发送POST

使用-d 或者-F.

-d 使用的是application/x-www-form-urlencoded mime-type, 如果涉及到文件上传时,使用-F.

1
2
3
4
5
6
7
8
9
10
11
# -d:<data>, 值为编译后的字符串,基本样式 <variable1>=<data1>&<variable2>=<data2>
curl -d "client_id=xxxx&client_secret=yyyy" https://api.github.com

# 上面同样的数据,使用-F "name=contents",则是这样传
curl -F "client_id=xxxx" -F "client_secret=yyyy" https://api.github.com

# 传multipart/form-data,文件名前面要加上@
curl -F "[email protected]" https://api.github.com

# 可传多个文件并指定文件类型,不指定时curl会根据文件后缀名来猜。
curl -F "[email protected];type=image/gif, file2.html, file2.jpg"

设置User-Agent

使用-A:

1
2
# 设置
curl -A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36' https://api.github.com

追踪记录

使用-v或者 --trace 记录更多详细信息,个人理解为记录日志,方便在出错时debug。

1
2
3
4
5
# -v:verbose,记录更多信息
curl -v https://www.google.com

# --trace: 追踪curl命令的细节
curl --trace trace.txt https://github.com

less trace.txt ,查看trace的具体内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
== Info: Rebuilt URL to: https://github.com/
== Info: Trying 127.0.0.1...
== Info: TCP_NODELAY set
== Info: Connected to 127.0.0.1 (127.0.0.1) port 1087 (#0)
== Info: Establish HTTP proxy tunnel to github.com:443
=> Send header, 112 bytes (0x70)
0000: 43 4f 4e 4e 45 43 54 20 67 69 74 68 75 62 2e 63 CONNECT github.c
0010: 6f 6d 3a 34 34 33 20 48 54 54 50 2f 31 2e 31 0d om:443 HTTP/1.1.
0020: 0a 48 6f 73 74 3a 20 67 69 74 68 75 62 2e 63 6f .Host: github.co
0030: 6d 3a 34 34 33 0d 0a 55 73 65 72 2d 41 67 65 6e m:443..User-Agen
0040: 74 3a 20 63 75 72 6c 2f 37 2e 35 34 2e 30 0d 0a t: curl/7.54.0..
0050: 50 72 6f 78 79 2d 43 6f 6e 6e 65 63 74 69 6f 6e Proxy-Connection
0060: 3a 20 4b 65 65 70 2d 41 6c 69 76 65 0d 0a 0d 0a : Keep-Alive....
......

果然详细,画风有没有很Wireshark?

参考

Manual – curl usage explained

curl 常用命令

15 Practical Linux CURL command examples