UP | HOME

cRUL 工具

Table of Contents

1 cURL

cURL 是一个利用 URL 语法在命令行下工作的文件传输工具,1997 年首次发行。它支持 文件上传和下载,所以是综合传输工具,但按传统,习惯称 cURL 为下载工具。 Mac 和 Linux 可以通过命令行直接安装,Windows 需要下载可执行文件安装。可以通过 Everything curl 来学习使用工具。

everything-curl.png

2 常见用法

2.1 获取网页内容

直接使用 curl 后面添加网站地址就可以将网站的内容抓取下来,curl 默认将输出打印 到标准输出。curl 会统计下载的速度,如果不需要的话可以使用 -s 来关闭统计。

~ $ curl http://www.example.com/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1270  100  1270    0     0   1695      0 --:--:-- --:--:-- --:--:--  1695<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
........
~ $ curl -s http://www.example.com/
<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />

2.2 保存成本地文件

使用 -o 选项可以将下载的内容保存成相应的文件,并命名成给定的文件名。

curl -o example.html http://www.example.com/

使用 -O 选项将下载的内容保存成 url 最后给定的文件名,如下例子中将会把文件命 名成 index.html

curl -O www.haxx.se/index.html

2.3 下载 ftp 文件时添加用户名和密码

有时候下载 ftp 中的内容需要用户名和密码,可以使用 -u 选项添加用户名和密码。

curl -u name:passwd ftp://machine.domain:port/full/path/to/file

2.4 HTTP 和 SOCKS 代理

curl 还支持 HTTP 和 SOCKS 协议的代理。可以使用 -x 选项了设置代理服务器的地 址和端口号信息。

curl -x my-proxy:888 ftp://ftp.leachsite.com/README
curl -u user:passwd -x my-proxy:888 http://www.get.this/

2.5 分片下载 (Range)

可以使用 -r 选项来分片下载文件。

# Get the first 100 bytes of a document
curl -r 0-99 http://www.get.this/
# Get the last 500 bytes of a document
curl -r -500 http://www.get.this/

2.6 FTP/SMB 协议上传文件

使用 curl 的 -T 选项来指定上传文件。

# upload all data on stdin to a specified server
curl -T - ftp://ftp.upload.com/myfile
# upload file with username and password
curl -T uploadfile -u user:passwd ftp://ftp.upload.com/
# upload file to get append to the remote file
curl -T localfile -a ftp://ftp.upload.com/remotefile

使用 smb 协议上传文件。

curl -T file.txt -u "domain\username:passwd" smb://server.example.com/share/

3 API 测试

3.1 处理 HTTP 方法

3.1.1 提交表单数据

curl -X POST -d "user=foobar&pass=12345&id=blablabla&ding=submit" \
     http://httpbin.org/post
{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "ding": "submit",
    "id": "blablabla",
    "pass": "12345",
    "user": "foobar"
  },
  "headers": {
    "Accept": "application/json, application/xml, text/plain, */*",
    "Content-Length": "47",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.58.0",
    "X-Amzn-Trace-Id": "Root=1-5e5119ee-feb1917ffa6caf18e822a611"
  },
  "json": null,
  "origin": "221.220.164.126",
  "url": "http://httpbin.org/post"
}

3.1.2 命令行中指定 JSON 字符串

在测试 API 时常常需要 POST 数据,使用 -X 可以指定 HTTP 方法, -d 选项可以 指定 POST 数据。

curl -X POST -d '{"name":"Rafael, Sagula", "phone":3320780}' \
     -H "Content-Type: application/json" http://httpbin.org/post
{
  "args": {},
  "data": "{\"name\":\"Rafael, Sagula\", \"phone\":3320780}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json, application/xml, text/plain, */*",
    "Content-Length": "42",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.58.0",
    "X-Amzn-Trace-Id": "Root=1-5e5119ee-a70e66d0b7a6d01f6e2d190d"
  },
  "json": {
    "name": "Rafael, Sagula",
    "phone": 3320780
  },
  "origin": "221.220.164.126",
  "url": "http://httpbin.org/post"
}

3.1.3 命令行中指定 JSON 文件

使用 -d 选项的局限性是只能使用普通键值对方式的参数,如果需要 POST 文件内容, 可以使用 @<filename> 来指定

