Linux下cURL使用教程之十二:ftp及其他协议

Linux下cURL使用教程之一:cURL简介里,提到curl支持多种协议。本篇就以ftp协议为主,对curl对其他协议的操作进行简介。

基本使用

基本使用方法同HTTP没有区别:

curl ftp://ftp.cisco.com/pub/mibs/

只不过ftp一般会有用户名密码,所有在命令中要加上用户名密码:

curl -u ftpuser:ftppass -O ftp://ftp_server/index.php

或者

curl ftp:// ftpuser:ftppass ftp://ftp_server/index.php

上传文件

使用-T选项。具体请参考Linux下cURL使用教程之六:curl基本使用之HTTP文件上传
上传一个文件:

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

上传多个文件:

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

从标准输入获得文件内容:

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

这个命令会将标准输入的内容保存在ftp://ftp.testserver.com/myfile_1.txt中。

FTP四种模式

FTP有两种基本模式:PASV和PORT,也即主动模式和被动模式。在二者基础上分别有两种扩展:ERSV和EPRT。具体请参考相关RFC文档。
curl默认使用EPSV模式:

curl --verbose ftp://ftp_server/ --user user

会看到curl执行了EPSV命令。–eprt参数显式指定使用EPRT模式。
使用--disable-epsv选项禁用EPSV而使用PASV:

curl --verbose --disable-epsv ftp://ftp_server/ --user user

使用-P/--ftp-port <address>选项指定使用EPRT,其中address参数可以指定为“-”,指定使用FTP控制连接相同的地址:

curl --verbose --ftp-port - ftp://ftp_server/ --user user

会看到使用了EPRT命令。
而使用--disable-epsv选项,如:

curl --verbose --ftp-port - --disable-epsv ftp://ftp_server/ --user user

及指定了使用PORT模式。

其他协议

以SMTP协议发邮件为例,执行:

curl --verbose --ssl --mail-rcpt test@163.com --mail-from test@163.com smtp://smtp.163.com -u test

–ssl指定使用SSL, smtp://一定要加在url上,否则curl会使用默认的HTTP协议。

之后,按提示输入如下内容:

Subject: Testing
This is a test mail
.

即可发送邮件。
但是估计是有防作弊机制,测试发现163、GMAIL的SMTP发信都失败,提示“curl: (67) Access denied: 500”,追踪详细过程,发现是“MAIL FROM: test@163.com”这句提示语法错误。不知道是什么原因。
但是使用自己搭建的邮件服务器测试成功。