十八、FTP的路径和文件名
需要强调的当从一个以ftp://
开头的URL地址下获取文件的时候,给定的路径是与你进入的目录有相关的。如,从你的ftp站点的家目录中获取README
,你需要执行:
curl ftp://user:passwd@my.site.com/README
但如果你想要从同一个站点的根目录中获取README
文件的话,你就需要指定文件的绝对路径了:
curl ftp://user:[email protected]m//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
也可以接受一个日期范围。你也可以使用加入-
的方法来进行日期条件的设置。