cURL 小记

作者: 舌尖上的大胖 | 来源:发表于2017-06-11 12:20 被阅读0次

    cURL 是一个软件包,由命令行工具和库组成,用于使用 URL 语法进行数据传输。
      cURL 支持各种协议,如:

    DICT
    FILE
    FTP
    FTPS
    Gopher
    HTTP
    HTTPS
    IMAP
    IMAPS
    LDAP
    LDAPS
    POP3
    POP3S
    RTMP
    RTSP
    SCP
    SFTP
    SMTP
    SMTPS
    Telnet
    TFTP
    

    〇、涉及到的命令

    行为 ----------------------------------------------------------------
    -d, --data <data> ........................ POST 数据
    --data-urlencode <data> .................. POST 数据(认为命令后中的参数为编码后的内容)
    -F, --form <name=content> ................ POST 数据,表单提交
    -G, --get ................................ 将参数以 GET 方式请求
    -I, --head ............................... 相当于 HTTP HEAD 方法
    -o, --output <file> ...................... 下载到指定文件名
    -O, --remote-name ........................ 下载到默认文件名
    -X, --request <command> .................. 指定请求方法(GET/POST/PUT/DELETE等,根据协议而定)
    
    传输控制 -------------------------------------------------------------
    -C, --continue-at <offset> ............... 断点续传
    --limit-rate <speed> ..................... 限速
    -L, --location ........................... 遵循 302 跳转
    -r, --range <range> ...................... 指定下载内容字节范围
    -z, --time-cond <time> ................... 根据指定日期下载
    
    输出 ----------------------------------------------------------------
    -#, --progress-bar ....................... 进度条
    -i, --include ............................ 输出信息中包括 Response 头信息
    -s, --silent ............................. 静默模式,不显示进度
    -S, --show-error ......................... 静默模式但显示错误
    --trace <file>
    --trace-ascii <file>
    --trace-time ............................. 访问的详细过程
    -v, --verbose ............................ 开启 verbose 模式,打印详情
    -w, --write-out <format> ................. 传输完成后显示传输信息
    
    网络 ----------------------------------------------------------------
    --connect-timeout <seconds> .............. 连接允许的最长时间(连接服务器时间长时使用)
    --local-port <num/range> ................. 本地端口
    -m, --max-time <seconds> ................. 传输允许的最长时间(服务器数据处理时间长时使用)
    -x, --proxy [protocol://]host[:port] ..... 使用代理服务器
    
    请求头 ----------------------------------------------------------------
    -A, --user-agent <name> .................. 指定 User-Agent
    -b, --cookie <data|filename>.............. 使用 Cookie 文件中的内容访问
    -c, --cookie-jar <filename> .............. 将 Cookie 保存到文件
    -e, --referer <URL> ...................... 指定 Referer
    -H, --header <header/@file> .............. 指定 Header
    --oauth2-bearer <token> .................. OAuth 2 Bearer Token
    -u, --user <user:password> ............... HTTP 认证,默认为 Basic Auth
    
    证书 ----------------------------------------------------------------
    --cacert <file> .......................... 指定 CA 证书用于校验服务器
    -E, --cert <certificate[:password]> ...... 双向认证时指定客户端证书和密码
    --cert-type <type> ....................... 证书文件类型(DER/PEM/ENG)
    -k, --insecure ........................... 允许使用不安全证书
    
    
    协议 ----------------------------------------------------------------
    --mail-from、--mail-rcpt <address> ....... 使用 SMTP 协议发送邮件
    -T, --upload-file <file> ................. 上传 FTP
    

    一、HTTP 协议

    1、下载单个文件

    从 URL 获取内容,并显示到 STDOUT(如:控制台)

    $ curl http://www.centos.org
    

    要输出到一个文件,可以通过重定向的方法。这种方法同时也会现实一些额外的下载状态。

    $ curl http://www.centos.org > centos-org.html
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100 27329    0 27329    0     0   104k      0 --:--:-- --:--:-- --:--:--  167k
    

    2、cURL 输出到文件(-O / -o

    使用 -o-O 选项

    • -o(小写)输出到命令行中提供的文件名
    • -O(大写)输出到 URL 中带的文件名

    例如:

    $ curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html
    

    这样的话,内容会被保存到 mygettext.html 中。同时也会看到,使用 -o 参数,也会像下面这样显示下载进度:

      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
     66 1215k   66  805k    0     0  33060      0  0:00:37  0:00:24  0:00:13 45900
    100 1215k  100 1215k    0     0  39474      0  0:00:31  0:00:31 --:--:-- 68987
    

    当使用 -O(大写) 参数时,会保存到 gettext.html 中。

    $ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
    

    注意:当 cURL 将内容输出到控制台时,不会显示下载进度,以避免显示内容的混乱。可以使用 > -o -O 来将结果输出到文件。

    与使用 cURL 一样,也可以使用 wget 下载文件,具体使用方法参考 Wget Examples

    3、一次性获取多个文件(-O

    语法:

    $ curl -O URL1 -O URL2
    

    下面的命令行,可以同时下载 index.htmlgettext.html 到当前目录。

    $ curl -O http://www.gnu.org/software/gettext/manual/html_node/index.html -O http://www.gnu.org/software/gettext/manual/gettext.html
    

    如果像上面这样,从同一个服务器下载多个文件,cURL 会尝试重用连接

    4、遵从 HTTP Location 头信息做跳转(-L

    默认情况,cURL 不会根据 HTTP 的 Location 头(称为 重定向)。当请求的 Web 内容移动到了其他的位置,HTTP Location 头会作为 Response 的一部分返回,并且指明实际的位置。
      例如:当有人在印度使用浏览器访问 google.com,会被自动重定向到 google.co.in。这是基于以下的 HTTP Location 头来完成的:

    $ curl http://www.google.com
    
    <TITLE>302 Moved</TITLE>
    <H1>302 Moved</H1>
    The document has moved
    <A HREF="http://www.google.co.in/">here</A>
    

    这一段内容,说明请求的内容,已经被移动到了 http://www.google.co.in

    如果想使用 cURL 也完成这样的跳转,可以使用 -L 选项。

    $ curl -L http://www.google.com
    

    5、继续/恢复 之前的下载(-C

    使用 cURL 的 -C 选项,可以继续之前停止的下载。这对于下载大文件,或下载被打断的情况很有帮助。
      如果使用了 -C -,也就是 -C 后面加空格,再跟个 -,cURL 会自动找到从哪里开始继续下载。
      我们也可以使用 -C <offset>,指定位移字节数,这样的话,会从源文件头跳过这些字节数后,再开始下载。
      使用 cURL 下载一个大文件,使用 Ctrl+C,停止:

    $ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
    ##############             20.1%
    

    注意:-# 用于显示一个进度条,而不是一个进度表。

    现在下载已经停止在 20.1%,现在可以使用 -C - 来继续后面的下载。

    6、限定传输速率(--limit-rate

    可以使用 --limit-rate 选项,指定最大传输速率。

    $ curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html
    

    上面的命令行,限定数据传输速率为 1000Byte/second。cURL 有可能会阶段性使用更高的速率,但是平均值会在 1000Byte/second

    下面是刚才命令行执行时的进度表,可以看到,速度是接近 1000 Bytes

      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      1 1215k    1 13601    0     0    957      0  0:21:40  0:00:14  0:21:26   999
      1 1215k    1 14601    0     0    960      0  0:21:36  0:00:15  0:21:21   999
      1 1215k    1 15601    0     0    962      0  0:21:34  0:00:16  0:21:18   999
    

    7、判定在指定日期 之前/之后 修改过,才下载文件(-z

    可以在 cURL 的命令行中,使用 -z 选项,来获取指定日期之后修改过的文件。这个选项对于 HTTP 和 FTP 都有效。

    $ curl -z 21-Dec-11 http://www.example.com/yy.html
    

    上面的命令,只在 yy.html 在指定日期之后修改过,才会下载。

    $ curl -z -21-Dec-11 http://www.example.com/yy.html
    

    上面的命令,只在 yy.html 在指定日期之前修改过,才会下载。注意日期前面的 -

    请参考 man curl_getdate 获取各种日期表达式支持。

    8、使用 cURL 通过 HTTP Authentication(-u

    有时候,网站需要 用户名 和 密码 认证,才能查看文件内容。也可以使用(.htaccess 文件)。可以使用 -u 选项,通过 cURL 把认证信息传到服务器。如:

    $ curl -u username:password URL
    

    注意:默认情况下,cURL 使用 Basic HTTP Authentication。可以使用 –ntlm | –digest 选项,指定其他认证方式。

    9、从 FTP 服务器下载文件

    cURL 也可以从 FTP 服务器下载文件。如果给定的 FTP 路径是个目录,默认会列出此目录下的所有文件。

    $ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php
    

    上面的命令,下载了 xss.php。

    $ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/
    

    这是列表的情况。

    FTP/SFTP 新手,参考 FTP SFTP Tutorial for Beginners

    10、使用范围进行列表、下载

    $ curl ftp://ftp.uk.debian.org/debian/pool/main/[a-z]/
    

    11、使用代理服务器(-x

    通过指定 -x 选项,来指定代理服务器和端口。

    $ curl -x proxysever.test.com:3128 http://google.co.in
    

    12、更详细的信息(-v--trace--trace-ascii--trace-time

    可以使用 -v 选项,来知道到底发生了什么。-v 开启 verbose 模式,打印详情。

    curl -v http://google.co.in
    

    上面的命令输入如下内容:

    * About to connect() to www.google.co.in port 80 (#0)
    *   Trying 74.125.236.56... connected
    * Connected to www.google.co.in (74.125.236.56) port 80 (#0)
    > GET / HTTP/1.1
    > User-Agent: curl/7.21.0 (i486-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6
    > Host: www.google.co.in
    > Accept: */*
    >
    * HTTP 1.0, assume close after body
    < HTTP/1.0 200 OK
    < Date: Tue, 10 Apr 2012 11:18:39 GMT
    < Expires: -1
    < Cache-Control: private, max-age=0
    < Content-Type: text/html; charset=ISO-8859-1
    < Set-Cookie: PREF=ID=7c497a6b15cc092d:FF=0:TM=1334056719:LM=1334056719:S=UORpBwxFmTRkbXLj; expires=Thu, 10-Apr-2014 11:18:39 GMT; path=/; domain=.google.co.in
    .
    .
    

    如果需要更详细的信息,使用 --trace 选项。这里为了演示方便,使用 --trace-ascii 只显示 ASCII 内容,并通过 --trace-time 显示时间戳:

    # 访问 httpbin,测试延迟 3 秒的请求
    $ curl --trace-ascii traceinfo.txt --trace-time http://httpbin.org/delay/3
    

    信息会记录到指定的 traceinfo.txt 中:(如果传入 - 则显示到控制台)

    23:27:00.786693 == Info:   Trying 34.193.212.251...
    23:27:00.787303 == Info: TCP_NODELAY set
    23:27:02.137448 == Info: Connected to httpbin.org (34.193.212.251) port 80 (#0)
    23:27:02.137524 => Send header, 82 bytes (0x52)
    0000: GET /delay/3 HTTP/1.1
    0017: Host: httpbin.org
    002a: User-Agent: curl/7.64.1
    0043: Accept: */*
    0050: 
    23:27:10.022422 <= Recv header, 17 bytes (0x11)
    0000: HTTP/1.1 200 OK
    23:27:10.022481 <= Recv header, 40 bytes (0x28)
    0000: Access-Control-Allow-Credentials: true
    23:27:10.022501 <= Recv header, 32 bytes (0x20)
    0000: Access-Control-Allow-Origin: *
    23:27:10.022521 <= Recv header, 32 bytes (0x20)
    0000: Content-Type: application/json
    23:27:10.022538 <= Recv header, 37 bytes (0x25)
    0000: Date: Mon, 02 Dec 2019 15:27:04 GMT
    23:27:10.022554 <= Recv header, 45 bytes (0x2d)
    0000: Referrer-Policy: no-referrer-when-downgrade
    23:27:10.022573 <= Recv header, 15 bytes (0xf)
    0000: Server: nginx
    23:27:10.022588 <= Recv header, 33 bytes (0x21)
    0000: X-Content-Type-Options: nosniff
    23:27:10.022604 <= Recv header, 23 bytes (0x17)
    0000: X-Frame-Options: DENY
    23:27:10.022619 <= Recv header, 33 bytes (0x21)
    0000: X-XSS-Protection: 1; mode=block
    23:27:10.022636 <= Recv header, 21 bytes (0x15)
    0000: Content-Length: 254
    23:27:10.022651 <= Recv header, 24 bytes (0x18)
    0000: Connection: keep-alive
    23:27:10.022667 <= Recv header, 2 bytes (0x2)
    0000: 
    23:27:10.022680 <= Recv data, 254 bytes (0xfe)
    0000: {.  "args": {}, .  "data": "", .  "files": {}, .  "form": {}, . 
    0040:  "headers": {.    "Accept": "*/*", .    "Host": "httpbin.org", .
    0080:     "User-Agent": "curl/7.64.1".  }, .  "origin": "111.30.232.16
    00c0: 0, 111.30.232.160", .  "url": "https://httpbin.org/delay/3".}.
    23:27:10.022766 == Info: Connection #0 to host httpbin.org left intact
    

    verbose 和 trace 选项,可以在 cURL 发生未知原因失败时使用。

    13、传输完成后显示传输信息(-w

    curl -o /dev/null -s -w \
    'http_code: %{http_code}
    http_connect: %{http_connect}
    content_type: %{content_type}
    time_appconnect: %{time_appconnect}
    time_connect: %{time_connect}
    time_namelookup: %{time_namelookup}
    time_pretransfer: %{time_pretransfer}
    time_redirect: %{time_redirect}
    time_starttransfer: %{time_starttransfer}
    time_total: %{time_total}
    speed_download: %{speed_download}' http://httpbin.org/delay/3
    

    执行结果:

    http_code: 200
    http_connect: 000
    content_type: application/json
    time_appconnect: 0.000000
    time_connect: 1.324640
    time_namelookup: 0.023474
    time_pretransfer: 1.324761
    time_redirect: 0.000000
    time_starttransfer: 5.444911
    time_total: 5.445035
    speed_download: 46.000
    

    二、其它协议

    14、将文件上传到 FTP 服务器(-T

    cURL 可以使用 -T 选项。

    $ curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com
    

    上面的命令,将 myfile.txt 上传到 FTP 服务器。也可以使用 range 选项,一次性上传多个文件。

    $ curl -u ftpuser:ftppass -T "{file1,file2}" ftp://ftp.testserver.com
    

    也可以使用 - 来获取 STDIN 输入,并传输到服务器。

    $ curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt
    

    上面的命令,获取 STDIN 的输入,并将内容保存到 myfile_1.txt。

    可以为每个 URL 提供一个 -T 参数,指定每个上传的位置。

    15、使用 SMTP 协议发送邮件(--mail-from--mail-rcpt

    $ curl --mail-from blah@test.com --mail-rcpt foo@test.com smtp://mailserver.com
    

    上面的命令行输入后,会等待用户输入数据。输入内容后,键入 . 作为最后一行,然后邮件会被立即发送。

    16、使用 POP3 协议收取邮件

    $ curl pop3://username:password@mail.server/INBOX mailindex(整数)
    

    17、使用 IMAP 协议收取邮件

    $ curl --url "imap://mail.example.com/" --user "user:password"
    
    $ curl --insecure --url "imaps://mail.example.com/" --user "user:password"
    

    Performing IMAP queries via curl

    三、参考链接

    (完)

    相关文章

      网友评论

        本文标题:cURL 小记

        本文链接:https://www.haomeiwen.com/subject/yeshqxtx.html