cat /tmp/input.json
curl -X POST -d@/tmp/input.json \
     -H "Content-Type: application/json" http://httpbin.org/post
{
  "args": {},
  "data": "",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json, application/xml, text/plain, */*",
    "Content-Length": "0",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.58.0",
    "X-Amzn-Trace-Id": "Root=1-5e5119ef-45e8d39aff11ccc8a396fcba"
  },
  "json": null,
  "origin": "221.220.164.126",
  "url": "http://httpbin.org/post"
}

参数则需要使用 -F 选项。 -F 选项使用 @<filename>;type=<mime-type> 这种 方式来编码所要上传的文件。如果没有给定 mime-type 则 curl 根据文件后缀名来猜 测。如下命令中上传了三个文件。

curl -X POST -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html" \
     http://www.post.com/postit.cgi

上传文件并且添加其它字段的例子。

curl -X POST -F "file=@cooltext.txt" -F "yourname=Daniel" \
     -F "filedescription=Cool text file with cool text inside" \
     http://www.post.com/postit.cgi

3.2 添加 USER AGENT

使用 -A 选项知道 USER-AGENT。

curl -A 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0' \
     https://httpbin.org/headers
{
  "headers": {
    "Accept": "application/json, application/xml, text/plain, */*",
    "Host": "httpbin.org",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0",
    "X-Amzn-Trace-Id": "Root=1-5e5119f0-0fcd159a9913b8d2dedfe6c2"
  }
}

3.3 处理返回头和 HTTP 状态码

使用 -i 选项可以参考网页的给出的返回头相关信息。

curl -i http://httpbin.org/get
HTTP/1.1 200 OK
Date: Sat, 22 Feb 2020 12:09:21 GMT
Content-Type: application/json
Content-Length: 303
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

{
  "args": {},
  "headers": {
    "Accept": "application/json, application/xml, text/plain, */*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.58.0",
    "X-Amzn-Trace-Id": "Root=1-5e5119f1-6e8f68b458f901187185fa48"
  },
  "origin": "221.220.164.126",
  "url": "http://httpbin.org/get"
}

使用 -v 选项会详细输出请求过程中的信息。

~ $ curl -v http://httpbin.org/get
* Couldn't find host httpbin.org in the .netrc file; using defaults
*   Trying 34.230.136.58...
* TCP_NODELAY set
* Connected to httpbin.org (34.230.136.58) port 80 (#0)
> GET /get HTTP/1.1
> Host: httpbin.org
> User-Agent: curl/7.54.0
> Accept: application/json, application/xml, text/plain, */*
>
< HTTP/1.1 200 OK
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Origin: *
< Content-Type: application/json
< Date: Mon, 08 Jul 2019 15:37:21 GMT
< Referrer-Policy: no-referrer-when-downgrade
< Server: nginx
< X-Content-Type-Options: nosniff
< X-Frame-Options: DENY
< X-XSS-Protection: 1; mode=block
< Content-Length: 249
< Connection: keep-alive
<
{
  "args": {},
  "headers": {
    "Accept": "application/json, application/xml, text/plain, */*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.54.0"
  },
  "origin": "223.72.66.144, 223.72.66.144",
  "url": "https://httpbin.org/get"
}
* Connection #0 to host httpbin.org left intact

可以使用下面命令来将 header 下载起来保存成文件。

curl --dump-header headers.txt www.example.com

有时候我们在写脚本是仅仅需要参考网站的返回码,为了方便解析可以使用下面命令直 接获取返回码。

curl -q -s -w %{http_code} http://httpbin.org/get
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.58.0",
    "X-Amzn-Trace-Id": "Root=1-5e5119f1-fb363e300e5ada50e2ba2a08"
  },
  "origin": "221.220.164.126",
  "url": "http://httpbin.org/get"
}
200

3.4 添加 Cookie

由于 HTTP 协议是无状态的,所以有些网站是使用 cookie 来记录会话信息。对于 chrome 这样的浏览器,可以轻易处理 cookie 信息,但在 curl 中只要增加相关参数也 是可以很容易的处理 cookie 。如下, -c 选项可以将获取到的 cookie 保存成文件。

curl -c cookie.txt http://httpbin.org/cookies
{
  "cookies": {}
}

使用 -b 可以指定 cookie 字段。

curl -b "name=Daniel" http://httpbin.org/cookies
{
  "cookies": {
    "name": "Daniel"
  }
}

读写同一个 cookie 文件。

curl -b cookies.txt -c cookies.txt www.example.com

Last Updated 2020-02-22 Sat 20:09. Created by Jinghui Hu at 2018-11-03 Sat 11:04.