一、最新版本
你可以在官网上了解到curl
的开发的最新情况,并下载到最新版本的程序。
二、相对简单的用法
1、从Netscape的网页服务器上获得该网站的主页:
curl http://www.netscape.com/
2、从futnet的ftp
服务器的用户主目录获得指定文件:README
curl ftp://ftp.funet.fi/README
3、使用服务器的8000
端口获得web主页:
curl http://www.weirdserver.com:8000/
4、列出ftp站点目录中的文件:
curl ftp://cool.haxx.se/
5、从字典查询网站获得词条curl
的定义:
curl dict://dict.org/m:curl
6、次性操作取得二份文档:
curl ftp://cool.haxx.se/ http://www.weirdserver.com:8080/
7、从FTPS
服务器上获取文件:
curl ftps//files.are.secure.com/secrets.txt
curl http://www.netscape.com/
2、从futnet的ftp
服务器的用户主目录获得指定文件:README
curl ftp://ftp.funet.fi/README
3、使用服务器的8000
端口获得web主页:
curl http://www.weirdserver.com:8000/
4、列出ftp站点目录中的文件:
curl ftp://cool.haxx.se/
5、从字典查询网站获得词条curl
的定义:
curl dict://dict.org/m:curl
6、次性操作取得二份文档:
curl ftp://cool.haxx.se/ http://www.weirdserver.com:8080/
7、从FTPS
服务器上获取文件:
curl ftps//files.are.secure.com/secrets.txt
curl ftp://ftp.funet.fi/README
8000
端口获得web主页:
curl http://www.weirdserver.com:8000/
4、列出ftp站点目录中的文件:
curl ftp://cool.haxx.se/
5、从字典查询网站获得词条curl
的定义:
curl dict://dict.org/m:curl
6、次性操作取得二份文档:
curl ftp://cool.haxx.se/ http://www.weirdserver.com:8080/
7、从FTPS
服务器上获取文件:
curl ftps//files.are.secure.com/secrets.txt
curl ftp://cool.haxx.se/
curl
的定义:
curl dict://dict.org/m:curl
6、次性操作取得二份文档:
curl ftp://cool.haxx.se/ http://www.weirdserver.com:8080/
7、从FTPS
服务器上获取文件:
curl ftps//files.are.secure.com/secrets.txt
curl ftp://cool.haxx.se/ http://www.weirdserver.com:8080/
FTPS
服务器上获取文件:
curl ftps//files.are.secure.com/secrets.txt
或者使用推荐的方法访问FTPS
服务器来执行相同的操作:
curl --ftp-ssl ftp//files.are.secure.com/secrets.txt
8、使用SFTP
从一个SSH
服务器上获取一份文件:
curl -u username sftp://example.com/etc/issue
9、从一台使用私钥认证(私钥未使用密码保护)的SSH
服务器上使用SCP
获取一份文件:
curl -u username: --key ~/.ssh/id_rsa \
scp://example.com/~/file.txt
10、从一台使用私钥认证(私钥使用密码保护)的SSH
服务器上使用SCP
获取一份文件:
curl -u username: --key ~/.ssh/id_rsa --pass private_key_password \
scp://example.com/~/file.txt
11、从一台使用IPv6
的网页服务器上获得站点主页:
curl "http://[2001:1890:1112:1::20]/"
12、从一台Samba
文件服务器上获得文件:
curl -u "domain\username:passwd" smb://server.example.com/share/file.txt
三、下载文件
1、从网页服务器上下载一个web页面到当前目录中,并重新指定文件名:
curl -o thatpage.html http://www.netscape.com/
2、从网页服务器上下载一个文件存储到本地,但不重新指定文件名:
curl -u username sftp://example.com/etc/issue
SSH
服务器上使用SCP
获取一份文件:
curl -u username: --key ~/.ssh/id_rsa \
scp://example.com/~/file.txt
10、从一台使用私钥认证(私钥使用密码保护)的SSH
服务器上使用SCP
获取一份文件:
curl -u username: --key ~/.ssh/id_rsa --pass private_key_password \
scp://example.com/~/file.txt
11、从一台使用IPv6
的网页服务器上获得站点主页:
curl "http://[2001:1890:1112:1::20]/"
12、从一台Samba
文件服务器上获得文件:
curl -u "domain\username:passwd" smb://server.example.com/share/file.txt
三、下载文件
1、从网页服务器上下载一个web页面到当前目录中,并重新指定文件名:
curl -o thatpage.html http://www.netscape.com/
2、从网页服务器上下载一个文件存储到本地,但不重新指定文件名:
curl -u username: --key ~/.ssh/id_rsa --pass private_key_password \
scp://example.com/~/file.txt
IPv6
的网页服务器上获得站点主页:
curl "http://[2001:1890:1112:1::20]/"
12、从一台Samba
文件服务器上获得文件:
curl -u "domain\username:passwd" smb://server.example.com/share/file.txt
三、下载文件
1、从网页服务器上下载一个web页面到当前目录中,并重新指定文件名:
curl -o thatpage.html http://www.netscape.com/
2、从网页服务器上下载一个文件存储到本地,但不重新指定文件名:
curl -u "domain\username:passwd" smb://server.example.com/share/file.txt
1、从网页服务器上下载一个web页面到当前目录中,并重新指定文件名:
curl -o thatpage.html http://www.netscape.com/
2、从网页服务器上下载一个文件存储到本地,但不重新指定文件名:
curl -o thatpage.html http://www.netscape.com/
这种情况下,需要在URL中指定待下载的文件名,否则将下载失败
curl -O http://www.netscape.com/index.html
3、使用原文件名一次性从服务器上下载二份文件:
curl -O www.haxx.se/index.html -O curl.haxx.se/download.html
四、使用密码
1、FTP
curl -O www.haxx.se/index.html -O curl.haxx.se/download.html
1、FTP
对于ftp文件来说,应当加用户名和密码加入到URL地址中,用法如下:
curl ftp://name:passwd@machine.domain:port/full/path/to/file
或者使用参数-u
来指定用户名和密码,用法如下:
curl -u name:passwd ftp://machine.domain:port/full/path/to/file
2、FTPS
FTPS使用密码的方式与FTP的用法很像,只不过是要指定参数--ftp-ssl
来进行加密认证而已。
注意:使用FTPS://
为前缀是以一种‘暗示’的对服务器进行访问标准方法;当然,你也可以使用‘明示’的方法,用FTP://
前缀,配合参数--ftp-ssl
使用。
3、SFTP/SCP
和FTP
使用方法类似,但是你需要使用参数--key
来指定私钥文件来代替系统密码。需要注意的是,私钥文件本身也可以使用密码进行保护,但这个密码并不是远程服务器的登录密码。私钥文件本身的密码需要通过参数--pass
来进行指定。一般情况一下,curl
会自动地从私钥文件中提取公钥,但是curl
在没有适当的目录支持的情况下,则必须使用参数--plukey
来指定与私钥匹配的公钥文件。
4、HTTP
Curl
同样支持在HTTP``URL
中使用用户名和密码,因此你可以使用下面的方法从服务上获取文件:
curl http://name:passwd@machine.domain/full/path/to/file
或者另行使用参数来指定用户名和密码:
curl -u name:passwd http://machine.domain/full/path/to/file
在HTTP提供的诸多认证方式中,curl
支持下列认证:Basic
, Digest
, NTLM
和 Negotiate
(SPNEGO)。在未指定任何认证方式的情况下,curl
默认使用Basic
。你可以通过使用‘–anyauth’来告诉curl
使用何种服务器能够接受的加密方式来访问指定的URL地址。
注意:根据URL
的要求,HTTP
URLs
是不能包含用户名和密码的。因此curl
在使用代理的情况下是无法以这种方式正常工作的,即使curl
有时候是允许这样操作的。当使用代理的情况下,你必须使用参数-u
来指定用户和密码。
5、HTTPS
HTTPS可能是私钥认证最觉的方式,具体内容见下文。
五、代理
curl
同时支持HTTP
和SOCKS
代理服务器,并且可以指定适当的认证方式。因为没有相应的标准,所以curl
并没有对FTP
代理服务器进行特殊的设置,但是curl
也可以大部分的FTP
代理服务器下正常工作。你可以使用HTTP
或者SOCKS
代理从FTp
服务器上下载和上传文件。
1、使用名为my-proxy
的HTTP
代理服务器,通过888
端口,从一台FTP
服务器上下载指定文件:
curl -x my-proxy:888 ftp://ftp.leachsite.com/README
2、使用上面的代理服务器,通过用户名和密码从指定的HTTP
服务器上下载文件:
curl -u user:passwd -x my-proxy:888 http://www.get.this/
3、一些代理服务器要求指定认证方式。所以上面的命令需要将-u
改为-U
:
curl -U user:passwd -x my-proxy:888 http://www.get.this/
4、用逗号分隔的主机或者域名列表中,如果有不使用代理服务器的,应如下指定:
curl --noproxy localhost,get.this -x my-proxy:888 http://www.get.this/
5、如果使用--proxy1.0
代替--proxy
或者-x
来指定代理服务器的工作协议,那么curl
将使用HTTP/1.0
代替 HTTP/1.1
来尝试进行任何连接。
6、curl
使用参数--socks4
和--socks5
来支持SOCKS4
和SOCKS5
代理
可以参见Curl
所支持的环境变更,来针对代理服务进行高级设置。
7、从FTP客户端的角度来看,大部分的FTP代理服务器都被设置为类似于普通的FTP服务器,这些服务器需要通过特殊的命令来选择远程服务器。
curl
支持使用-u
,-Q
和--ftp-account
选项来设置通过大多数FTP代理来文件远程服务器。
举例:使用相关参数,通过FTP
代理服务器,向远程FTP
服务器上传一份文件:
curl -u "Remote-FTP-Username@remote.ftp.server Proxy-Username:Remote-Pass" \
--ftp-account Proxy-Password --upload-file local-file \
ftp://my-ftp.proxy.server:21/remote/upload/path/
查看你的FTP代理服务器手册来设置与之匹配的文件传输,并使用curl
的-v
选项来查看curl
的传输内容。
六、范围
HTTP 1.1
引入了字节范围。通过这个功能,客户端可以要求只获取一个指定文件的一部分内容。curl
通过参数-r
来支持此功能。
1、获取一份文件的前100个字节:
curl -r 0-99 http://www.get.this/
2、获取一份文件最后500个字节:
curl -r -500 http://www.get.this/
3、Curl
同时也支持下载FTP
服务器上的文件的一定范围内的内容.
你可以指定文件的开始和结束的位置。
从FTP
服务器上获取一份文件的前100个字节的内容:
curl -r 0-99 ftp://www.get.this/README
七、上传
(一)、FTP / FTPS / SFTP / SCP
1、上传标准输入的所有数据到指定服务器:
curl -T - ftp://ftp.upload.com/myfile
2、使用用户名和密码,上传指定文件到服务器上(在URL中指定远程文件名称):
curl -T uploadfile -u user:passwd ftp://ftp.upload.com/myfile
3、将本地文件上传到远程站点,远程服务器上的文件使用与本地文件相同的文件名:
curl -T uploadfile -u user:passwd ftp://ftp.upload.com/
4、将待上传的文件追加指定的远程文件之后:
curl -T localfile -a ftp://ftp.upload.com/remotefile
5、curl
也支持使用代理来完成文件上传到ftp
,但是只有在代理服务器已经被配置为允许此类型的通道时才可以完成传输。如果代理服务器支持话,你就可以使用与下面命令类似的命令来完成文件的上传:
curl --proxytunnel -x proxy:port -T localfile ftp.upload.com
(二)、SMB / SMBS
curl -T file.txt -u "domain\username:passwd" smb://server.example.com/share/
(三)、HTTP
curl -T file.txt -u "domain\username:passwd" smb://server.example.com/share/
**上传标准输入的所有数据到指定的HTTP
站点:
curl -T - http://www.upload.com/myfile
注意:HTTP
服务器必须被事先配置为接受PUT
, 上述命令才能被成功的执行。
对于HTTP
数据上传的其他方式,请参见POST
的相关内容。
八、VERBOSE / DEBUG
如果curl
没有按照预想的方式运行,或者服务器拒绝你的访问,再或者你根本看不懂反馈信息,请使用参数-v
来获取完成的运行信息。curl
将输出大量的发送和接收信息,来让用户查看所有的客户端和服务器的交互内容,但它并不会显示你的真实数据。
curl -v ftp://ftp.upload.com/
如果还想从curl
获得更为详尽的信息,请尝试使用参数--trace
或者--trace-ascii
同时指定日志文件的名称:
curl --trace trace.txt www.haxx.se
更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2017-12/149659p2.htm
九、详细信息
不同的网络协议会提供获取特定文件或者文档详细信息不用的方法。想让curl
显示单个文件的详细信息,你应该使用参数-I
或者--head
。使用该参数,执行结果将显示单个文档基于HTTP和FTP的所有可用信息。如果文档是基于HTTP的话,会有大量的信息可供查阅。
基于HTTP, 你可以使用-i
或者--include
获取文档实际数据之前的header
信息(这部分内容与使用-I
参数得出的header
信息应该是一致的)。当你从FTP
或者HTTP
上获取文件时,可以使用参数-D
或者--dump-header
,这样curl
就可以将文件的header
信息保存到指定的文件里了。
下面举例说明,将HTTP
的header
存储到指定文件的方法,以header.txt文件为例:
curl --dump-header headers.txt curl.haxx.se
注意:将header
信息存储到指定的文件中对于你想使用curl
向服务器发送cookes
是一种非常有用的方法。更多内容请参见cookies
小节。
十、POST (HTTP)
使用curl
提交数据(post data)是非常容易的, 具体的方法就是使用参数-d <data>
。待提交的数据必须经过urlencoded
。
修改一个简单的由姓名
和电话
组成的留言本。
curl -d "name=Rafael%20Sagula&phone=3320780" \
http://www.where.com/guest.cgi
**举例说明怎样通过使用curl
来提交一个表单:
在你想要填写的表单中找出所有的<input>
标签,在curl
的官网上有一个名叫formfind.pl
的perl
程序可以帮助你快速完成这一步骤。
如果这是一次“常规”的提交,你可以使得参数-d
来完成提交。-d
将会使用如下格式提交一份完成的”提交字符(post string)”:
<variable1>=<data1>&<variable2>=<data2>&...
变量(variable)是你在<input>
标签中找到的表单项,如“name”; 而=
后面的数据(data)就是你要在该表单项下填写的内容,但是注意这里的数据必须是经过URL编码的。这就意味着,你需要将空格
替换成+
, 而将字母替换为%XX
,其中的XX
的以十六进制表示的ASCII编码的字符。
举例说明:
表单页面为:
<form action="post.cgi" method="post">
<input name=user size=10>
<input name=pass type=password size=10>
<input name=id type=hidden value="blablabla">
<input name=ding value="submit">
</form>
我们在这表单中想输入用户为:foobar
, 密码为:123456
。
要提供这份表单,你需要输入下面的curl
命令:
curl -d "user=foobar&pass=12345&id=blablabla&ding=submit" http://www.formpost.com/getthis/post.cgi
当使用参数-d
时mime类型application/x-www-form-urlencoded
通常会被CGI
或者类似的接口所接受,curl
同时还支持功能更强的multipart/form-data
类型,后者提供诸如文件上传的功能。
-F
接受-F "name=contents"
形式的参数。如果你想从文件中读取表单的数据内容,可以使用<@filename>
的形式来指定文件名。如果在指定文件的的同时,你还能指定文件的类型,那可以在文件名后面追加内容;type=<mime type>
。你也在一个表单项中一次提交多份文件。
例如,使用名为’coolfiles’表单项用于提交三份类型不同的文件,应该使用如下的命令行格式:
curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html" \
http://www.post.com/postit.cgi
如果文件的类型没有被指定,那么curl
将会从文件的扩展名来判断文件的类型(其支持扩展名各类比较少),或者前面指定过文件类型的文件来判断(多个文件被指定在一个文件列表中),如果以上方法都不行的话,curl
就会使用默认的类型application/octet-stream
.
使用-F
参数还填写一个有三个表单项的表单。三个表单项分别为:待提交的文件名、你的姓名和文件描述。待提交的文件名为cooltext.txt
。使用curl
来代替你常用的浏览器来提交表单,你必须从HTML源代码来读取表单,并找出待输入的表单项名称。在此例中,输入的表单项的名称分别为:file
,yourname
和filedscription
.
curl -F "file=@cooltext.txt" -F "yourname=Daniel" -F "filedescription=Cool text file with cool text inside" http://www.post.com/postit.cgi
想要在一次提交操作中上传二份文件,你需要使用如下二种方式之一:
1、在一个表单项中,填入多个文件:
curl -F pictures=@dog.gif,cat.gif
2、 使用二个表单项,分别填入一个文件:
curl -F "docpicture=@dog.gif" -F catpicture=@cat.gif
如果只是发送表单项的字面值(文件名),而不是发送实际文件,就不需要使用前缀@
,<
或者嵌入;type=
, 这时推荐使用--form-string
来代替-F
。 特别是不能确定用户来源的情况下,使用-F
来代替--form-string
,将会使用户有机会欺骗curl
来进行文件上传操作。
十一、REFERRER
一个HTTP请求应该包含跳转到当前有页面之前的页面的地址信息。curl
允许你使用命令行来指定一个referrer
。这对于欺骗依赖于特定信息的服务器程序或者CGI
脚本来说是非常用的功能。
curl -e www.coolsite.com http://www.showme.com/
定义: referrer 属性可返回载入当前文档的文档的 URL。
十二、USER AGENT
一个HTTP请求应该包含生成该请求的浏览器的相关信息。curl
允许你使用命令行来指定一个浏览器。 这对于只接受特定浏览器请求的服务器或者CGI
脚本来说是非常有用的功能。
举例说明:
curl -A 'Mozilla/3.0 (Win95; I)' http://www.nationsbank.com/
其他表示浏览器的字符串如下:
字符串 | 浏览器 |
---|---|
‘Mozilla/3.0 (Win95; I)’ | Netscape Version 3 for Windows 95 |
‘Mozilla/3.04 (Win95; U)’ | Netscape Version 3 for Windows 95 |
‘Mozilla/2.02 (OS/2; U)’ | Netscape Version 2 for OS/2 |
‘Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)’ | NS for AIX |
‘Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)’ | NS for Linux |
表示Internet Explorer如下,但由于兼容性问题,不是每一次尝试都能成功:
字符串 | 浏览器 |
---|---|
‘Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)’ | MSIE FOR W95 |
Mozilla以外的浏览器类型:
字符串 | 浏览�� |
---|---|
‘Konqueror/1.0’ | KDE File Manager desktop client |
‘Lynx/2.7.1 libwww-FM/2.14’ | Lynx command line browse |
十三、COOKIES
Cookies
一般用于在Web服务端保持客户端的状态信息。服务器会通过在网页的头信息中加入一行来发送cookes,其内容如Set-Cookie: <data>
, 其中data
部分的值通常包含一系列的NAME=VALUE
的值,多个值之间用分号;
隔开,如”NAME1=VALUE1; NAME2=VALUE2;”。服务器还可以通过设置path=value
来指定cookies
值的路径,cookies
何时过期(expire=DATE
),使用什么域名(domain=NAME
)以及是否应该在安全的连接下来使用cookies
(secure
)。
如果你从服务器收到一个页面,其头部中包含如下内容:
Set-Cookie: sessionid=boo123; path="/foo";
这就意味着在我们想从以/foo
开始的路径获取相关信息的时间,服务器需要取得的第一个赋值对
例如,一个页面想要从一个cookie
中获取我的姓名, 使用curl
,应输入如下命令:
curl -b "name=Daniel" www.sillypage.com
curl
也可以使用在之前的会话收到的cookies
。如果你想从服务器获取cookies
并将他们保存到本地的一个文件中,应该使用如下的命令:
curl --dump-header headers www.example.com
然后你就可以使用从页面头部获得的cookies
,再次连接这个站点或者其他站点了:
curl -b headers www.example.com
虽然能过将页面的头部存储到本地文件中来实现cookies
的存储是一个有效的方法,但是因为容易出错,所以我们不推荐使用这种方法来进行相关操作。取而代之的方法是使用curl
将取回的cookies
以众所周知的netscape cookie
的格式进行保存,具体方法如下:
curl -c cookies.txt www.example.com
需要注意的是,通过使用-b
你可以开启cookie awareness
, 同时配合 -L
使用,你可以让curl
将cookie
存储到一个指定的位置(通常这个位置与cookies结合在一起使用)。这样,如果一个站点需要同时发送cookies
及其位置的话,你就可以使用并不存在的文件来激活cookie awareness
了,具体方法如下:
curl -L -b empty.txt www.example.com
被读取cookies
的文件必须是以经过格式化的HTTP头部的文件,或者是netscape
样式的cookie
文件。curl
可以自行判断该文件是基于何种形式进行存储的。在上面的命令中,curl
将会解析头部并存储从www.example.com收到的cookies
。curl
会根据指定的文件位置,向服务器发送经过存储的,并与其请求匹配的cookies
。文件empty.txt
很有可能并不存在。
读写一个netscape cookie
文件,你可以同时对同一个文件使用参数-b
和-c
:
curl -b cookies.txt -c cookies.txt www.example.com
十四、处理进度
处理进度将会显示给用户在实现操作中发生了什么事情。其输出的各字段如下:
% Total % Received % Xferd Average Speed Time Curr.
Dload Upload Total Current Left Speed
0 151M 0 38608 0 0 9406 0 4:41:43 0:00:04 4:41:39 9287
从左至右各字段为:
字段 | 含义 |
---|---|
% | 整体传输完成百分比 |
Total | 整体传输的大小 |
% | 下载完成百分比 |
Received | 当前已下载的字节数 |
% | 上传完成百分比 |
Xferd | 当前已上传的字节数 |
Average Speed Dload | 平均下载速度 |
Average Speed Upload | 平均上传速度 |
Time Total | 预计完成全部传输所需的时间 |
Time Current | 当前所消耗的时间 |
Time Left | 预计完成剩余传输所需的时间 |
Curr.Speed | 最近5秒内平均传输速度(传输最开始5秒,该值是基于线路理论上的速度来计算的) |
使用参数-#
将会显示一个完全不同的进度条,这里就不做过多的解释了。
十五、限速
curl
允许用户设置传输速度条件以保证网络传输持续进行。通过使用-y
和-Y
这二个开关,你可以让curl
在特定时间周期内,如果传输速度在设置的最低值以下,则忽略数据传输。
如果想让curl
在最近一分钟内,传输速度低于3000字节/秒的情况下,忽略数据下载,应执行如下命令:
curl -Y 3000 -y 60 www.far-away-site.com
使用下面的例子通过很好的将时间条件进行组合,来将上一条命令实现为整个操作必须在30分钟内处理完成:
curl -m 1800 -Y 3000 -y 60 www.far-away-site.com
强制curl
在传输数据时不要超过一个给定的速率也是可以实现的,此操作尤其是在你不想让curl
的数据传输占据你全部的网络带宽的情况下是非常有用的,使用起来就好像是一个带宽的调节器一样。
将curl
的数据传输速度限制为10K/s
应执行:
curl --limit-rate 10K www.far-away-site.com
或者:
curl --limit-rate 10240 www.far-away-site.com
将curl
的数据上传速度限制为1Mb/s
应执行:
curl -T upload --limit-rate 1M ftp://uploadshereplease.com
当使用参数--limit-reate
时,传输速度通常是以秒为单位,会导致整体的传输速度低于给定的数值。有个别时候,如果你的网络传输出现延迟的情况下,传输的速度会非常的慢。
十六、配置文件
curl
会在程序启动时会自动尝试读取用户家目录中的.curlrc
文件,如果在win32
系统下配置文件名为_curlrc
。
配置文件可以使用普通的命令行开关组成,但是你也可以指定长选项来代替破折号来增加配置文件的可读性。你可以使用空格
,=
或者:
来分隔参数及其值。配置文件中也可以使用注释。通过将每一行首字符设置成#
,来完成单行的注释。
如果你希望参数中包含空格的话,你可以使用双引号"
将整个参数括起来。如果在双引呈里如果还要输入一个双引号,可以使用\"
的形式。
注意:你配置在一行之内完成参数的赋值。
例如:在配置文件中设置默认的连接超时和代理
# We want a 30 minute timeout:
-m 1800
# ... and we use a proxy for all accesses:
proxy = proxy.our.domain.com:8080
白空格
符号ARE
会出现在每一行的未必,但是所有以白空格
做为首字符的行,都将被忽略。
通过将参数-q
放到curl
命令行的第一个参数的位置,可以阻止curl
读取默认的配置文件:
curl -q www.thatsite.com
在没有可以使用的URL的情况下,如果想让curl
获取和显示本地帮助页面,就应该按如下方式设定配置文件:
# default url to get
url = "http://help.with.curl.com/curlhelp.html"
你也可以给用参数-k
或者--config
来给curl
指定其他的配置文件。如果你将配置文件的文件名设置为”-
“, 那么curl
就会从标准输入里读取配置文件,这样你就可以手工处理一些需要隐藏的选项了:
echo "user = user:passwd" | curl -K - http://that.secret.site.com
十七、附加头部(EXTRA HEADERS)
当你在自己特殊的程序中使用curl
时, 你可以需要在获取web页面时在最后加入自定义的头部信息。你可以使用参数-H
来完成这一操作。
例如,当获取一个页面的时候将头部信息 “X-you-and-me: yes”发送到服务器:
curl -H "X-you-and-me: yes" www.love.com
这在你想将不同的文本做为html头部发送给服务器的情况下十分有用。curl
将使用-H
指定的html头部将代替默认的html头部来进行发送。如果你将头部信息中的相关值赋成空值,那个你将阻止该项头部信息的发送。如阻止发送主机名(Host):
curl -H "Host:" www.server.com
十八、FTP的路径和文件名
需要强调的当从一个以ftp://
开头的URL地址下获取文件的时候,给定的路径是与你进入的目录有相关的。如,从你的ftp站点的家目录中获取README
,你需要执行:
curl ftp://user:passwd@my.site.com/README
但如果你想要从同一个站点的根目录中获取README
文件的话,你就需要指定文件的绝对路径了:
curl ftp://user:passwd@my.site.com//README
在文件名之前多了一个额外的/
十九、SFTP和SCP的路径和文件名
对于sftp:
和scp:
的URL来说,给定的路径和文件名都表示为在服务器上的绝对路径和文件名。对一个文件的访问与远程用户的家目录相关,在文件名上需要加上前缀/~/
,例如:
curl -u $USER sftp://home.example.com/~/.bashrc
二十、FTP和防火墙
FTP协议要求在数据传输开始的同时再开放一条额外的连接给客户端。有二种方式可以完成这一操作
curl
默认的方式是使用PASV
命令让服务器再开放另一个端口等待已经连接的客户端来主动连接这一端口。对于客户端位于防火墙之后 ,而该防火墙不允许ftp通过防火墙主动连接客户端的情况,是非常好的解决方法。
curl ftp.download.com
对于如果ftp服务器也位于防火墙之后,该防火墙也不允许客户端主动连接除21
端口之外的其他端口情况,又或者服务器根本就不支持PASV
命令,这时就需要使用另一种方式:使用PORT
命令,并通知服务器使用通过参数指定给PORT
命令的IP和端口来主动连接客户端。
curl
的-P
参数支持一些不同的选择。你的主机可能拥有多个IP地址或者多块网卡, curl
允许你从它们当中进行选择。
使用默认的IP地址进行连接:
curl -P - ftp.download.com
使用le0
网卡的IP地址,通过端口进行下载(windows不适用):
curl -P le0 ftp.download.com
使用IP地址:192.168.0.10 通过商品进行下载:
curl -P 192.168.0.10 ftp.download.com
二十一、网络适配器
使用指定的网卡,从服务器上获取一个web页面:
curl --interface eth0:1 http://www.netscape.com/
或者:
curl --interface 192.168.1.10 http://www.netscape.com/
二十二、HTTPS
使用安全的HTTP要求在编译curl
之前完成SSL
库的安装。如果按此操作,curl
就具备了使用HTTPS
协议进行获取和提交文档的能力了。
例如:
curl https://www.secure-site.com
curl
还可以在要求使用证书认证的网站上使用你个人的证书来完成获取/提交的操作。唯一的缺点是证书需要用符合PEM
格式(PEM-format)。PEM是用来存储证书的标准和开放的格式,但它不被大部分主流浏览器所使用(Netscape和MSIE使用的是被称为PKCS#12
的格式)。如果你想让curl
使用你最常用的浏览器所使用的证书,你需先下载和编译一个针对你浏览器证书格式的转换器,然后将你的浏览器证书转换成PEM
格式。该转换器包含在最新版本的OpenSSL软件包中,对于之前版本的OpenSSL软件包Stephen
N. Henson博士已经编写了一个针对SSLeay的补丁来增加该功能。你可以从下面的网址获得该补丁,前提是要求先安装SSLeay:
http://www.drh-consultancy.demon.co.uk/
下面举例说明如何使用带有密码的个人证书来自动获取一份文档:
curl -E /path/to/cert.pem:password https://secure.site.com/
如果你忘记在命令行中指定证书的密码,程序将会在获取任何数据之前,提示你输入密码。
许多老版本的SSL服务器在使用新版本OpenSSL所使用的SSLv3
或者TLS
时会出现问题,因此有时为curl
指定所需要使用的SSL版本是非常有用的方法。使用-3
, -2
或者-1
(分别代表 SSLv3
,SSLv2
或者SSLv1
)来精确指定curl
所使用的SSL版本:
curl -2 https://secure.site.com/
除此之外,curl
也会首先尝试使用v3
,然后再使用v2
。
使用OpenSSL来将你常用的浏览器证书转换成curl
可以使用的PEN格式的证书,你需要如下操作:
– 在Netscape中,你单击“安全”菜单按钮;
– 选择“证书 -> 你的证书”,然后在列表中选择一份证书;
– 单击“导出”按钮;
– 输入你的证书的PIN
码;
– 为你的证书选择一个存储位置;
– 运行openssl
程序进行证书转换。如果已经切换到openssl的安装目录,你可以执行如下命令:
# ./apps/openssl pkcs12 -in [file you saved] -clcerts -out [PEMfile]
对于Firefox进行如下操作:选择“选项”,然后“高级”,然后选择“加密”标签,查看证书。这时会打开证书管理器,你在其中可以进行证书的导出操作。但是要确保选择PEM做为证书的导出类型。
对于MSIE进行如下操作:选择“Internet选项“,然后选择”内容“标签,然后选择”证书“。接下来,你就以可以转换为PEM格式的证书类型的将证书进行导出操作。
对于Chrome进行如下操作:选择”设置“,然后选择”显示高级设置“。在HTTPS/SSL下选择证书管理。
二十三、文件续传
对于文件的断点续传,curl
支持HTTP(S)下载续传和FTP上传/下载续传。
下载续传一份文件:
curl -C - -o file ftp://ftp.server.com/path/file
上传续传一份文件(此功能要求FTP服务器支持非标准命令:SIZE
。如果不支持,curl会进行告知。)
curl -C - -T file ftp://ftp.server.com/path/file
从web服务器下载续传一份文件(此功能要求web服务器最少支持HTTP/1.1.如果不支持,curl会进行告知。)
curl -C - -o file http://www.server.com/
二十四、时间条件
HTTP允许客户端根据文档的要求指定一个时间条件。这个条件就是“如果-被修改-自从”或者“如果-未被修改-自从”。curl
允许你通过参数-z
或者--time-cond
来指定条件。
例如你可以很张轻松的完成诸如如果服务器上的文件的修改日期比本地文件复本的新就进行下载这样的操作,具体方法如下:
curl -z local.html http://remote.server.com/remote.html
或者,你也可以反过来,在本地文件的修改日期比服务器上的文件新时,才下载。要实现这个操作,只需要在日期字符串的前面加上一个-
即可:
curl -z -local.html http://remote.server.com/remote.html
你也可以指定一个任意的日期文本做为条件。告诉curl
只从服务器上下载在2012-1-12之后(包含该日期)更新的文件:
curl -z "Jan 12 2012" http://remote.server.com/remote.html
curl
也可以接受一个日期范围。你也可以使用加入-
的方法来进行日期条件的设置。
二十五、DICT
先尝试几个有趣的命令:
curl dict://dict.org/m:curl
curl dict://dict.org/d:heisenbug:jargon
curl dict://dict.org/d:daniel:web1913
别名m
的意思是匹配(match)并查找(find),而别名d
是定义(define)并查找(lookup)的意思。
例如:
curl dict://dict.org/find:curl
命令是使用RFC来描述URL的,但并不是DICT协议:
curl dict://dict.org/show:db
curl dict://dict.org/show:strat
操作这些操作是不需要认证,RFC本身也没有要求进行认证。
二十六、LDAP
如果你已经安装了OpenLDAP库,那么curl
就可以对ldap://
提供更为高级的支持了。
在Windows系统上, curl
将默认使用平台提供的WinLDAP。
curl
默认使用的协议版本为LDAPv3
。只有在使用LDAPv3
连接失败的情况下,才会降级使用LDAPv2
。
LDAP是一个复杂的东西,要写一个LDAP请求也不是一项轻松的任务。我强烈建议你从其他 什么地方查找相关的格式描述。其中一个存放地址如下:
RFC 2255, "The LDAP URL Format" https://curl.haxx.se/rfc/rfc2255.txt
这里举个例子,看看我是如何从我本地的LDAP服务器上获取所有人的,当然这个服务器有一个确定的子域名,这个子域名包含在电子邮件地址中:
curl -B ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se
如果我想得到HTML格式的相同信息的话,只需要去掉参数-B
(强制ASCII)即可。
你也可以在访问LDAP目录的时候使用认证:
curl -u user:passwd "ldap://ldap.frontec.se/o=frontec??sub?mail=*"
curl "ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*"
默认的情况下,如果提供了用户名和密码,OpenLDAP/WinLDAP将会使用基本的认证方式进行认证。在Windows上,你可以通过向curl
命令行提供下列参数之一来实现这一控制:--baisc
, --ntlm
和 digest
.
By default, if user and password provided, OpenLDAP/WinLDAP will use basic
curl --ntlm ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*
在Windows上,如果没有提供用户名和密码,将会自动使用当前登录的帐户认证信息(SSPI/SPNEGO)来进行认证。
二十七、环境变量
curl
能读取和理解下面这些环境变量:
http_proxy, HTTPS_PROXY, FTP_PROXY
这些变更应该被设置为协议指定的代理。
通常代理应该设置为:ALL_PROXY
如果限定一个以逗号分隔的主机列表中(,*
则匹配所有主机)的所有主机都不可以通过任何代理服务器,则应该被设置为:NO_PROXY。
如果主机名配置其中任何一个字符串,或者主机在其中任何一个字符串所包含的域中,这些节点将不能通过代理进行交互。当一个域被使用时,这需要先启动一段时间。用户可以通过对.example.com
这个域名设置NO_PROXY来使www.example.com
和foo.example.com
这二个主机不能使用代理。通过使用主机全名你可以排除特定的主机名,针对 www.example.com
设置NO_PROXY,就可以在禁止www.example.com
使用代理的情况下,而仍旧可以让foo.example.com
使用代理。
通过使用参数-x
或者--proxy
可以重写环境变量。
二十八、NETRC
Unix在很久以前就引入了.netrc
的概念。其提供了一个方法让用户可以在一个文件中为经常需要访问的FTP站点指定用户名和密码,这样你在访问这些站点的时,就不需要每次都输入用户名和密码了。你应该已经意识到:如果其他人得到了你的密码,这将面临巨大的安全隐患,因此,除非只有你自己有可读权限外,大多数unix程序都不会读取这些文件。然而curl
不会关心这些安全问题。
curl
就可以支持通过参数-n
/--netrc
和--netrc-optional
来指定.netrc
文件。而且不只是限定在FTP上使用,所以curl
可以在需要认证的地方,针对所有协议使用这些文件。
一个非常简单的.netrc
文件的内容,看起来应该是这样的:
machine curl.haxx.se login iamdaniel password mysecret
二十九、自定义输出
为了可以更好的让角本程序员了解关于curl的运行情况的相关信息,在这里引入了参数-w
/--write-out
。使用这些参数,你可以指定从上一次传输中提取你想要得到的信息。
要在完成传输后,另起一行,显示此次传输下载的总字节数,你需要使用如下的命令:
curl -w 'We downloaded %{size_download} bytes\n' www.download.com
三十、KERBEROS FTP传输
curl
支持将kerberos4
和kerberos5
/GSSAPI
用于FTP传输。你需要在编译curl
之前,完成kerberos
软件的安装。
首先,通过常规方法获取krb-ticket
, 比如使用kinit
/kauth
工具。
然后,通过以下的方法使用curl
:
curl --krb private ftp://krb4site.com -u username:fakepwd
这里没有使用-u
开关来指定密码,但是curl
会提示你输入在使用kinit
/kauth
工具创建krb-ticket
时所设置的密码。
三十一、TELNET
curl
只支持基本的、非常简单的telnert
操作。curl
将标准输入的内容全部发送到远程服务器。连接到远程telnet
服务器使用以下命令:
curl telnet://remote.server.com
然后将在标准输入中输入的数据传送至服务器。执行结果将被发送至标准输出,如果你希望将执行结果保存至文件,请使用参数-o
。
针对低速网络连接等情况,你也许通过参数-N
/--no-buffer
来关闭输出缓存。
通过使用参数-t
,可以向telnet传送协议允许的选项。如果我们想告知服务器将使用vt100
终端 来进行连接,应输入如下命令:
curl -tTTYPE=vt100 telnet://remote.server.com
对于-t
, 其他有趣的选项还包括:
– XDISPLOC= 设置X的显示的位置。
– NEW_ENV=
三十二、持久连接
在一个命令中进行多个文件将会让curl
按命令中指定的文件顺序一个接一个的传输所有的文件。
libcurl
将会尝试使用持久连接来传输全部文件,这样第二个文件也可以使用已经完成初始化并仍旧对前一次传输开放的同一连接来进行传输。这样将大幅度减少传输全部文件所需的连接次数,对于网络的合理使用也大有好处。
注意:curl
本身对于传输并不使用持久连接,传输的持久连接只是curl在随后发起的库调用。尽可能多的在一个命令行中使用大量的URL
向同一服务器传输文件,这会里整体的传输速度变得更快。实际 上,如果你使用HTTP代理来传输文件,你就会发现所有的传输使用的都是持久连接。
三十三、单条命令行下的多路传输
根据上面内容提到的方法,通过简单的添加多个URL
,你可以在一个命令中下载多个文件。如果你希望将这些文件存储到本地文件中而不是打印输出至标准输出的话,你需要针对每个URL
指定选项-O
(而不需要使用--remote-name-all
)
例如:下载二个文件,对第一文件使用-O
,并自定义第二文件的文件名:
curl -O http://url.com/file.txt ftp://ftp.com/moo.exe -o moo.jpg
你可以使用相似的模式来上传多个文件:
curl -T local1 ftp://ftp.com/moo.exe -T local2 ftp://ftp.com/moo2.txt
三十四、IPv6
当使用IPv4
进行连接失败,并且服务器返回的是一个IPv6地址的情况下,curl
将使用IPv6
连接服务器。 选项--ipv4
和--ipv6
,可以在这二种地址都可用时指定使用哪种地址进行连接。IPv6
地址还可以在URL
中直接进行指定,具体方法如下:
http://[2001:1890:1112:1::20]/overview.html
使用这种格式时,必须同时指定选项-g
,否则curl
将认为[]
是全局字符,而导入停止执行命令。
本地链接和本地站点地址包含一个标识符范围,如fe80::1234%1,这些标识符也有可能被用到,但是其中一部分必须是数字或者匹配在linux系统中已经存在的网络适配器,并且百分号必须被URL转义。上一个例子中内容转换成SFTP
URL
将会是下面的样子:
sftp://[fe80::1234%251]/
IPv6地址在URL以外提供的选项不应该编码为URL,如:--proxy
, --interface
、--ftp-port
。
三十五、METALINK
curl
支持Metalink
,包括version 3 和 4 (RFC 5854),一种可以列出多个URI
资源并针对文件可以进行hash
的方法。
如果出现无法获取文件或者无法连接服务器等错误,curl
将会把备用资源列表中资源做为镜像来使用。并且在下载完成之后,还会对文件进行hash
校验。Metalink
文件会在内存中完成上述的下载和处理工作,并不会将它们存储的本地文件系统中。
例如使用远程Metalink
文件:
curl --metalink http://www.example.com/example.metalink
使用文件传输协议(file://)来使用本地文件系统中的Metalink
文件:
curl --metalink file://example.metalink
请注意如果文件传输协议被禁用,就不能在写入时,使用本地Metalink
文件。同样需要注意的是,如果--metalink
和--include
同时被使用,--include
将会被忽略。这是因为在应过其中中包含头部信息将会破坏Metalink
分析器,同时如果头部信息被包含在一个被描述为Metalink
的文件中,也会导致hash
检测失败。
用于Curl问题反馈和改进的邮件列表
为了方便讨论curl
、软件的开发以及与其相关的事宜,我们为您开放一了些邮件列表。你可以在如下网址获得相关信息https://curl.haxx.se/mail/。其中一些邮件列表为:
- curl-users:
针对命令行工具的用户。讨论的内容包括:如何使用curl,软件工作异常,新功能,相关工具,使用中遇到的问题,新闻,安装,编译,运行,端口等等。
- curl-library
开发者使用或者开发libcurl
,包括:Bugs,扩展,改进。
– curl-announce
邮件量很少。只接受公布新版本的通知。最多每月发送一至二封邮件,通常情况下,每二个月只发送一封邮件。
- curl-and-php
将curl
的函数应用于PHP
, 包括所有curl
与PHP
相关的内容。
- curl-and-Python
用于反馈Python骇客在绑定pycurl的情况下,无论是否在python环境下使用curl遇到的问题。
请直接反馈curl
的问题,功能性要求和故障报告到以上邮件列表中,而不要发送私人邮件。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149659.htm