【问题标题】:How to replace a non routable IP address with server address on ftplib如何用 ftplib 上的服务器地址替换不可路由的 IP 地址
【发布时间】:2014-04-10 14:45:53
【问题描述】:

我正在尝试使用 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» 行的含义类似于:«服务器发送带有不可路由地址的被动响应。地址替换为服务器一号»。

看来这是让它工作的方法。

我的问题是:我怎样才能对 ftplib 做同样的事情?或者我还有其他选择吗?

谢谢!

【问题讨论】:

    标签: python ftps


    【解决方案1】:

    假设您知道连接到哪里。我认为关键可能在这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 的输出来了解正确的地址。

    【讨论】:

    • 谢谢,它有效。不漂亮,因为我手动发送了正确的主机,但它有效。如果 libftp 和 Filezilla 一样,这可能是一个功能,检查 ip 是否可路由,如果不是则使用主机?
    • 我知道这是旧的,但我很绝望。你能放一些代码,你把它放在ftplib的什么地方吗?我尝试了这个,并重写了 makepasv(),但现在我遇到了协议错误。
    • 你能在引用这个的新问题中发布你的代码吗?我不知道你卡在哪里了。我可以写下一些未经测试的代码,但我不确定它是否适合你。
    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 2015-06-21
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    相关资源
    最近更新 更多