与 Paramiko 的无密码 SSH 连接失败,而 SSH 可以正常连接

Ste*_*app 3 python ssh paramiko

我打算在客户端和服务器之间使用 SSH 密钥创建使用无密码连接。

使用 paramiko,我最终遇到AuthenticationException。通过 Popen 使用标准 SSH,我可以毫无问题地连接

对于 Paramiko,我使用以下代码:

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.load_system_host_keys()
client.connect(ssh_server, username=ssh_user)
Run Code Online (Sandbox Code Playgroud)

对于同样的情况,我可以使用 SSH:

cmd = 'ssh -o GSSAPIAuthentication=no -o ForwardX11=no {}@{} echo 0 > /dev/null'.format(ssh_user, ssh_server)
process = subprocess.Popen(md, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
process.communicate()
Run Code Online (Sandbox Code Playgroud)

我正在使用 Python 3.4.6 和 Paramiko 2.4.1。

更多细节:

  • 我能够在不同的客户端上与 Paramiko 建立连接
  • 在此特定客户端上,ssh 模拟的用户与发起呼叫的用户不同。

Paramiko 调试输出

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.load_system_host_keys()
client.connect(ssh_server, username=ssh_user)
Run Code Online (Sandbox Code Playgroud)

SSH 调试:(使用 ssh -v ssh_user AT ssh_server)

cmd = 'ssh -o GSSAPIAuthentication=no -o ForwardX11=no {}@{} echo 0 > /dev/null'.format(ssh_user, ssh_server)
process = subprocess.Popen(md, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
process.communicate()
Run Code Online (Sandbox Code Playgroud)

Mar*_*ryl 6

您的连接有效,因为它使用来自(如 中配置的)ssh的私钥。该文件夹和文件用作 OpenSSH 工具集的配置(在本例中)。您不能期望其他 SSH 客户端/库将使用 OpenSSH 配置文件。一般来说,他们不会。~/.ssh/id_rsa_c2cssh_config.sshssh_configssh

如果您想对 Paramiko 使用公钥身份验证,请使用key_filename参数SSHClient.connect
另请参阅如何使用 ppk 公钥通过 Python Paramiko 进行 ssh 连接

尽管 Paramiko 特别会使用密钥文件,但如果它有一个通用名称,例如id_rsaid_dsa等。请参阅Python 中的 Paramiko 中的强制密码身份验证(忽略 .ssh 文件夹中的密钥)以了解完全相反的问题。


强制性警告:不要使用AutoAddPolicy,除非您不关心安全性。通过这种方式,您将失去针对 MITM 攻击的保护。
正确的解决方案请参见Paramiko“未知服务器”