我正在尝试使用ftplib.FTP_TLS,但我无法列出目录。
Filezilla一切正常,但是当我在iPython上时,它失败了。
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')
这是最后一个命令的返回:
*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一起工作正常。但我可以看到一些特别的东西:
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»行意味着:«服务器发送带有不可路由地址的被动响应。地址由服务器1替换。
这似乎是让它发挥作用的方法。
我的问题是:我怎么能用ftplib做同样的事情?或者我有另一种选择吗?
谢谢!
答案 0 :(得分: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的输出来了解正确的地址。