我正在尝试使用ftps将文件发送到FTP服务器。登录和更改目录工作:
import ftplib
ftps = ftplib.FTP_TLS('host','user','pwd')
ftps.set_pasv(True)
ftps.prot_p()
ftps.cwd('/target_directory')
然而,当我尝试上传我的文件时:
file = open(file, 'rb')
send_cmd = 'STOR file_name.txt'
ftps.storbinary(send_cmd, file)
file.close()
ftps.quit()
我收到以下错误:
File "/script/location/script.py", line 161, in <module>
ftps.storbinary(send_cmd,file)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ftplib.py", line 772, in storbinary
return self.voidresp()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ftplib.py", line 229, in voidresp
resp = self.getresp()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ftplib.py", line 222, in getresp
raise error_temp, resp
ftplib.error_temp: 425 Unable to build data connection: Operation not permitted
我已经读过425响应代码通常是处于活动模式的结果,这就是我加入ftps.set_pasv(True)
的原因(虽然默认情况下这是真的)。
我还尝试使用ftps.retrlines('LIST')
列出目录内容,但基本上会出现相同的错误。我正在使用Python 2.7.10。任何帮助将不胜感激。
答案 0 :(得分:0)
这是python中报告的错误:https://bugs.python.org/issue19500
您可以在新班级中应用补丁
class Explicit_FTP_TLS(ftplib.FTP_TLS):
"""Explicit FTPS, with shared TLS session"""
def ntransfercmd(self, cmd, rest=None):
conn, size = ftplib.FTP.ntransfercmd(self, cmd, rest)
if self._prot_p:
conn = self.context.wrap_socket(conn,
server_hostname=self.host,
session=self.sock.session)
return conn, size