curl 是一个非常实用的命令行程序(是的,俺知道它也是一个函数库,但这和本文无关),并且几乎所有现代的 Linux 发行版都自带。在命令行编程,调试网络,测试 debug 等场景,几乎找不到比 curl 更方便,更万能的工具了,更详细的介绍可以看看 curl 官网对它的介绍,本文记录一些个人日常经常使用的命令,并配上选项介绍,文末整理了俺保存的一些学习资源。
使用 -x 选项来指定代理服务器,参数格式为 [protocol://]host[:port] ,不指定代理协议类型时默认为 http ,代理协议也可以是 socks4, socks5 或 socks5h 等,不指定端口时默认为 1080.
下面是几个示例:
1
2
3
4
5
6
7
8
| # http 代理
## 下面两个命令是等价的
curl -x 192.168.1.111 https://example.com
curl -x http://192.168.1.111:1080 https://example.com
# socks5 代理(不代理 DNS 请求)
curl -x socks5://192.168.1.111:1080 https://example.com
# socks5 代理(代理 DNS 请求)
curl -x socks5h://192.168.1.111:1080 https://example.com
|
1
| curl -O -fsSL https://example.com/test.zip
|
选项释义:
-O / --remote-name: 使用远程文件系统的文件名来保存下载的文件。- 如果需要自定义下载的文件名,使用
-o <custom_file_name> 参数。
-f / --fail: 在服务器返回 HTTP 错误(例如 404 Not Found)时静默失败,不会输出错误页面,而是直接以非零的退出码结束。-s / --silent: 在下载过程中不显示进度条,或错误信息,只在下载失败时返回一个非零的退出码。-S / --show-error: 在使用了 -s 选项的情况下,如果出现错误,依然会显示错误信息,方便调试。-L / --location: 如果服务器返回重定向(例如 301 或 302 跳转),自动跟踪重定向到新的 URL。
1
| curl -so /dev/null -w "\ntime_namelookup: %{time_namelookup}\ntime_connect: %{time_connect}\ntime_appconnect: %{time_appconnect}\ntime_pretransfer: %{time_pretransfer}\ntime_redirect: %{time_redirect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n" https://www.google.com
|
选项释义:
-s / --silent: 同上节,静默模式。-o /dev/null: 丢弃获取到的页面内容。-w / --write-out: 请求完成后以指定的格式,输出指定的时间变量。
上面的命令执行后,输出类似下面这样:
1
2
3
4
5
6
7
| time_namelookup: 0.004687
time_connect: 0.005549
time_appconnect: 0.179526
time_pretransfer: 0.180173
time_redirect: 0.000000
time_starttransfer: 0.365058
time_total: 0.365386
|
具体支持哪些变量,以及变量对应的意义是什么,请参见官方文档……
使用 -H / --header 选项来附加或覆盖请求头:
1
2
3
4
5
6
7
8
9
10
11
12
| # 附加单个请求头
curl -H "<Header-Name>: <Value>" URL
# 附加多个请求头
curl -H "Authorization: Bearer <YOUR_TOKEN>" \
-H "Accept: application/json" \
https://api.example.com/user
# 覆盖默认请求头
## 这个例子会替换 curl 默认的 "User-Agent: curl/7.x.x" 请求头
curl -H "User-Agent: MyBrowser/1.0" https://example.com
# 删除默认请求头
## 这个例子发出的请求中将会没有 "User-Agent" 请求头
curl -H "User-Agent:" https://example.com
|
curl example.com 命令默认使用 GET 方法,如果要发起其他类型的请求(比如 POST),需要通过 -X 选项来指定:
1
2
| # 发起 POST 请求
curl -X POST http://prometheus.he-sb.home/-/reload
|
特别地,如果一个请求既需要使用 POST 方法,又要提交请求体信息(实际上大多数 POST 请求都是这样),那么可以使用 -d 选项添加请求体,此时可以省略 -X POST 选项:
1
| curl -H "Content-Type: application/json" -d '{"name": "test"}' https://api.example.com
|
参考链接:
- curl - Frequently Asked Questions
- curl网站开发指南 - 阮一峰的网络日志
- curl 的用法指南 - 阮一峰的网络日志
- Timing With Curl - Susam Pal
- curl 常用的一些命令 - 格物致知
- 使用curl进行网站测速 - 暗无天日