2012-09-13 23 views
3

有沒有辦法在進入被動模式時檢測到服務器返回其專用網絡地址並將其轉換爲公共地址?
我無權訪問服務器。ftplib:被動和NAT /地址轉換

>>> # Python 2.7.3rc2 
>>> from ftplib import FTP_TLS 
>>> ftps = FTP_TLS() 
>>> ftps.set_debuglevel(2) 
>>> ftps.connect("example.com", 123) 
*get* '220 Welcome to Synchrony Gateway FTP server\r\n' 
*resp* '220 Welcome to Synchrony Gateway FTP server' 
'220 Welcome to Synchrony Gateway FTP server' 

>>> ftps.auth() 
*cmd* 'AUTH TLS' 
*put* 'AUTH TLS\r\n' 
*get* '234 Using authentication type TLS\r\n' 
*resp* '234 Using authentication type TLS' 
'234 Using authentication type TLS' 

>>> ftps.login("foo", "***") 
*cmd* 'AUTH TLS' 
*put* 'AUTH TLS\r\n' 
*get* '234 AUTH command OK, waiting handshake\r\n' 
*resp* '234 AUTH command OK, waiting handshake' 
*cmd* 'USER foo' 
*put* 'USER foo\r\n' 
*get* '331 Send password please\r\n' 
*resp* '331 Send password please' 
*cmd* 'PASS ************' 
*put* 'PASS ************\r\n' 
*get* '230 User logged in, proceed\r\n' 
*resp* '230 User logged in, proceed' 
'230 User logged in, proceed' 

>>> ftps.prot_p() 
*cmd* 'PBSZ 0' 
*put* 'PBSZ 0\r\n' 
*get* '200 Command okay\r\n' 
*resp* '200 Command okay' 
*cmd* 'PROT P' 
*put* 'PROT P\r\n' 
*get* '200 Command okay\r\n' 
*resp* '200 Command okay' 
'200 Command okay' 

>>> ftps.set_pasv(True) 
>>> ftps.retrlines("LIST") 
*cmd* 'TYPE A' 
*put* 'TYPE A\r\n' 
*get* '200 Type set to A\r\n' 
*resp* '200 Type set to A' 
*cmd* 'PASV' 
*put* 'PASV\r\n' 
*get* '227 Entering Passive Mode (192,168,17,1,195,119)\r\n' 
*resp* '227 Entering Passive Mode (192,168,17,1,195,119)' 

謝謝。

回答

1

配置服務器在外部IP上進入被動模式。

+0

謝謝,但我沒有訪問服務器。 –

1

我遇到了類似的問題。下面就來覆蓋遠程主機返回的本地IP一個快速的方法:)

from ftplib import FTP, parse227, parse229 
class MyFTP(FTP): 
    def makepasv(self): 
     if self.af == socket.AF_INET: 
      host, port = parse227(self.sendcmd('PASV')) 
     else: 
      host, port = parse229(self.sendcmd('EPSV'), self.sock.getpeername()) 
     # We tweak this so we don't use the internal ip returned by the remote server. 
     # old: `return host, port` 
     return self.host, port 

請注意,您不能使用超(,因爲FTP是一個「老式」蟒蛇類。