2014-04-10 1 views
0

ftplib.FTP_TLS를 사용하려고하는데 디렉터리를 나열 할 수 없습니다.ftplib에서 라우팅 할 수없는 IP 주소를 서버 주소로 바꾸는 방법

Filezilla에서는 모든 것이 정상이지만 iPython을 사용하면 문제가 발생합니다.

*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 (10,191,x,x,238,54).\r\n' 
*resp* '227 Entering Passive Mode (10,191,x,x,238,54).' 
--------------------------------------------------------------------------- 
timeout         Traceback (most recent call last) 
/usr/local/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in <module>() 
----> 1 client.retrlines('LIST') 

/usr/lib/python2.7/ftplib.pyc in retrlines(self, cmd, callback) 
704    if callback is None: callback = print_line 
705    resp = self.sendcmd('TYPE A') 
--> 706    conn = self.transfercmd(cmd) 
707    fp = conn.makefile('rb') 
708    try: 

/usr/lib/python2.7/ftplib.pyc in transfercmd(self, cmd, rest) 
366  def transfercmd(self, cmd, rest=None): 
367   """Like ntransfercmd() but returns only the socket.""" 
--> 368   return self.ntransfercmd(cmd, rest)[0] 
369 
370  def login(self, user = '', passwd = '', acct = ''): 

/usr/lib/python2.7/ftplib.pyc in ntransfercmd(self, cmd, rest) 
679 
680   def ntransfercmd(self, cmd, rest=None): 
--> 681    conn, size = FTP.ntransfercmd(self, cmd, rest) 
682    if self._prot_p: 
683     conn = ssl.wrap_socket(conn, self.keyfile, self.certfile, 

/usr/lib/python2.7/ftplib.pyc in ntransfercmd(self, cmd, rest) 
325   if self.passiveserver: 
326    host, port = self.makepasv() 
--> 327    conn = socket.create_connection((host, port), self.timeout) 
328    try: 
329     if rest is not None: 

/usr/lib/python2.7/socket.pyc in create_connection(address, timeout, source_address) 
569 
570  if err is not None: 
--> 571   raise err 
572  else: 
573   raise error("getaddrinfo returns an empty list") 

timeout: timed out 

내가 말했듯이, 그것은에서는 Filezilla와 함께 잘 작동 : 여기

import ftplib 
from django.conf import settings # just a config file 


client = ftplib.FTP_TLS(timeout=10) 
client.connect(settings.HOST, 21) 
client.auth() 
client.prot_p() 
client.login(settings.USER,settings.PWD) 
client.set_debuglevel(2) 
client.retrlines('LIST') 

이 마지막 명령의 반환이다. 하지만 특별한 것을 볼 수 있습니다 :

Commande : PASV 
Réponse : 227 Entering Passive Mode (10,191,x,x,236,94). 
Statut : Le serveur a envoyé une réponse passive avec une adresse non routable. Adresse remplacée par celle du serveur. 

«Statut»줄은 다음과 같은 의미입니다.«서버는 라우팅 할 수없는 주소로 수동 응답을 보냅니다. 서버»로 대체 된 주소».

작동하도록 만드는 방법입니다.

제 질문은 : ftplib에서도 어떻게 할 수 있습니까? 아니면 나를위한 또 다른 옵션이 있습니까?

감사합니다.

답변

0

연결할 위치를 알고 있다고 가정 해보십시오. 나는 키가이 라인 (326)에있을 수 있습니다 생각 :

325   if self.passiveserver: 
326    host, port = self.makepasv() 
--> 327    conn = socket.create_connection((host, port), self.timeout) 
328    try: 
329     if rest is not None: 

당신은 서브 클래스와 makepasv() 방법을 대체하고 올바른 주소를 반환 할 수 있습니다. 아마 filezilla 또는 wireshark의 출력을 사용하여 올바른 주소를 알 수 있습니다.

+0

감사합니다. 작동합니다. 올바른 호스트를 수동으로 전송하기 때문에 아름답 지 않지만 제대로 작동합니다. libftp가 Filezilla와 동일한 기능을 수행하고 IP가 라우팅 가능한지 확인한 다음 호스트를 사용한다면 기능이 될 수 있습니까? – tominardi

+0

나는 이것이 오래되었음을 알고 있지만 필사적이다. 몇 가지 코드를 넣을 수 있습니까? ftplib에 어디에 넣을 수 있습니까? 나는 이것을 시도하고 makepasv()를 다시 작성했으나 이제는 프로토콜 오류가 발생합니다. – lukehawk

+0

이것을 참조하는 새로운 질문에 코드를 게시 할 수 있습니까? 네가 어디서 붙어 있었는지 나는 모른다. 테스트되지 않은 코드를 적어도되지만 잘 작동하는지 확신 할 수 없습니다. – User

관련 문제