FTP RETR 命令抛出 "No route to host"
FTP RETR Command throws "No route to host"
所以我正在使用 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
中执行的命令示例
您是否正在尝试连接到 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)
从服务器检索文件并写入本地。
... to connect to a remote FTP server
根据您的描述,您连接到远程服务器,但服务器显示它使用私有 IP 地址。我的猜测是服务器知道的地址 (10.0.0.8) 不是您用来连接到服务器的地址,即服务器在某个路由器后面并且完成了端口转发或地址转换。
不幸的是,当其中一方在路由器后面时,FTP 无法正常工作。当客户端位于路由器(被动)或服务器(主动)后面时,您可能会使用被动和主动模式。但如果两者都在路由器后面,你通常会迷路。
所以我正在使用 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
中执行的命令示例您是否正在尝试连接到 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)
从服务器检索文件并写入本地。
... to connect to a remote FTP server
根据您的描述,您连接到远程服务器,但服务器显示它使用私有 IP 地址。我的猜测是服务器知道的地址 (10.0.0.8) 不是您用来连接到服务器的地址,即服务器在某个路由器后面并且完成了端口转发或地址转换。
不幸的是,当其中一方在路由器后面时,FTP 无法正常工作。当客户端位于路由器(被动)或服务器(主动)后面时,您可能会使用被动和主动模式。但如果两者都在路由器后面,你通常会迷路。