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