【问题标题】:Basic SSH Connection using Paramiko fails使用 Paramiko 的基本 SSH 连接失败
【发布时间】:2020-08-19 05:32:46
【问题描述】:

我正在学习 paramiko 的基础知识,为此我建立了一个基本实验室,我将 Ubuntu VM 连接到 EVE-ng 中模拟的路由器。

第一步是在客户端通过 ssh-Keygen 生成密钥对

接下来,我使用以下命令将公钥加载到远程服务器(Cisco 路由器):

ip ssh pubkey-chain
  username administrator
   key-hash ssh-rsa 97D0E9B5630D05D78EA9531053124BFF

之后我就可以从 Ubuntu VM 登录到 Cisco 路由器:

$ ssh administrator@192.168.1.1
7206_1.rt#

然后,我从同一个客户端启动了一个 Python shell 会话并尝试使用 Paramiko 建立一个 SSH 会话:

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.1.1', username='administrator', password='password', key_filename= '/home/administrator/.ssh/id_rsa.pub') 

但这次我得到了以下异常:

Exception: Illegal info request from server
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/dist-packages/paramiko/transport.py", line 2109, in run
    handler(self.auth_handler, m)
  File "/usr/local/lib/python3.8/dist-packages/paramiko/auth_handler.py", line 661, in _parse_userauth_info_request
    raise SSHException("Illegal info request from server")
paramiko.ssh_exception.SSHException: Illegal info request from server

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.8/dist-packages/paramiko/client.py", line 435, in connect
    self._auth(
  File "/usr/local/lib/python3.8/dist-packages/paramiko/client.py", line 764, in _auth
    raise saved_exception
  File "/usr/local/lib/python3.8/dist-packages/paramiko/client.py", line 751, in _auth
    self._transport.auth_password(username, password)
  File "/usr/local/lib/python3.8/dist-packages/paramiko/transport.py", line 1498, in auth_password
    raise SSHException("No existing session")
paramiko.ssh_exception.SSHException: No existing session

远程路由器SSH调试显示认证失败:

*Aug 16 01:18:07.295: SSH2 0: MAC compared for #5 :ok
*Aug 16 01:18:07.299: SSH2 0: input: padlength 16 bytes
*Aug 16 01:18:07.299: SSH2 0: Using method = publickey
*Aug 16 01:18:07.307: SSH2 0: send:packet of  length 432 (length also includes padlen of 4)
*Aug 16 01:18:07.307: SSH2 0: computed MAC for sequence no.#5 type 60
*Aug 16 01:18:07.311: SSH2 0: Authenticating 'administrator' with method: publickey
*Aug 16 01:18:07.327: SSH2 0: SSH ERROR closing the connection
*Aug 16 01:18:07.331: SSH2 0: send:packet of  length 80 (length also includes padlen of 15)
*Aug 16 01:18:07.331: SSH2 0: computed MAC for sequence no.#6 type 1
*Aug 16 01:18:07.335: SSH2 0: Pubkey Authentication failed for user administrator
*Aug 16 01:18:07.335: SSH0: password authentication failed for administrator

此时我无法判断问题出在服务器上还是在路由器上,因为在没有 Paramiko 的情况下直接从服务器连接到路由器时一切正常。

谢谢。

【问题讨论】:

    标签: python-3.x ssh paramiko


    【解决方案1】:

    好的,看起来默认情况下,Paramiko 在 ~/.ssh/ 中搜索可发现的私钥文件,如果尝试连接到另一台服务器很好,但由于它试图连接到路由器,因此需要通过设置禁用此功能look_for_keys 为 False。这解决了我的问题(只要这不是生产环境)。

    【讨论】:

      【解决方案2】:

      身份验证通过 /home/administrator/.ssh/id_rsa.pub 中的公钥完成

      不完全是:它是使用您在键入时使用的 local 用户的 private 键完成的:

      ssh administrator@192.168.1.1
      

      'administrator' 是 remote 帐户的名称,用于在 remote 服务器 192.168.1.1

      上打开会话

      远程端的身份验证将使用~administrator/.ssh/authorized_keys(同样在远程计算机上)完成,以检查本地~/.ssh/id_rsa.pub 公钥是否已正确注册到远程~administrator/.ssh/authorized_keys 中。

      您的本地帐户也可能是“administrator”,但在执行 Python shell 时,同一个本地帐户可能不同。

      当你看到

      Authenticating 'administrator' with method: publickey
      

      SSH 指的是远程服务器上的远程“administrator”帐户,与您所在的本地用户帐户无关。

      【讨论】:

      • 感谢 VonC。是的,远程服务器确实是一个 cisco 路由器,其中用户名是管理员,而不是密码,我通过 Pubkey 使用身份验证:
      • ip ssh pubkey-chain 用户名管理员密钥哈希 ssh-rsa 97D0E9B5630D05D78EA9531053124BFF
      • 所以路由器没有authorized_keys文件但是我用上面的命令添加了客户端的公钥。
      • 好的。我对这种配置/设置不太熟悉。您可以通过编辑将这些元素添加到您的问题中吗?