FTP RETR命令抛出“无主机路由”

时间:2016-05-11 13:20:02

标签: python python-2.7 ftp ftplib

所以我在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

中执行的命令示例

enter image description here

2 个答案:

答案 0 :(得分:1)

  

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

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

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

答案 1 :(得分:0)

您是否尝试连接到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