paramiko连接服务器报错“Unable to agree on a pubkey algorithm... “及解决办法

项目中使用了paramiko作为ssh客户端去连接Linux服务器,之前使用一直正常,今天突然报错了,报错信息如下:

Exception(client): Unable to agree on a pubkey algorithm for signign a 'ssh-rsa' key!
Traceback
...
paramiko.ssh_exception.SSHException:No existing session

我的示例代码如下, paramiko版本是3.1.0

import paramiko

ip = 'xxx.xxx.xxx.xxx'
port = 22
user = 'xxx'
password = 'xxx'

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=ip, port=port, username=user, password=password)

排查思路

  • 我先检查了服务器是否可以使用ssh正常连接: 使用终端软件MobaXterm连接正常
  • 我又使用paramiko连接了其他Linux服务器,也能正常连接,考虑到可能是服务端的ssh差异导致
  • 查看ssh的版本:ssh -V,两个服务器的ssh版本如下:
OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 # 可正常连接
OpenSSH_8.3p1, without OpenSSL	#连接报错

解决办法

网上查阅了大量资料,其中大部分都是在connect方法中添加参数,如下:

ssh.connect(ip, port,user,password, disabled_algorithms={'keys': ['rsa-sha2-256', 'rsa-sha2-512']})
或
ssh.connect(ip, port,user,password, disabled_algorithms={'pubkeys': ['rsa-sha2-256', 'rsa-sha2-512']})

奈何都不能够解决问题,该报的错一点没少,
最终通过我不断的尝试,使用下面的方式解决了问题,大家拿走不谢~

import paramiko

ip = 'xxx.xxx.xxx.xxx'
port = 22
user = 'xxx'
password = 'xxx'

transport = paramiko.Transport((ip, port))
transport.connect(username=user, password=password)
ssh = paramiko.SSHClient()
ssh._transport = transport
stdin, stdout, stderr = ssh.exec_command('pwd')
print(stdout.read().decode('utf8'))

完结撒花❀

你可能感兴趣的:(Python,Linux,服务器,运维,python,ssh)