Python 3.x 使用Paramiko的基本SSH连接失败

Python 3.x 使用Paramiko的基本SSH连接失败,python-3.x,ssh,paramiko,Python 3.x,Ssh,Paramiko,我正在学习paramiko的基础知识,为此我建立了一个基础实验室,将Ubuntu虚拟机连接到EVE ng模拟的路由器上 第一步是通过ssh-Keygen在客户端生成密钥对 接下来,我使用以下命令将公钥加载到远程服务器(Cisco路由器): ip ssh pubkey-chain username administrator key-hash ssh-rsa 97D0E9B5630D05D78EA9531053124BFF 之后,我就可以从Ubuntu虚拟机登录到Cisco路由器: $

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

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

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

ip ssh pubkey-chain
  username administrator
   key-hash ssh-rsa 97D0E9B5630D05D78EA9531053124BFF
之后,我就可以从Ubuntu虚拟机登录到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
在这一点上,我无法判断问题是在服务器上还是在路由器上,因为在没有Paramiko的情况下直接从服务器连接到路由器时,一切都正常

谢谢

身份验证通过/home/administrator/.ssh/id\u rsa.pub中的公钥完成

不完全正确:输入时使用本地用户的私钥:

ssh administrator@192.168.1.1
administrator
”是用于在远程服务器192.168.1.1上打开会话的远程帐户的名称

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

您的本地帐户也可能是“
administrator
”,但在执行pythonshell时,该本地帐户可能不同

当你看到

Authenticating 'administrator' with method: publickey

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

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

谢谢VonC。对远程服务器实际上是一个cisco路由器,其中用户名是管理员,而不是密码,我使用通过公钥的身份验证:ip ssh Pubkey chain用户名管理员密钥哈希ssh rsa 97D0E9B5630D05D78EA9531053124BFFSo路由器没有授权的密钥文件,但我使用上述命令添加了客户端的公钥。OK。我对这种配置/设置不太熟悉。你能通过编辑把这些元素添加到你的问题中吗?
Authenticating 'administrator' with method: publickey