solve ftp client “501 Server cannot accept argument. ftp: bind: Address already in use”

在aws lightsail的一台实例上访问远程FTP出现了以下提示:

501 Server cannot accept argument.
ftp: bind: Address already in use

原因分析:
当前FTP client处在防火墙之后, 或者client上只有一个内网IP, 例如从阿里云EC2上面, 访问远程FTP服务, 即可能会出现这种提示.

解决办法:
使用passive模式去连接, 例如

pftp -v -n $FTP_IP << END    #使用pftp连接
user $FTP_USER $FTP_PASS
type binary
cd $FTP_backup
ls
delete $OldData
put $DataBakName
bye
END

继续阅读

FTP下载地址中特殊符号的转换

要下载FTP中的大文件,一般是转换成完整的下载地址(例如ftp://uername:password@ip:port/dirname/filename)来下载。但这样有时候会产生问题,如果password里面有特殊字符怎么办?

方法很简单,把特殊字符换成16进制的ASCII码即可。

假设现在有个FTP服务器192.168.1.1,用户名zhang3,密码是zhang!@#,我们要下载该服务器上/html/a.rar文件。

如果写成ftp://zhang3:zhang!@#@192.168.1.1:21/html/a.rar的格式,肯定会报错。

那么我们可以写成ftp://zhang3:zhang%21%40%23@192.168.1.1:21/html/a.rar,这样就可以利用wget之类的工具来下载了。

附上一些常见十六进制的ASCII编码:

ASCII字符	字符中文名	编码后的值
空格              空格             %20
!                感叹号            %21
#                 井号             %23
&                 and              %26
@                 at               %40
/                 斜杠             %2F
:                 冒号             %3A
=                等于号            %3D
?                 问号             %3F
~                波浪号            %7E

================================================
2015.06.28补充:
其实在Linux上使用wget下载FTP上的文件时,也可以使用如下命令来下载(同样允许password里有特殊字符)

wget ftp://ip/filename.zip -e login=username -e passwd='password'

Linux挂载ftp服务器

Linux挂载ftp服务器,需要用到一个名为fuse-curlftpfs的包。正常情况下无法通过yum的方式获取此包,因此需要先安装DAG repository

Centos5 64位  wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm
Centos5 32位  wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el5.rf.i386.rpm
Centos6 64位  wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
Centos6 32位  wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm

然后是安装下载的rpm包

rpm -ivh rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm

然后就可以通过yum的方式安装fuse-curlftpfs了

yum install fuse-curlftpfs -y

在Centos6上执行此命令,可能会遇到 Requires: libcurl.so.3 的错误,解决方法:编辑 /etc/yum.repos.d/rpmforge.repo 文件,把 [rpmforge-extras] 项打开,再执行 yum clean all 即可。 继续阅读