Python ssh连接Linux服务器报Incompatible ssh peer (no acceptable kex algorithm) 解决方法

本文介绍了Python通过SSH连接Linux服务器时出现的加密算法不匹配问题及其解决方案。问题表现为部分服务器连接失败,原因是Python ssh插件与服务器加密算法不兼容。文章提供了两种解决思路:一是修改服务器端ssh配置文件sshd_config;二是采用paramiko插件,并建议使用其最新版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python通过ssh连接linux服务器,部分服务器出现如下异常

03:50:48.725 FAIL ftp operation failed, Incompatible ssh peer (no acceptable kex algorithm)

 

原因是Python使用的ssh插件,加密算法与远端服务器的加密算法不匹配。

Linux服务端ssh的加密算法配置在 etc/ssh/sshd_config文件中,最后一行

KexAlgorithms ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1

可将最后一行算法修改为正常环境的配置值 (不推荐这种方式)

 

另一种处理方式是修改Python的调用方式。有两种方式获取ssh链接。

1.基于ssh

这种方式 ssh基于SSH-1.8.0插件,部分老用例使用了这个插件,需要自己实现ssh链接操作。 这个插件2012年10月之后没有再更新,所以对于新的算法支持不了。

2.基于paramiko

自动化框架基于paramiko插件实现, paramiko插件较新,可以支持新的算法。

 

取用paramiko最新版本,问题解决。  注意paramiko插件依赖ecdsa与pycrypto两个插件。

python插件下载网址: https://pypi.org/

 

转载于:https://www.cnblogs.com/BrokenSwitch/p/9546405.html

### 问题分析 当使用 Paramiko 进行 SSH 连接时,如果遇到 `Incompatible ssh peer (no acceptable host key)` 或类似的错误消息,通常是因为客户端和服务器之间的密钥交换算法(KEX algorithms)、MAC 算法或主机密钥类型不匹配。 以下是可能的原因以及解决方案: --- ### 可能原因及解决办法 #### 原因一:SSH 协议版本不一致 Paramiko 默认支持的是较新的加密协议标准,而某些旧版的 SSH 服务端可能会使用过时的 KEX 算法或 MAC 算法。这可能导致双方无法协商合适的参数。 **解决方法**: 可以通过修改 Paramiko 的配置来允许更多的 KEX 和 MAC 算法选项。例如,在初始化 SSH 客户端之前设置自定义策略[^2]。 ```python import paramiko transport = paramiko.Transport(("hostname", 22)) transport.get_security_options().kex += ('diffie-hellman-group1-sha1',) client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect("hostname", username="username", password="password") ``` 上述代码通过扩展默认的安全选项列表,增加了对旧版 Diffie-Hellman 密钥交换的支持。 --- #### 原因二:缺少兼容的 Host Key 类型 `Incompatible ssh peer (no acceptable host key)` 错误也可能由于服务器使用的主机密钥类型未被 Paramiko 支持所致。常见的主机密钥类型包括 RSA、DSA、ECDSA 和 ED25519。 **解决方法**: 可以尝试更新 Paramiko 到最新版本,因为新版本会增加对更多现代加密技术的支持[^3]。或者手动指定可接受的主机密钥类型。 ```python from paramiko import SSHClient, AutoAddPolicy client = SSHClient() client.set_missing_host_key_policy(AutoAddPolicy()) # 显式声明支持的主机密钥类型 host_keys = client.get_host_keys() if not host_keys.lookup('hostname'): host_keys.add('hostname', 'ssh-rsa', paramiko.RSAKey.generate(2048)) client.connect("hostname", username="username", password="password") ``` 此代码片段强制启用了对 RSA 主机密钥的支持。 --- #### 原因三:SSH 配置文件中的限制 有时,目标 Linux 服务器上的 `/etc/ssh/sshd_config` 文件中可能存在严格的加密配置,禁用了部分老旧但仍然广泛使用的算法。 **解决方法**: 检查并调整服务器侧的 SSH 配置文件以放宽限制。编辑 `/etc/ssh/sshd_config` 并确保以下字段包含必要的条目[^4]: ```plaintext KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group-exchange-sha256 HostKey /etc/ssh/ssh_host_rsa_key Ciphers aes128-cbc,aes192-cbc,aes256-cbc MACs hmac-md5,hmac-sha1 ``` 完成更改后重启 SSH 服务: ```bash sudo systemctl restart sshd ``` --- #### 原因四:软件版本差异过大 如果本地 Python 版本或 Paramiko 库版本较低,则可能出现与远程服务器不兼容的情况。 **解决方法**: 升级到最新的 Paramiko 版本,并确认其依赖项已正确安装。 ```bash pip install --upgrade paramiko cryptography ``` 此外,验证所用的 OpenSSH 客户端和服务端版本是否处于合理范围内[^5]。 --- ### 总结 以上提供了多种针对不同场景下的解决方案。具体实施时需结合实际环境逐一排查。优先考虑调整 Paramiko 参数而非降低服务器安全性;只有在必要情况下才应修改服务器配置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值