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

#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会话的正确状态(连接超时或连接被拒绝,这是从控制台访问服务器时通常会发生的情况).

推荐答案

令人惊讶的是,会话状态表明连接成功,

我看不出这有什么好惊讶的.到ssh服务器守护程序的network-level连接已成功.可能安全通道也已成功建立.这与用户身份验证无关.

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

"身份验证成功,密码不正确"是您自己的程序的诊断,您可以很好地证明您的程序在这一点上是错误的. the docs of ssh_userauth_password()认真阅读 请注意,记录了五个不同的返回代码,其中只有one个表示成功. 您的程序报告其中四个成功(没有密码),这将是其中三个错误的表征.

相反,你似乎想要这个:

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

C++相关问答推荐

如何避免重新分配指针数组时,我们从一开始就不知道确切的大小

什么C代码将确定打开的套接字正在使用的网络适配器?

C/SDL程序,渲染不使用我的渲染器

GLIBC:如何告诉可执行文件链接到特定版本的GLIBC

使用C时,Windows CMD中的argc参数是否包含重定向命令?

C++中矢量类型定义和数据保护的高效解决方案

每个 struct 变量在C中都有自己的命名空间吗?

如何使用指向 struct 数组的指针并访问数组中特定索引处的 struct

在Rust和C之间使用ffi时如何通过 struct 中的[U8;1]成员传递指针

如何识别Linux中USB集线器(根)和连接到集线器(根设备)的设备(子设备)?

如何在C语言中正确打印图形

用C++实现余弦函数

For循环中的变量行为不符合预期.[C17]

致命错误:ASM/rwan ce.h:没有这样的文件或目录.符号链接还不够

为什么我的半数组测试和奇数组测试不起作用?(我使用Assert进行调试)

使用mmap为N整数分配内存

在Ubuntu上使用库部署C程序的最佳实践

C语言中的指针和多维数组

C struct 中的冒泡排序

如何向 execl 创建的后台程序提供输入?