我在 ec2 上运行 Python 2.6.5,我已经用 Python2.7 中的新版本替换了旧的 ftplib,它允许导入 FTP_TLS。然而,以下内容挂在我身上:
from ftplib import FTP_TLS
ftp = FTP_TLS('host', 'username', 'password')
ftp.retrlines('LIST')
(15-20 分钟后超时)
我可以在几秒钟内在本地机器上成功运行这三行,但在 ec2 上失败。知道为什么会这样吗?
谢谢。
我在 ec2 上运行 Python 2.6.5,我已经用 Python2.7 中的新版本替换了旧的 ftplib,它允许导入 FTP_TLS。然而,以下内容挂在我身上:
from ftplib import FTP_TLS
ftp = FTP_TLS('host', 'username', 'password')
ftp.retrlines('LIST')
(15-20 分钟后超时)
我可以在几秒钟内在本地机器上成功运行这三行,但在 ec2 上失败。知道为什么会这样吗?
谢谢。
这听起来确实像是一个与您是否处于PASSIVE
FTP 连接模式以及连接的两端是否支持它有关的问题。
ftplib 文档建议默认情况下它是打开的,这很遗憾,因为我打算建议你打开它。相反,我会建议您set_debuglevel
到可以看到较低级别协议发生的地方并查看您所处的模式。这应该为您提供有关如何进行的信息。要么您处于被动模式,而另一端无法正确处理它,要么(希望)您不会,但您应该如此。
可以配置 FTP 和 FTPS(但不是 SFTP),以便服务器与客户端建立反向连接以进行实际传输,或者客户端与服务器建立第二个正向连接以进行传输。尤其是前者,只要涉及网络地址转换,就容易出现复杂情况。如果没有 TLS,一些防火墙实际上可以重写 FTP 会话流量以使其神奇地工作,但使用 TLS,由于加密,这是不可能的。
当您尝试传输数据(LIST 需要在一个方向或另一个方向上的第二个连接)时,可能正在验证然后超时的事实通常是需要被动模式的设置的典型症状,或者,有这个:
像往常一样连接到端口 21,在进行身份验证之前隐式保护* FTP 控制连接。保护数据连接需要用户通过调用 prot_p() 方法明确地请求它。
ftps.prot_p() # switch to secure data connection
ftps.retrlines('LIST') # list directory content securely
我不经常使用 FTPS,因为 SFTP 的问题要少得多,但如果你不这样做,远端服务器可能不会合作。
*注意,我怀疑这句话试图说 FTP_TLS “隐式保护 FTP 控制连接”,而不是显式保护数据连接。
如果您仍然遇到问题,您可以尝试排除亚马逊防火墙问题。(我假设您没有使用基于主机的防火墙。)
如果您的 EC2 实例位于 VPC中,那么您可以在 AWS 管理控制台中:
如果您的 EC2 实例不在 VPC中,那么您可以在 AWS 管理控制台中:
仅在测试环境中执行此操作!(明显地)
这将使您的 EC2 实例对来自 Internet 的所有流量开放。希望您会发现您的 FTPS 现在正在工作。然后您可以逐步重新应用安全规则,直到找出问题的原因。如果它仍然不起作用,那么 AWS 防火墙不是问题的原因(或者您有多个问题)。