原文链接:http://blog.raxianch.moe/2018/10/23/%E7%96%91%E9%9A%BE%E6%9D%82%E7%97%87%EF%BC%9APython%E6%93%8D%E4%BD%9CFTP%E6%97%B6%EF%BC%8CTimeoutError-WinError-10060-%E7%94%B1%E4%BA%8E%E8%BF%9E%E6%8E%A5%E6%96%B9%E5%9C%A8%E4%B8%80%E6%AE%B5%E6%97%B6%E9%97%B4%E5%90%8E%E6%B2%A1%E6%9C%89%E6%AD%A3%E7%A1%AE%E7%AD%94%E5%A4%8D%E6%88%96%E8%BF%9E%E6%8E%A5%E7%9A%84%E4%B8%BB%E6%9C%BA%E6%B2%A1%E6%9C%89%E5%8F%8D%E5%BA%94%EF%BC%8C%E8%BF%9E%E6%8E%A5%E5%B0%9D%E8%AF%95%E5%A4%B1%E8%B4%A5%E3%80%82/
根据近日写的简单实例,进一步编写,Python连接FTP服务器的简单实例
发现,能够通过Python登陆FTP,但是却无法进行如下操作:
ftp.dir() #显示目录下所有目录信息
ftp.nlst() #获取目录下的文件
ftp.mkd(pathname) #新建远程目录
这是ftplib模块自带的方法,用于FTP操作时获取信息的,当使用它们的时候出现如下报错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
=====================FTP客户端===================== 220---------- Welcome to Pure-FTPd [privsep] [TLS] ---------- 220-You are user number 1 of 50 allowed. 220-Local time is now 17:38. Server port: 21. 220-This is a private system - No anonymous login 220-IPv6 connections are also welcome on this server. 220 You will be disconnected after 15 minutes of inactivity. 已连接到: ftp.aixinxi.net Traceback (most recent call last): File "D:/workspace/PythonSpace/Spyder/Spyder_aixinxi/aixinxi_FTPlogin.py", line 139, in <module> main() File "D:/workspace/PythonSpace/Spyder/Spyder_aixinxi/aixinxi_FTPlogin.py", line 118, in main mkdir(ftp,dirpath) File "D:/workspace/PythonSpace/Spyder/Spyder_aixinxi/aixinxi_FTPlogin.py", line 84, in mkdir if find(ftp, dirpath): File "D:/workspace/PythonSpace/Spyder/Spyder_aixinxi/aixinxi_FTPlogin.py", line 76, in find ftp_f_list = ftp.nlst() #获取目录下文件、文件夹列表 File "D:\Anaconda3\lib\ftplib.py", line 559, in nlst self.retrlines(cmd, files.append) File "D:\Anaconda3\lib\ftplib.py", line 468, in retrlines with self.transfercmd(cmd) as conn, \ File "D:\Anaconda3\lib\ftplib.py", line 399, in transfercmd return self.ntransfercmd(cmd, rest)[0] File "D:\Anaconda3\lib\ftplib.py", line 361, in ntransfercmd source_address=self.source_address) File "D:\Anaconda3\lib\socket.py", line 724, in create_connection raise err File "D:\Anaconda3\lib\socket.py", line 713, in create_connection sock.connect(sa) TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
|
主要保存信息:
TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
经过一番查询,从*上找到了答案,Python ftplib超时
很可能是主动和被动模式之间的冲突。确保满足以下条件之一:
首先确保服务器支持PASV模式,并且您的客户端正在设置PASV模式,如果服务器不支持被动模式,则防火墙必须支持主动模式FTP传输。
文档中说到,在Python 2.1及更高版本中默认为被动模式。
在活动模式(非PASV)中,客户端发送PORT命令,告诉服务器在该端口上启动DATA连接,这需要您的防火墙知道PORT命令,以便它可以将传入的DATA连接转发给您 - 几乎没有防火墙支持这个。
在被动模式下,客户端打开DATA连接,服务器使用它(服务器在打开数据连接时是“被动”)。
如果没有使用被动模式,请执行ftp.set_pasv(True)并查看是否会产生影响。
在这里,我的需求是需要主动模式!
解决办法
在发送FTP登陆请求的代码中,加入:
ftp.set_pasv(False) # 如果被动模式由于某种原因失败,请尝试使用活动模式。
以下是我为操作FTP服务器而用Python开发的控制器的部分代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
# 连接登陆 import sys,os,ftplib,socket,hashlib def connect(): try: ftp = ftplib.FTP(HOST) # 实例化FTP对象 ftp.login(username, password) # 登录 ftp.set_pasv(False) # 如果被动模式由于某种原因失败,请尝试使用活动模式。 print(ftp.getwelcome()) print('已连接到: %s' % HOST) return ftp except (socket.error,socket.gaierror): print("FTP登陆失败,请检查主机号、用户名、密码是否正确") sys.exit(0)
|
即可解决这个问题!