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密钥认证没配好。先确认几个关键点:

  1. 检查密钥对
import paramiko
import os

# 检查私钥文件是否存在
private_key_path = '/path/to/private_key'
if not os.path.exists(private_key_path):
    print(f"私钥文件不存在: {private_key_path}")
  1. 正确的连接方式
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')
  1. 常见问题排查
  • 私钥文件权限问题:chmod 600 /path/to/private_key
  • 公钥没加到服务器的~/.ssh/authorized_keys
  • 服务器SSH配置禁止了密钥认证
  1. 调试建议
# 启用详细日志
import logging
logging.basicConfig(level=logging.DEBUG)

先检查密钥文件路径和权限,再确认服务器上的公钥配置。

看错了,是 yum 装的,版本 1.7.5 (Ernest)

找到原因了,用非 root 用户登录的然后 su 到 root 安装的 ansible,导致 publickey 出问题,改成从 root 直连,重装就好了。十分感谢。

回到顶部