我需要一个python客户端来做FTPES(显式),有没有人有任何python包可以做到这一点的经验.
我无法在python中执行此操作,但可以使用FileZilla等工具连接到FTP服务器
谢谢
我需要连接到能够使用lftp成功连接的FTPS服务器.但是,当我尝试使用Python ftplib.FTP_TLS时,它会超时,堆栈跟踪显示它正在等待服务器发送欢迎消息等.有谁知道问题是什么以及如何克服?我想知道是否需要在服务器端进行某些操作,但是lftp客户端如何正常工作.任何帮助是极大的赞赏.
这是堆栈跟踪:
ftp = ftplib.FTP_TLS()
ftp.connect(cfg.HOST, cfg.PORT, timeout=60)
File "C:\Users\username\Softwares\Python27\lib\ftplib.py", line 135, in connect
self.welcome = self.getresp()
File "C:\Users\username\Softwares\Python27\lib\ftplib.py", line 210, in getresp
resp = self.getmultiline()
File "C:\Users\username\Softwares\Python27\lib\ftplib.py", line 196, in getmultiline
line = self.getline()
File "C:\Users\username\Softwares\Python27\lib\ftplib.py", line 183, in getline
line = self.file.readline()
File "C:\Users\username\Softwares\Python27\lib\socket.py", line 447, in readline
data = self._sock.recv(self._rbufsize)
socket.timeout: timed out
Run Code Online (Sandbox Code Playgroud)
使用lftp成功登录到同一个ftps服务器:
$ lftp
lftp :~> open ftps://ip_address:990
lftp ip_address:~> set ftps:initial-prot P
lftp ip_address:~> login ftps_user_id ftps_user_passwd
lftp sftp_user_id@ip_address:~> ls
ls: Fatal error: …
Run Code Online (Sandbox Code Playgroud) 我正在使用python ftplib进行隐式tls连接程序.我尝试了有问题的解决方案python-ftp-implicit-tls-connection-issue(包括Rg Glpj和Juan Moreno的答案)来建立连接.但是当我打电话retrline
或retrbinary
登录到这样的ftp服务器后(FTP_ITLS
是子类FTP_TLS
):
58 server = FTP_ITLS()
59 server.connect(host="x.x.x.x", port=990)
60 server.login(user="user", passwd="******")
61 server.prot_p()
62
63 server.cwd("doc")
64 print(server.retrlines('LIST'))
65 # server.retrbinary('RETR contents.7z', open('contents.7z', 'wb').write)
66 server.quit()
Run Code Online (Sandbox Code Playgroud)
我收到了一个EOF错误:
Traceback (most recent call last):
File "D:/Coding/test/itls.py", line 64, in <module>
print(server.retrlines('LIST'))
File "D:\Python\Python27\lib\ftplib.py", line 735, in retrlines
conn = self.transfercmd(cmd)
File "D:\Python\Python27\lib\ftplib.py", line 376, in transfercmd
return self.ntransfercmd(cmd, rest)[0]
File "D:\Python\Python27\lib\ftplib.py", line 713, in ntransfercmd
server_hostname=self.host)
File "D:\Python\Python27\lib\ssl.py", line …
Run Code Online (Sandbox Code Playgroud) 使用 Python 3.6.3。
我正在连接到 FTP 以ftplib
通过 FTP_TLS使用。
ftps = ftplib.FTP_TLS('example.com', timeout=5)
# TLS is more secure than SSL
ftps.ssl_version = ssl.PROTOCOL_TLS
# login before securing control channel
ftps.login('username@example.com', 'password')
# switch to secure data connection
ftps.prot_p()
# Explicitly set Passive mode
ftps.set_pasv(True)
Run Code Online (Sandbox Code Playgroud)
这一切都有效。我可以发送ftps.mkd('mydir')
(制作目录)和ftps.cwd('mydir')
(更改工作目录),并且都可以正常工作。
但是,如果我发送其中任何一个(据我所知,它们基本上都是同义词):
ftps.dir()
ftps.nlst()
ftps.retrlines('LIST')
ftps.retrlines('MLSD')
Run Code Online (Sandbox Code Playgroud)
然后我得到一个异常(下面还包括所有 ftplib 调试信息;通常也与 FileZilla 显示的内容相匹配):
*cmd* 'AUTH TLS'
*put* 'AUTH TLS\r\n'
*get* '234 AUTH TLS OK.\n'
*resp* '234 AUTH TLS OK.'
*cmd* 'USER username@example.com' …
Run Code Online (Sandbox Code Playgroud) 我无法弄清楚如何使用ftplib查看FTP站点的文件内容.
我可以使用WinSCP连接到FTP站点,并查看根目录中的6个文件.
在Python 3.4中,我使用以下代码:
from ftplib import FTP_TLS
ftps = FTP_TLS(timeout=100)
ftps.connect(ipAddress, 21)
ftps.auth()
ftps.prot_p()
ftps.login('username', 'password')
Run Code Online (Sandbox Code Playgroud)
哪个产生:
Out[72]: '230 User logged in.'
Run Code Online (Sandbox Code Playgroud)
我可以运行这个:
ftps.pwd()
Run Code Online (Sandbox Code Playgroud)
......我看到我在根目录中:
Out[73]: '/'
Run Code Online (Sandbox Code Playgroud)
一切似乎都很好吃.但是,当我试图查看目录中的内容,使用ftps.dir()或ftps.retrlines('NLST'),或者我尝试过的任何其他内容时,我得到一个超时:
TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
Run Code Online (Sandbox Code Playgroud)
我搜索过,发现有几个人说这可能是"被动与主动"连接设置问题.然而,我询问了FTP的管理员,如果它是被动的还是主动的,他表示不相信,只是说,"这不是SFTP.它是明确的FTP over TLS !!"
我对这一切都一无所知.我只是想使用ftplib(或任何其他包!)连接到他的FTP并下载一些文件.
我错过了什么?
编辑:我刚想通了WinSCP正在使用被动模式,所以这似乎是有效的.据我了解,默认情况下ftplib是被动的,但我继续将标志设置为true.这没什么,我仍然有同样的问题.
我还检查了我的防火墙(抓住吸管),它完全关闭,所以那里应该没有问题.
我还尝试使用'.sendcmd()'方法发送显式命令,该方法似乎能够发送命令,但不会获取任何响应(或者它无法查看响应).
有什么理由我能够看到我所在的目录,但没有其他任何数据?我显然已经连接并与服务器通信了,看起来这个目录可用并且对我来说是可见的,这意味着数据可以来回传递.数据是否可能以某种方式返回ftplib无法识别?有关我应该从哪里开始进行故障排除的任何想法?
最后,似乎所有内容都设置正确,因为我可以在WinSCP中看到一切正常.我应该检查哪些设置与ftplib进行比较?
编辑2:
根据要求,我设置了调试级别(感谢这个提示),下面是输出:
ftps = FTP_TLS(timeout=15)
ftps.set_debuglevel(2)
ftps.connect(ipAddress, 21)
ftps.set_pasv(True) …
Run Code Online (Sandbox Code Playgroud)