使用Paramiko连接Genymotion时遇BadAuthenticationType错误求助
解决Paramiko publickey认证失败问题
你遇到的BadAuthenticationType错误,核心原因是Paramiko代码里的私钥加载或认证流程不对——服务器明确只接受publickey认证,而你的命令行已经用私钥(genymotion-key.pem)成功执行,说明私钥本身没问题,不需要转换成公钥,只需调整代码的私钥加载方式即可。
1. 正确加载RSA私钥并认证
直接用Paramiko加载你的pem私钥文件,代码示例:
import paramiko # 加载RSA私钥(如果私钥设置了密码,加上password参数) private_key = paramiko.RSAKey.from_private_key_file('./keys/genymotion-key.pem') ssh_client = paramiko.SSHClient() # 自动接受未知主机密钥(生产环境建议验证主机密钥) ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 仅用私钥认证连接,不要传password参数 ssh_client.connect( hostname='ec2-54-153-114-254.us-west-1.compute.amazonaws.com', username='shell', pkey=private_key )
2. 排查关键问题点
- 路径验证:确保代码里的私钥路径
./keys/genymotion-key.pem和运行代码的当前工作目录匹配,或者改用绝对路径避免路径错误 - 文件权限:Linux/macOS环境下,私钥文件权限必须设置为
chmod 600 ./keys/genymotion-key.pem,权限过宽会被SSH服务拒绝 - 避免多余参数:不要在
connect方法中传递password参数,否则Paramiko会尝试密码认证,触发服务器的认证类型限制
3. 执行目标命令
连接成功后,执行你的命令并处理输出:
# 执行目标命令 command = 'su -c "setprop persist.sys.usb.config adb"' stdin, stdout, stderr = ssh_client.exec_command(command) # 读取命令输出和错误信息 print("命令输出:", stdout.read().decode('utf-8')) print("错误信息:", stderr.read().decode('utf-8')) # 关闭SSH连接 ssh_client.close()
内容的提问来源于stack exchange,提问作者Jason Ngo
相关产品推荐
相关产品推荐

