Paramiko 2.7.2打开SFTP客户端报Unable to open channel错误如何解决
错误触发原因
- 认证逻辑错误:目标SFTP服务端使用的是Maverick_SSHD,要求公钥+密码的双因素认证,你代码中直接连续调用
auth_publickey和auth_password两个认证方法,没有校验前一次认证的返回状态(公钥认证后服务端返回的是部分成功,要求继续输入密码),导致Paramiko的传输层认证状态紊乱,服务端拒绝后续的通道打开请求。 - 自定义参数兼容性问题:你手动指定了
window_size和max_packet_size参数,Maverick_SSHD对非标准的窗口、包大小参数支持性很差,收到请求后直接返回unimplemented类型3错误,拒绝建立SFTP通道。 - 版本兼容性问题:你使用的Paramiko 2.7.2对Maverick_SSHD这类小众SSH服务端的协商逻辑存在已知bug,默认选择的hmac-sha2-256算法和服务端的适配存在异常。
修复方案
- 调整认证逻辑,先校验公钥认证的返回结果,确认服务端要求继续密码认证后,再调用密码认证方法,不要连续无判断调用两次认证接口。
- 移除
SFTPClient.from_transport方法中自定义的window_size和max_packet_size参数,使用Paramiko默认值即可,适配Maverick_SSHD的限制。 - 手动指定和服务端兼容的密钥交换、MAC算法,对齐手动SFTP命令的协商结果,避免算法不兼容问题。
- 优先使用Paramiko封装好的
SSHClient类实现逻辑,减少直接操作Transport带来的底层错误,示例代码如下:
import paramiko ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 手动指定兼容算法 ssh_client.connect( hostname=sftp_host, port=int(sftp_port), username=sftp_user, password=sftp_password, key_filename=sftp_key_path, # 替换为你的私钥文件路径 # 对齐OpenSSH协商的算法 kex_algorithms=['diffie-hellman-group-exchange-sha256', 'diffie-hellman-group14-sha1'], mac_algorithms=['hmac-sha1', 'hmac-sha2-256'] ) sftp_client = ssh_client.open_sftp() # 后续执行上传操作
内容的提问来源于stack exchange,提问作者Amit Singh
相关产品推荐
相关产品推荐

