

使用libssh2库进行ssh连接,握手一直返回-8,无法交换密钥。搞了很久了,有知道为什么吗?
关注引自免费微信小程序:皆我百晓生
在您提供的代码片段中,libssh2_session_handshake() 函数返回值为 -8 表示一个错误。根据 libssh2 的文档,这个错误码通常对应于 LIBSSH2_ERROR_KEY_EXCHANGE_FAILED,意味着密钥交换过程中出现了问题。
密钥交换失败可能由多种原因引起,包括但不限于:
为了诊断和解决这个问题,您可以尝试以下几个步骤:
确保您使用的公钥和私钥是配对的,并且与服务器上的公钥匹配。可以尝试更换一套公钥/私钥对,或者确认您的公钥已正确添加到服务器的 ~/.ssh/authorized_keys 文件中(对于 OpenSSH)。
为了获取更详细的错误信息,可以在初始化 libssh2 连接时启用调试日志。这将帮助您了解具体哪个密钥交换算法失败。在调用 libssh2_init() 之前,添加以下代码:
#include <libssh2/log.h>
// 初始化日志等级为 LIBSSH2_LOG_VERBOSE
libssh2_log_init(LIBSSH2_LOG_VERBOSITY, stderr);
确保您的网络连接正常,没有被防火墙或其他安全软件阻止。尝试从同一网络环境下的其他机器连接到同一服务器,看看是否也有同样的问题。
查看服务器的 ssh 日志(通常是 /var/log/auth.log 或 /var/log/secure),可能会提供关于密钥交换失败的更多上下文信息。
确保您使用的 libssh2 库是最新的版本。有时候,旧版库可能存在已知的问题或兼容性问题。
尽管您未提供完整的代码,但可以考虑优化代码结构,比如使用循环处理 libssh2_error_eagain 错误,而不是简单的条件判断。以下是优化后的代码段:
#include <libssh2/session.h>
#include <libssh2/log.h>
// 初始化日志等级为 LIBSSH2_LOG_VERBOSE
libssh2_log_init(LIBSSH2_LOG_VERBOSITY, stderr);
int establish_ssh_session(libssh2_session **session, int sock) {
int rc;
// 初始化 libssh2
if ((rc = libssh2_init()) != 0) {
char *errmsg;
libssh2_session_last_error(session, &errmsg, NULL, 0);
printf("Error initializing libssh2: %d : %s\n", rc, errmsg);
return -1;
}
// 创建新会话
if (!(session = libssh2_session_new())) {
char *errmsg;
libssh2_session_last_error(session, &errmsg, NULL, 0);
printf("Error creating new session: %s\n", errmsg);
return -1;
}
// 设置 socket
if ((rc = libssh2_session_set_blocking(*session, 0)) != 0) {
char *errmsg;
libssh2_session_last_error(session, &errmsg, NULL, 0);
printf("Error setting blocking mode: %d : %s\n", rc, errmsg);
return -1;
}
while ((rc = libssh2_session_handshake(*session, sock)) == LIBSSH2_ERROR_EAGAIN) {
// Wait for more data or handle EINTR
}
if (rc) {
char *errmsg;
libssh2_session_last_error(session, &errmsg, NULL, 0);
printf("Error %d : %s\n", rc, errmsg);
printf("Failure establishing SSH session: %d\n", rc);
return -1;
}
return 0;
}
如果你仍然遇到问题,请提供更全面的日志输出和详细情况,以便更好地分析问题所在。