总结SSH登陆故障:expected key exchange group packet form server

本文详细解析了SSH连接中出现的“expectedkeyexchangegrouppacketfromserver”错误,包括Navicat连接数据库及putty等远程终端软件的连接问题。提供了针对不同场景的有效解决方案,如更新软件版本、调整安全组设置、修正SSH配置等。

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

expected key exchange group packet form server 通常会出现在Navicat连接数据库或者putty/xshell/WinSCP/SecureCRT等远程终端软件SSH到linux服务器是报错。(直接ssh命令主机是没有问题的,通过终端就会产生这类error)

前提环境:网络ping、端口、服务、权限和账号密码都正常的。

情况一、Navicat连接不上Linux服务器上的MySQL。

  1. )最直接办法版本问题:更新Navicat到最新版本即可解决
  2. 1.先进入linux连接数据库并输入密码:
 
  1. mysql -uroot -p

 2.输入以下命令进行授权:

 
  1. GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '这里写自己数据库的密码' WITH GRANT OPTION;

 3.刷新权限:

 
  1. FLUSH PRIVILEGES;

Navicat连接不上阿里云的MySQL数据库,报SSH:expected key exchange group packet form server错误 其他 第1张

4.但是添加了权限之后,还是连接不上数据库。必须给服务器的安全组设置端口放行规则

Navicat连接不上阿里云的MySQL数据库,报SSH:expected key exchange group packet form server错误 其他 第2张

Navicat连接不上阿里云的MySQL数据库,报SSH:expected key exchange group packet form server错误 其他 第3张

5.接着就可以正常访问了。

 

情况二、putty/xshell/WinSCP/SecureCRT等远程终端软件SSH到linux服务器是报错

ssh 密钥登录失败的问题,困惑了很久

生成的key应该是没有问题,因为我把生成的公钥写到到/root/.ssh/authorized_keys里面,然后执行ssh root@xxx 能够直接登陆。但是换成普通用户则就出现了问题。现在的情况:/home/test/.ssh 权限700/home/test/.ssh/authorized_keys 权限600也执行了chown -R test:test /home/test/.ssh

/etc/ssh/sshd_config里面也开启了登陆认证

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

service sshd restart 也执行过了

/etc/selinux/config里面已经是SELINUX=disabled
但是普通用户就是无法登录。
参看了安全日志/var/log/secure得到的结果也仅仅是一句:
Did not receive identification string from xxx

修改权限 chmod 644 authorized_keys 把ssh的StrictModes关闭 等操作都无果

问题应该是这样子的: 
1、先在本机A的root用户下使用ssh-genkey生成了公私钥对,并将A机器公钥加入了远程机器B的root账户“.ssh/authorized_keys”中,可以正常从A机器使用root用户登录机器B。
2、但是同样在A机器的root用户下,使用 ssh test@B 命令登录远程机器B的test用户时,无法正常登录。

解决办法: 将A机器的root用户的公钥,加入 远程机器B的test用户下的“.ssh/authorized_keys” 文件中,即可实现。

自用安装测试的一台服务器上次yum update到centos 7.4,刚才发现跳转不过去了,提示:

expected key exchange group packet from server

赶紧登陆服务器看一下,诶,可以ssh登陆啊。SSH通道换成密码的形式,也是不行。

看一下SSHD的日志

 journalctl --unit sshd --no-pager 

Jan 24 17:51:20 hk sshd[1989]: /etc/ssh/sshd_config line 50: Deprecated option RSAAuthentication
Jan 24 17:51:20 hk systemd[1]: Started OpenSSH server daemon.
Jan 24 17:51:22 hk sshd[1990]: rexec line 50: Deprecated option RSAAuthentication
Jan 24 17:51:22 hk sshd[1990]: error: kex protocol error: type 30 seq 1 [preauth]

 嘿,升级了openssh版本了啊,这个配置参数已经是被废弃掉的

于是我备份一下/etc/ssh/sshd_config文件便删掉了50行的RSAAuthentication

重启再试,嘿,还是不行,现在就剩下这句提示了:

error: kex protocol error: type 30 seq 1 [preauth]

得,试试呗。[终极解决方案]

# Add this to /etc/ssh/sshd_config
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1
# systemctl restart sshd

OK!成功ssh登陆。。。

原因大概就是

use libssh2, and libssh2 only support diffie-hellman key exchange methods

而且升级libssh2也未能解决,应该是个bug。

【原因导致】

服务器的sshd服务升级了

putty版本过低,会出现这个报错信息,你可以检查下版本,下个最新版的试试

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

【参考梯子文档】

diffie-hellman-group1-sha1 - 优快云博客 https://blog.youkuaiyun.com/shadow066/article/details/51222577

Putty SSH密钥登录CentOS7 - 优快云博客 https://blog.youkuaiyun.com/kkaazz/article/details/78808613

### C++ 中 `std::expected` 的用法与相关信息 `std::expected` 是一个可能被引入到 C++ 标准库中的工具,旨在提供一种更优雅的方式来处理错误和返回值[^4]。它的设计目标是替代传统的异常处理机制或简单的返回值加错误码的方式,从而在函数调用中明确表达成功或失败的两种可能性。 #### 1. `std::expected` 的基本概念 `std::expected` 是一个模板类,通常定义为 `std::expected<T, E>`,其中: - `T` 表示成功的返回值类型。 - `E` 表示错误信息的类型。 如果函数执行成功,则返回包含 `T` 类型值的对象;如果失败,则返回包含 `E` 类型错误信息的对象。 #### 2. 示例代码 以下是一个简单的例子,展示如何使用 `std::expected`: ```cpp #include <iostream> #include <expected> // 假设 std::expected 已经被标准化 std::expected<int, std::string> divide(int a, int b) { if (b == 0) { return std::unexpected<std::string>("Division by zero"); } return a / b; } int main() { auto result = divide(10, 2); if (result.has_value()) { std::cout << "Result: " << result.value() << std::endl; } else { std::cerr << "Error: " << result.error() << std::endl; } auto result2 = divide(10, 0); if (!result2.has_value()) { std::cerr << "Error: " << result2.error() << std::endl; } } ``` 在这个例子中: - `divide` 函数返回一个 `std::expected<int, std::string>` 对象。 - 如果分母为零,则返回一个错误信息 `"Division by zero"`。 - 调用者可以通过 `has_value()` 检查是否成功,并通过 `value()` 获取结果或通过 `error()` 获取错误信息。 #### 3. 与现有机制的对比 - **与异常的区别**:异常处理机制会中断程序控制流,而 `std::expected` 不会导致控制流的改变,所有错误处理逻辑都在调用者处显式编写。 - **与返回值+错误码的区别**:`std::expected` 提供了一种类型安全的方式,避免了手动检查错误码的繁琐过程。 #### 4. 可能的标准库扩展 未来版本的 C++ 标准库可能会进一步扩展 `std::expected` 的功能,例如支持更多的构造方式、与 `std::variant` 的互操作性等[^4]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值