ftp 出現Passive mode refused 解決辦法

在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 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章