在shell中调用FTP出现下面错误时,

Permission denied.
Passive mode refused.
Permission denied.
Passive mode refused.
请在链接FTP后加入passive即可,主要原因是FTP主动模式造成的。一般FTP默认为被动模式。我在做备份是由于防火墙的原因,我把VSFTP改为主动模式,这样就发现了一个问题,直接用手工执行备份的shell一点问题都没有,但是放到crontab中的时候就是不执行,出现上面错误提示,google了一下,原来发现客户端链接的时候默认是被动模式,要加入一个参数passive 才能使被动变为主动,哈哈,终于搞定他了。希望给和我一样的朋友提供一个参考。顺便把主动与被动的区别列出来。如下:
FTP协议的数据传输存在两种模式:主动模式和被动模式。这两种模式发起连接的方向截然相反,主动模式是从服务器端向客户端发起;被动模式是客户端向服务器端发起连接。但是如果服务器和客户之间存在防火墙,主动模式经常会引起一些麻烦。设想,客户位于防火墙之后,防火墙允许所有内部向外部的连接通过,但是对于外部向内部发起的连接却存在很多限制。在这种情况下,客户可以正常地和服务器建立控制连接,而如果使用主动模式,ls、put和get等数据传输命令就很难成功运行,因为防火墙会阻塞从服务器向客户发起的数据传输连接。简单包过滤防火墙把控制连接和数据传输连接完全分离开了,因此很难通过配置防火墙允许主动模式的FTP数据传输连接通过。如果防火墙允许ICMP或者TCP RST报文通过,客户程序就会马上返回connection refused错误信息;而如果防火墙只是做简单的丢弃处理,会造成客户程序挂起一段时间。 
  被动模式一般可以解决此类问题,因为在被动模式下,连接是由客户端发起的饿。不过,这要看FTP服务器和客户程序是否支持被动模式。命令行FTP客户程序一般使用passive命令关/开被动模式。例如: 
ftp>passive 
Passive mode off 
ftp>passive 
Passive mode on 
  如果客户程序不支持被动模式,它就会返回?Invaild command;如果客户程序支持被动模式,而服务器不支持,就会返回"PASV:command not understood",PASV是一个FTP协议命令,使服务器进入到被动模式。
使用默认数据传输端口 
  在FTP协议中,除了被动模式和主动模式之外,还有另外一种数据传输模式。如果客户程序既不向服务器发出PASV命令也不发送PORT命令,FTP服务器就会使用FTP协议的数据传输端口(20)和客户端的控制连接源端口建立一个数据传输连接。这就需要客户程序在这个端口上监听。在客户程序上使用sendport命令可以关闭FTP协议的PORT控制指令,然后需要使用passive命令关闭被动模式。整个过程如下: 
客户程序从本地端口N初始化一个FTP控制连接。 
用户使用sendport命令和passive命令(某些客户程序在默认情况下,被动模式是打开的)关闭主动模式和被动模式,然后使用数据传输指令,例如:ls、get等。这样客户程序就会在本地端口N上监听FTP服务缉发起的数据传输连接。 
服务器通过TCP例程(例如:getpeername())确定客户端的端口N。然后从FTP数据传输端口(20)发起一个连接。 
  不过,这种方式有一个最大的缺点就是无法在很短的时间之内连续输入数据传输命令,用户经常会遇到"bind:Address Already in use等错误。这是TCP协议造成的。因此,这种模式并不常用。

 

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26Array78/showart_415311.html