SSH 会话给出意外状态

问题描述 投票:0回答:1

将 PAM 配置为在登录尝试失败后显示新的登录提示之前等待一段指定的时间后,我想使用一个简单的程序来测试此行为,该程序将尝试连接到远程服务器并测量显示登录提示之间的时间:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <libssh/libssh.h>

#define BILLION 1000000000.0

int main(void) {
    struct timespec start, finish;

    ssh_session session;
    int rc;
    int session_status;
    const char *server_banner;
    session = ssh_new();

    const char *host = "10.11.12.13";
    const char *username = "baduser";
    const char *password = "badpass";

    ssh_options_set(session, SSH_OPTIONS_HOST, host);
    ssh_options_set(session, SSH_OPTIONS_USER, username);

    clock_gettime(CLOCK_REALTIME, &start);
    rc = ssh_connect(session);
    session_status = ssh_get_status(session);
    printf("Session status: %d\n", session_status);
    server_banner = ssh_get_serverbanner(session);
    printf("Server banner: %s\n", server_banner);

    if (rc != SSH_OK) {
        fprintf(stderr, "Error connecting to %s: %s\n", host, ssh_get_error(session));
        ssh_free(session);
        exit(-1);
    }

    printf("Return Code is: %d\n", rc);

    if (ssh_userauth_password(session, NULL, password) != SSH_AUTH_ERROR) {
        fprintf(stderr, "Authentication succeeded with incorrect password.\n");
    }
    else {
        fprintf(stderr, "Authentication failed with incorrect password.\n");
    }

    clock_gettime(CLOCK_REALTIME, &finish);

    ssh_disconnect(session);
    ssh_free(session);

    double time_spent = (finish.tv_sec - start.tv_sec) + (finish.tv_nsec - start.tv_nsec) / BILLION;
    printf("Elapsed time: %.4f seconds.\n", time_spent);

    return (0);
}

但是,上面的代码返回以下输出:

Session status: 0
Server banner: SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.8
Return Code is: 0
Authentication succeeded with incorrect password.
Elapsed time: 2.2801 seconds.

令人惊讶的是,会话状态显示连接成功,而且

Authentication succeeded with incorrect password.
表示程序能够与服务器连接。这不是真的,因为我从未与服务器交换过密钥。此外,服务器上没有用户与连接可能使用的任何可能的用户名相匹配。

请帮助了解这里发生的情况:如何让程序接收 SSH 会话的正确状态(连接超时或连接被拒绝,因为从控制台访问服务器时通常会发生这种情况)。

c libssh
1个回答
1
投票

令人惊讶的是,会话状态显示连接成功,

我不明白这有什么值得惊讶的。与 ssh 服务器守护进程的网络级连接成功,与用户身份验证无关。

此外,身份验证成功,但密码不正确。说该程序能够与服务器连接。这不是真的,因为我从未与服务器交换过密钥。此外,服务器上没有用户与连接可能使用的任何可能的用户名相匹配。

“身份验证成功,密码不正确”是您自己的程序的诊断,并且您为您的程序在这一点上的错误提供了一个很好的案例。请仔细阅读 ssh_userauth_password()

 的文档。请注意,记录了五个不同的返回代码,其中只有“一个”表示成功。您的程序报告其中四个成功(没有密码),这对于其中三个来说是不正确的表征。
您似乎想要这个:

if (ssh_userauth_password(session, NULL, password) == SSH_AUTH_SUCCESS) { fprintf(stderr, "Authentication succeeded with incorrect password.\n"); }


© www.soinside.com 2019 - 2024. All rights reserved.