【问题标题】:FTP RETR Command throws "No route to host"FTP RETR 命令抛出“没有到主机的路由”
【发布时间】:2016-05-11 13:20:01
【问题描述】:

所以我在 python 2.7 中使用 ftplib 连接到远程 FTP 服务器(从另一台服务器)以下载文件。当我执行 RETR 命令时,它会抛出:

        self.get_connection().retrbinary("RETR " + source, open(destination, 'wb').write)
      File "/usr/lib/python2.7/ftplib.py", line 414, in retrbinary
        conn = self.transfercmd(cmd, rest)
      File "/usr/lib/python2.7/ftplib.py", line 376, in transfercmd
        return self.ntransfercmd(cmd, rest)[0]
      File "/usr/lib/python2.7/ftplib.py", line 335, in ntransfercmd
        conn = socket.create_connection((host, port), self.timeout)
      File "/usr/lib/python2.7/socket.py", line 575, in create_connection
        raise err
    socket.error: [Errno 113] No route to host

现在我的代码在另一台服务器上运行良好,但在这台服务器上似乎不行。所以我尝试了ping x.x.x.x(有效),我使用telnet x.x.x.x 21(有效),ftp x.x.x.x(有效!)。然后我去了防火墙(在两台服务器上)并允许所有进出流量,但仍然遇到同样的错误......

有什么想法吗?! (正如我所说,这在第三台服务器上工作正常......而且登录命令似乎工作正常,但 RETR 却不行)

编辑:

这是一个直接在 ftp 中执行的命令示例

【问题讨论】:

    标签: python python-2.7 ftp ftplib


    【解决方案1】:

    ...连接到远程 FTP 服务器

    根据您的描述,您连接到远程服务器,但服务器显示它使用私有 IP 地址。我的猜测是服务器知道的地址(10.0.0.8)不是您用来连接服务器的地址,即服务器位于某个路由器后面并且完成了端口转发或地址转换。

    不幸的是,当其中一方在路由器后面时,FTP 并不能真正起作用。当客户端位于路由器(被动)或服务器(主动)之后时,您可能会使用被动和主动模式。但如果两者都在路由器后面,您通常会丢失。

    【讨论】:

    • 感谢 Steffen 的回答,不幸的是你是对的......因为我想做的只是一次性的事情,所以我很难做到......
    【解决方案2】:

    您是否正在尝试连接到 FTPES 服务器?

    试试这个:

    from ftplib import FTP_TLS
    creds = [
        'host', 'username',
        'password']
    ftps = FTP_TLS(*creds)
    ftps.prot_p()
    ftps.retrlines('LIST')
    

    这应该列出目录中存在的文件

    你可以使用类似的东西,

    ftps.retrbinary("RETR " + 'test.csv' ,open('test.csv', 'wb').write)
    

    从服务器检索文件并在本地写入。

    FTPLIB

    【讨论】:

      猜你喜欢
      • 2015-06-14
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2019-03-08
      • 2017-08-03
      • 1970-01-01
      • 2020-09-24
      相关资源
      最近更新 更多