Python中paramiko SSH认证失败:paramiko.transport Authentication (publickey) failed. 如何解决?
ansible 连接远程主机时报错: 192.168.195.10 | UNREACHABLE! => { "changed": false, "msg": "Authentication failed.", "unreachable": true }
日志显示:paramiko.transport Authentication (publickey) failed. 但是我直接 ssh 无密码登录是可以的,比了下 /root/.ssh/id_rsa.pub 和远程的 /root/.ssh/authorized_keys 也是匹配的。 各位大佬有遇到的么?
Python中paramiko SSH认证失败:paramiko.transport Authentication (publickey) failed. 如何解决?
5 回复
paramiko 的版本号多少?
这个问题通常是SSH密钥认证没配好。先确认几个关键点:
- 检查密钥对:
import paramiko
import os
# 检查私钥文件是否存在
private_key_path = '/path/to/private_key'
if not os.path.exists(private_key_path):
print(f"私钥文件不存在: {private_key_path}")
- 正确的连接方式:
def ssh_connect_with_key(hostname, username, key_path, port=22):
try:
# 创建SSH客户端
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 加载私钥
private_key = paramiko.RSAKey.from_private_key_file(key_path)
# 建立连接
client.connect(
hostname=hostname,
username=username,
pkey=private_key,
port=port,
timeout=10
)
print("SSH连接成功!")
return client
except paramiko.AuthenticationException as e:
print(f"认证失败: {e}")
print("请检查:1.私钥是否正确 2.公钥是否已添加到服务器authorized_keys")
except Exception as e:
print(f"连接失败: {e}")
return None
# 使用示例
ssh_connect_with_key('your_server.com', 'username', '/home/user/.ssh/id_rsa')
- 常见问题排查:
- 私钥文件权限问题:
chmod 600 /path/to/private_key - 公钥没加到服务器的
~/.ssh/authorized_keys - 服务器SSH配置禁止了密钥认证
- 调试建议:
# 启用详细日志
import logging
logging.basicConfig(level=logging.DEBUG)
先检查密钥文件路径和权限,再确认服务器上的公钥配置。
2.4.1
看错了,是 yum 装的,版本 1.7.5 (Ernest)
找到原因了,用非 root 用户登录的然后 su 到 root 安装的 ansible,导致 publickey 出问题,改成从 root 直连,重装就好了。十分感谢。

