简介
Linux命令curl
可以被轻松地应用于 web 调试中,它们的好兄弟 wget 也是如此,或者也可以试试更潮的 httpie。本文罗列介绍curl
相关知识点,以便更方便的使用。
linux curl
本文使用的curl版本是:
1 | [wangjstu@wangjstu ~]$ curl --version |
Linux curl 帮助文档:
1 | [wangjstu@wangjstu ~]$ curl --help |
命令速记[译]
基础案例
请求个人blog主页
1
curl https://wangjstu.github.io/
请求funet的ftp的README文件
1
curl ftp://ftp.funet.fi/README
通过端口8000获取某主页
1
curl http://www.weirdserver.com:8000/
获取ftp站点的目录列表
1
curl ftp://ftp.funet.fi/
通过字典查询单词
1
2
3
4
5
6
7
8
9//Aliases for ‘m’ are ‘match’ and ‘find’, and aliases for ‘d’ are ‘define’ and ‘lookup’
查询bash单词的含义
curl dict://dict.org/d:bash
列出所有可用词典
curl dict://dict.org/show:db
在foldoc词典中查询bash单词的含义
curl dict://dict.org/d:bash:foldoc
查看curl的定义
curl dict://dict.org/m:curl一次请求两个页面
1
curl ftp://cool.haxx.se/ http://www.weirdserver.com:8000/
获取ftps上文件
1
curl ftps://files.are.secure.com/secrets.txt
获取ftps上文件
1
2
3
4直接使用ftps协议
curl ftps://files.are.secure.com/secrets.txt
使用ftp协议,并增加ssl选项
curl --ftp-ssl ftp://files.are.secure.com/secrets.txt通过ssh协议(SFTP)结合账号名获取一个文件
1
curl -u username sftp://example.com/etc/issue
通过ssh协议(SCP)结合私钥获取一个文件
1
2
3
4密码不保护输入方式
curl -u username: --key ~/.ssh/id_rsa scp://example.com/~/file.txt
密码保护方式
curl -u username: --key ~/.ssh/id_rsa --pass private_key_password scp://example.com/~/file.txt访问已个IPV6站点下载文件
1
curl "http://[2001:1890:1112:1::20]/"
访问SMB站点下载文件
1
curl -u "domain\username:passwd" smb://server.example.com/share/file.txt
下载保存到文件(Download to a File)
访问某站点主页并将主页另存为到本地
1
curl -o thatpage.html http://www.netscape.com/
访问某站点主页并将主页内容按URL最后文件名报错在本地,如果没有文件名,则报错
1
2
3curl -O http://www.netscape.com/index.html
同时下载2个
curl -O www.haxx.se/index.html -O curl.haxx.se/download.html
使用普通认证(账号密码 Using Passwords)
FTP
1
2
3
4使用URL中传输账号名密码的格式请求认证
curl ftp://name:passwd@machine.domain:port/full/path/to/file
或者使用 -u 参数
curl -u name:passwd ftp://machine.domain:port/full/path/to/fileFTPS
1
更加推荐通过使用FTP://和--ftp-ssl选项完成。
SFTP/SCP
1
选项--key表示私钥,--pass表示密码,--pubkey表示公钥
HTTP
1
2
3
4
5支持以下两种方式:
curl http://name:passwd@machine.domain/full/path/to/file
curl -u name:passwd http://machine.domain/full/path/to/file
第一种方式会由于URL规范中不能包含用户名和密码,虽然curl支持,但是通过代理时无法正常使用。
HTTP提供了许多不同的身份验证方法,curl支持以下几种方法:Basic, Digest, NTLM and Negotiate (SPNEGO)。默认curl是Basic模式,可以使用--anyauth来与服务器选用一种更安全的方式。HTTPS
1
2
3
4
5
6最常与私人证书一起使用:
curl -k https://www.thesitetoauthenticate.com/test -v –key key.pem –cacert ca.pem –cert client.pem
curl -X GET -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1MjgwMTY5MjIsImlkIjowLCJuYmYiOjE1MjgwMTY5MjIsInVzZXJuYW1lIjoiYWRtaW4ifQ.LjxrK9DuAwAzUD8-9v43NzWBN7HXsSLfebw92DKd1JQ" -H "Content-Type: application/json" https://127.0.0.1:8081/v1/user --cacert conf/server.crt --cert conf/server.crt --key conf/server.key
代理(proxy)
curl支持HTTP及SOCKS代理,但是对FTP协议没有特别支持,不过可以HTTP及SOCKS的代理去向FTP传输文件。
1 | curl -x my-proxy:888 ftp://ftp.leachsite.com/README //代理名字叫my-proxy,端口是888 |
断点续传(Ranges)
http 1.1支持断点续传,可以一部分一部分下载,curl使用 -r 参数。
1 | curl -r 0-99 http://www.get.this/ //获取前一百个字节 |
上传文件(Uploading[FTP/FTPS/SFTP/SCP/HTTP])
1 | curl -T - ftp://ftp.upload.com/myfile //将标准输入的数据全部上传到ftp |
debug追踪(Verbose / Debug)
1 | curl -v ftp://ftp.upload.com/ //-v参数可以用来查看curl请求失败时,server端返回的详细错误信息 |
查看返回头信息(Detailed Information)
1 | curl 可以使用 -I/--head 展示HTTP/FTP的头信息(仅展示头信息)。或使用-i/--include展示头信息及body。另外curl支持-D/--dump-header将body与头信息分开,头信息存储在单独制定的文件中,body返回展示。可以用来临时保存cookie等头信息。 |
POST(HTTP)
1 | -d 支持 application/x-www-form-urlencoded mime-type表单传输: |
Referrer
1 | curl -e www.coolsite.com http://www.showme.com/ //curl可以使用-e参数指定http请求头中的referred值 |
客户端请求标志头信息(User Agent)
1 | curl -A 'Mozilla/3.0 (Win95; I)' http://www.nationsbank.com/ //-A或者--user-agent标志请求的客户端的标志头信息 |
Cookies
1 | HTTP是无状态的,为了解决这个问题,一般HTTP服务端返回cookie信息格式如下:Set-Cookie: sessionid=boo123; path="/foo";用于对客户端进行唯一标志状态。传输cookie可以使用以下方法: |
进度信息(Progress Meter)
1 | curl请求时候经常返回如下信息 |
以上信息表示:
1 | - 整体传输完成百分比 |
限速请求(Speed Limit)
1 | curl -Y 3000 -y 60 www.far-away-site.com //如果速度小于300bytes/s,并持续1分钟,则终止curl |
配置信息(Config File)
curl 请求时会从本地home目录中的.curlrc (windows中是 _curlrc)中读取一些共用的配置信息,如proxy等:
1 | We want a 30 minute timeout: |
如果要阻止使用配置文件,使用-q参数:curl -q www.thatsite.com
另外可以使用-K/–config来读取一些配置从stdin中:echo "user = user:passwd" | curl -K - http://that.secret.site.com
头信息(Extra Headers)
可以使用-H参数传输头信息到Server端,如curl -H "X-you-and-me: yes" www.love.com
curl -H "Host:" www.server.com
会发出异常的头信息。
FTP and Path Names
1 | curl ftp://user:passwd@my.site.com/README //从ftp的服务主目录下载README,相对地址 |
SFTP and SCP and Path Names
1 | curl -u $USER sftp://home.example.com/~/.bashrc //sftp: 和 scp: URLs显示的是绝对地址,下载home目录中的文件 |
FTP and Firewalls
1 | curl -P - ftp.download.com //使用默认网卡下载,即为使用端口地址,而不是使用PASV |
Network Interface
1 | curl --interface eth0:1 http://www.netscape.com/ //使用网卡eth0,端口1请求 |
HTTPS
安装了TLS(传输层安全)库之后,curl可以请求一般的https站点:
1 | curl https://www.secure-site.com |
另外,还支持客户端使用私有证书请求,但是请求中证书必须是PEM格式。如下是请求案例
1 | curl -E /path/to/cert.pem:password https://secure.site.com/ //使用密码+pem证书请求。这类请求如果未填写密码,则在收数据前会收到提示,填写密码 |
一般申请的证书都是PIE((Personal Information Exchange),可以通过以下方式转换为pem:
1 | 1) 第一类:密码+证书 |
持续传输(Resuming File Transfers)
1 | curl -C - -o file ftp://ftp.server.com/path/file //继续从ftp下载 |
Time Conditions
If-Modified-Since与If-Unmodified-Since常用语静态文件缓存或断点续传下载等。先了解一下两者的区别:
- If-Unmodified-Since
HTTP协议中的 If-Unmodified-Since 消息头用于请求之中,使得当前请求成为条件式请求:只有当资源在指定的时间之后没有进行过修改的情况下,服务器才会返回请求的资源,或是接受 POST 或其他 non-safe 方法的请求。如果所请求的资源在指定的时间之后发生了修改,那么会返回 412 (Precondition Failed) 错误。
常见的应用场景有两种:
与 non-safe 方法如 POST 搭配使用,可以用来优化并发控制,例如在某些wiki应用中的做法:假如在原始副本获取之后,服务器上所存储的文档已经被修改,那么对其作出的编辑会被拒绝提交。
与含有 If-Range 消息头的范围请求搭配使用,用来确保新的请求片段来自于未经修改的文档。
- If-Modified-Since
If-Modified-Since 是一个条件式请求首部,服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 200 。如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 304 响应,而在 Last-Modified 首部中会带有上次修改时间。 不同于 If-Unmodified-Since, If-Modified-Since 只可以用在 GET 或 HEAD 请求中。
当与 If-None-Match 一同出现时,它(If-Modified-Since)会被忽略掉,除非服务器不支持 If-None-Match。
最常见的应用场景是来更新没有特定 ETag 标签的缓存实体。
CURL也支持:
1 | curl -z local.html http://remote.server.com/remote.html //如果服务器端文件更新则下载 |
DICT
1 | 别名m的意思是匹配(match)并查找(find),而别名d是定义(define)并查找(lookup)的意思 |
轻量目录访问协议(LDAP)
linux上需要安装OpenLDAP库,windows上需要安装WinLDAP。LDAP默认用LDAPv3,当失败时有机制调用LDAPv2。
1 | curl -B "ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se" |
环境变量(Environment Variables)
curl会从环境变量中获取:http_proxy, HTTPS_PROXY, FTP_PROXY代理信息。可以通过ALL_PROXY设置所有都默认使用的代理,可以使用NO_PROXY设置不适用的代理。使用-x/–proxy 会覆盖这些环境变量。linux系统设置http/https proxy的方法,在文件 .bashrc 中添加,或者在/etc/bashrc或者/etc/profile中添加如下环境变量:
1 | export http_proxy=proxy_addr:port |
netrc
文件.netrc用于设置自动登录时所需要的帐号信息。下面是一个常用的”netrc”文件的内容:
1 | machine somehost.com login username password passwd |
curl支持-n/–netrc 和 –netrc-optional 命令参数指向使用netrc。
自定义输出(Custom Output)
-w/–write-out参数用于在一次完整且成功的操作后输出指定格式的内容到标准输出。
1 |
|
支持参数参见该文档
Kerberos FTP传输
1 | curl --krb private ftp://krb4site.com -u username:fakepwd |
TELNET
1 | curl telnet://remote.server.com //向远端服务器访问,将stdin输入的数据传到远端,可以用-o将stdout输出到文件,-N/--no-buffer关闭输出 |
持久连接(Persistent Connections)
在一个命令行中指定多个文件将使curl按指定的顺序依次传输所有文件。libcurl将尝试为传输使用持久连接,这样到同一主机的第二个传输就可以使用在前一个传输中已经启动并处于打开状态的连接。这大大减少了除了第一次传输之外的所有连接时间,并且更好地利用了网络。请注意,curl不能对在随后的curl调用中使用的传输使用持久连接。如果使用相同的主机,尝试在相同的命令行中填充尽可能多的url,因为这会使传输更快。如果使用HTTP代理进行文件传输,实际上所有传输都是持久的。
单命令多请求(Multiple Transfers With A Single Command Line)
1 | curl -O http://url.com/file.txt ftp://ftp.com/moo.exe -o moo.jpg //第一个请求使用-O将获取到的文件保存到本地,命名为file.txt,第二个请求用-o ,另存为moo.jpg |
IPv6
1 | curl -g http://[2001:1890:1112:1::20]/overview.html |
Metalink
1 | curl --metalink http://www.example.com/example.metalink |
常见问题记
官方常见问题
-F与-d区别
当form表单以enctype=multipart/form-data提交时,使用-F,常见场景是上传文件时,
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<form action="submit.cgi" method="post" enctype="multipart/form-data">
Name: <input type="text" name="person"><br>
File: <input type="file" name="secret"><br>
<input type="submit" value="Submit">
</form>
HTTP请求头如下:
POST /submit.cgi HTTP/1.1
Host: example.com
User-Agent: curl/7.46.0
Accept: */*
Content-Length: 313
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------d74496d66958873e
--------------------------d74496d66958873e
Content-Disposition: form-data; name="person"
anonymous
--------------------------d74496d66958873e
Content-Disposition: form-data; name="secret"; filename="file.txt"
Content-Type: text/plain
contents of the file
--------------------------d74496d66958873e--
使用案例:curl -F 'name=Dan'-F secret=@file.txt -H 'Content-Type: multipart/magic' https://example.com当form表单以application/x-www-form-urlencoded(默认)提交时,使用-d将’name=value’键值对进行URL encode,保证安全。当使用-d传输原数据或json格式时,记得修改Content-Type。
PUT 请求如何发
1 | curl -d "data to PUT" -X PUT http://example.com/new/resource/file |
http2 http3如何发请求
1 | curl --http2 http://example.com/ |
curl HTTP cheat sheet
Verbose | Hide progress | extra info | Write output | Timeout |
---|---|---|---|---|
-v | -s | -w “format” | -O | -m |
–trace-ascii | -o | |||
POST | multipart | PUT | HEAD | custom |
-d “string” | -F name=value | -T | -I | -X “METHOD” |
-d @file | -F name=@file | |||
Basic auth | read cookies | write cookies | send cookies | user-agent |
-u user:password | -b | -c | -b “c=1; d=2” | -A “string” |
Use proxy | Headers, add/remove | follow redirs | gzip | insecure |
-x host:port | -H “name: value” | -L | –compressed | -k |
-H “name:” |