使用Python ftplib无法连接服务器但PuTTY Plink可正常连接,如何排查?
问题原因及解决方案
核心错误原因
你使用的plink走的是SSH协议,默认占用22端口,对应实现的是SFTP/SSH文件传输逻辑;而ftplib封装的是传统FTP协议,默认占用21端口,两者是完全独立的传输协议,连接逻辑、服务依赖都不互通。plink能连通仅能证明目标主机的SSH服务运行正常,不能证明FTP服务开启且可访问,这是触发WinError 10060连接超时的最常见原因。
排查思路
- 第一步:验证目标主机21端口是否可访问
运行命令telnet <你的主机IP> 21,如果返回连接失败,说明目标主机未开启FTP服务,或防火墙、安全组拦截了21端口的访问请求。 - 第二步:如果21端口可通,检查FTP连接模式
FTP默认分为主动(PORT)、被动(PASV)两种连接模式,ftplib默认使用被动模式,部分服务器的网络配置仅支持主动模式,可尝试切换模式验证。
解决方案
方案1:目标主机仅开启SSH服务(推荐)
如果你的主机没有单独开启FTP服务,直接用SFTP协议实现文件操作即可,完全匹配你用plink的访问逻辑,可使用第三方库paramiko实现:
- 先安装依赖:
pip install paramiko - 参考代码:
import paramiko host = '0.0.0.0' port = 22 user = 'user' passwd = 'XXXX' ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 建立SSH连接 ssh_client.connect(hostname=host, port=port, username=user, password=passwd, timeout=10) # 开启SFTP会话 sftp = ssh_client.open_sftp() # 列出指定目录内容 dir_content = sftp.listdir('/SubDir/SubSubDir/') print(dir_content) # 按需执行文件上传、下载等操作 # sftp.put(local_file_path, remote_file_path) # sftp.get(remote_file_path, local_file_path) # 关闭连接 sftp.close() ssh_client.close()
方案2:确认FTP服务可用时的ftplib适配
如果确认目标主机已开启FTP服务且21端口可访问,可使用优化后的ftplib代码:
import ftplib host = '0.0.0.0' user = 'user' passwd = 'XXXX' try: # 显式设置超时时间,避免长时间无响应 ftp = ftplib.FTP(host=host, user=user, passwd=passwd, timeout=10) # 若被动模式连接失败,取消下方注释切换为主动模式 # ftp.set_pasv(False) # 打印目录列表 ftp.dir() ftp.quit() except Exception as e: print(f"连接失败:{repr(e)}")
内容的提问来源于stack exchange,提问作者theozh
相关产品推荐
相关产品推荐

