Paramiko SSH连接认证失败求助:Putty/OpenSSH可正常连接
解决Paramiko与Dropbear 2017.75的SSH认证兼容性问题
核心排查与修复方案
Dropbear 2017.75的SSH协议实现细节和OpenSSH/Putty存在差异,Paramiko默认配置未适配这些差异,以下是针对性的解决步骤:
1. 强制指定Dropbear兼容的密钥交换算法
Dropbear 2017.75对现代椭圆曲线密钥交换算法支持有限,需手动指定它兼容的传统DH算法:
import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect( hostname="你的服务器IP", username="你的用户名", password="你的密码", kex="diffie-hellman-group1-sha1,diffie-hellman-group14-sha1" )
2. 匹配Dropbear的加密套件
Dropbear默认启用的加密套件和Paramiko默认集不完全重合,手动指定兼容的加密算法:
ssh.connect( # 保留其他连接参数 cipher="aes128-cbc,3des-cbc,aes256-cbc" )
3. 处理特殊字符的账号凭证
如果用户名/密码包含@、$等特殊字符,Paramiko的字符串处理逻辑可能和Putty/OpenSSH不同,尝试用getpass模块输入密码避免转义问题:
import getpass password = getpass.getpass("输入密码: ") ssh.connect("你的服务器IP", "你的用户名", password)
4. 开启调试日志定位具体失败点
通过Paramiko的调试日志,查看认证过程中协议交互的细节:
import logging logging.basicConfig(level=logging.DEBUG) # 执行connect操作后,重点关注"Authentication failed"之前的密钥交换、加密协商日志
5. 手动加载Dropbear主机密钥
部分场景下,Paramiko自动添加主机密钥的逻辑无法识别Dropbear生成的密钥格式,可手动加载:
from paramiko.hostkeys import HostKeys from paramiko import RSAKey hk = HostKeys() # 替换为服务器的公钥内容 hk.add("你的服务器IP", "ssh-rsa", RSAKey(data=b"服务器公钥字符串")) ssh.get_host_keys().update(hk) ssh.connect("你的服务器IP", "你的用户名", "你的密码")
关键差异说明
- Dropbear 2017.75不支持Paramiko默认的
ecdh-sha2-nistp256等椭圆曲线密钥交换算法,必须强制指定传统DH算法 - 部分环境中,Dropbear的主机密钥格式无法被Paramiko的
AutoAddPolicy正确解析,手动加载可解决该问题
内容的提问来源于stack exchange,提问作者Alberto Lopes
相关产品推荐
相关产品推荐

