curl是日常运维经常使用到的命令,这里记录下一些常用的使用示例。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22

               MMM.           .MMM
               MMMMMMMMMMMMMMMMMMM
               MMMMMMMMMMMMMMMMMMM      _________________________________
              MMMMMMMMMMMMMMMMMMMMM    |                                 |
             MMMMMMMMMMMMMMMMMMMMMMM   | Responsive is better than fast. |
            MMMMMMMMMMMMMMMMMMMMMMMM   |_   _____________________________|
            MMMM::- -:::::::- -::MMMM    |/
             MM~:~ 00~:::::~ 00~:~MM
        .. MMMMM::.00:::+:::.00::MMMMM ..
              .MM::::: ._. :::::MM.
                 MMMM;:::::;MMMM
          -MM        MMMMMMM
          ^  M+     MMMMMMMMM
              MMMMMMM MM MM MM
                   MM MM MM MM
                   MM MM MM MM
                .~~MM~MM~MM~MM~~.
             ~~~~MM:~MM~~~MM~:MM~~~~
            ~~~~~~==~==~~~==~==~~~~~~
             ~~~~~~==~==~==~==~~~~~~
                 :~==~==~==~==~~

我们要怎样才能获取到上面这只可爱的彩虹猫呢?它是通过 api.github.com/octocat 接口生成的。
打开 iTerm2 ,输入 curl api.github.com/octocat 你会发现什么也没有。

只获取响应头

让我们加个参数 -I, --head 看看发生了什么。

1
2
3
4
$ curl -I api.github.com/octocat
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Location: https://api.github.com/octocat

跟随重定向

从获取到的响应头可以发现,我们是通过 http 协议请求接口。
http 协议是明文不安全的,服务端已经做了 301 永久跳转到 https 协议的链接。
此时,我们就可以通过 -L, --location 参数自动跟随重定向,从而获取到我们想要的结果。

1
$ curl -L api.github.com/octocat

修改 User-Agent

User-Agent是客户端的一个身份标识,服务端可根据这个标识来区分PC及手机,然后做出不同的响应。
默认curlUser-Agentcurl/版本号, 可通过-A, --user-agent <name>来修改进行伪装。

1
$ curl -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" -L www.guixiaotu.com

服务端日志看到的User-Agent字段:

1
27.152.156.59 - - [12/Jan/2023:14:19:28 +0800] "GET / HTTP/2.0" 403 541 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"

使用代理

有些网站会限制某些地区或国家访问,这时就可通过设置代理-x, --proxy [protocol://][user:password@]host[:port]来访问。
参数说明:

  • protocol可指定socks4socks4asocks5socks5hhttpshttp,默认使用http
  • 用户名或密码如有包含特殊字符,需要进行 URL Encode
  • 默认使用1080端口。

不使用代理:

1
$ curl ip.sb
1
27.152.156.59

使用代理:

1
2
3
# 用户名:xo9
# 密 码:abc@123445
$ curl -x socks5://xo9:abc%[email protected]:8088 ip.sb
1
47.124.32.88

下载文件

可通过-o, --output <file>指定保存文件名,也可通过-O, --remote-name使用远程文件名。
通过下载rclone安装脚本来看看区别。

1
$ curl https://rclone.org/install.sh -o rclone.install.sh
1
$ curl https://rclone.org/install.sh -O
1
2
3
$ ls -l *.sh
-rw-r--r--  1 xo9  staff  4669  1 12 14:57 install.sh
-rw-r--r--  1 xo9  staff  4669  1 12 14:57 rclone.install.sh

上传文件

可通过-F, --form<name=content>参数来上传文件。
@前缀表示添加文件。

1
$ curl -F avatar=@/home/xo9/avatar.png https://gitlab.com/api/v4/users

添加请求头

如访问gitlabapi接口时,要求提供Token认证,这时就可通过-H, --header <header/@file>来添加。
查看所有gitlab项目:

1
$ curl -H "PRIVATE-TOKEN: zmxxxxxxxxAm-sxxze" https://gitlab.com/api/v4/projects
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[
    {
        "id": 666,
        "description": null,
        "name": "awesome-compose",
        "name_with_namespace": "\uxxxx\uxxxx\uxxxx\uxxxx\uxxxx / awesome-compose",
        "path": "awesome-compose",
        "path_with_namespace": "root/awesome-compose",
        "created_at": "2022-12-22T16:23:38.276+08:00",
        "default_branch": "main",
        "tag_list": [],
        "topics": [],
        "ssh_url_to_repo": "ssh://[email protected]/root/awesome-compose.git",
        "http_url_to_repo": "https://gitlab.com/root/awesome-compose.git",
        "web_url": "https://gitlab.com/root/awesome-compose",
        "readme_url": "https://gitlab.com/root/awesome-compose/-/blob/main/README.md",
        "avatar_url": null,
        "forks_count": 0,
        "star_count": 0,
        "last_activity_at": "2022-12-22T16:23:38.276+08:00",
        "namespace": {
            "id": 3,
            "name": "\uxxxx\uxxxx\uxxxx\uxxxx\uxxxx",
            "path": "root",
            "kind": "group",
            "full_path": "root",
            "parent_id": null,
            "avatar_url": "/uploads/-/system/group/avatar/3/\u5c0f\u7a0b\u5e8flogo.png",
            "web_url": "https://gitlab.com/groups/root"
        }
    ......
    }
]

使用其它请求方法

默认是使用GET方法,如果要使用其它请求方法,可以使用-X, --request <command>参数。
删除gitlab项目:

1
$ curl -X DELETE -H "PRIVATE-TOKEN: zmxxxxxxxxAm-sxxze" https://gitlab.com/api/v4/projects/666

添加请求数据

如创建gitlab项目,我们需要提供项目名称,这里就可以通过-d, --data <data>提供请求数据。
创建gitlab项目:

1
$ curl -X POST -H "PRIVATE-TOKEN: zmxxxxxxxxAm-sxxze" -H "Content-Type: application/json" -d '{"name": "curl_examples", "description": "about common curl command examples", "path": "curl_examples", "namespace_id": "3", "initialize_with_readme": "true"}' https://gitlab.com/api/v4/projects/