用于验证最大 ssh session 数的 C 代码

标签 c linux ssh

我编写了一个代码,使用线程打开多个 ssh session ,每个线程的间隔为 3 秒 b/w,我希望最大时出现“ERROR_SSH_TOO_MANY_CONNECTIONS”(错误编号 112 (0x0070))。不。超出 session 数。但是我没有得到这个错误,我能够进行 78 次成功的 session ,在第 79 次 session 中我得到“无法分配内存”,但是在第 11 次 session 中我应该得到“ERROR_SSH_TOO_MANY_CONNECTIONS”。

注意: 1) 我没有更改“/etc/ssh/sshd_config”中的最大限制,默认情况下它是“10”。

最大 session 数 10

2) 我在交换机中运行此代码,它建立从交换机到我的主机服务器的连接。

请告诉我为什么我没有收到此“ERROR_SSH_TOO_MANY_CONNECTIONS”错误。

    int main()
{
    int cntr =0;
    void *th_res;
    pthread_t tid[80];

    while(cntr != 80) {
        if(pthread_create(&tid[cntr], NULL, ssh_session, (void*)&tid[cntr])){
            perror("pthread creation failed");
            printf("errno = %d&&&&&&&&&&&&&&&&&&&&&&&\n",errno);
        }
        else
            printf("tid[%d] = %d\t Session No:%d\n",cntr,(int)tid[cntr],cntr+1);
        cntr++;
        sleep(2);
    }

    cntr = 0;

    while(cntr != 80) {
        //printf("Main thread waiting for tid[%d] for joining\n",(int)tid[cntr]);
        if(pthread_join(tid[cntr],&th_res)) {
            perror("pthread join error");
        }

        if(th_res != NULL)
            abort();
        cntr++;
    }

    return 0;  
}

void* ssh_session(void* arg)
{
    int my_rc = 0;

    //printf("Thread %d is executing\n",*(int*)arg);
    my_rc = system("ssh -oSSHPassword=\"************\" spandiya@10.70.12.102");
    //my_rc = system("ssh -oSSHPassword=\"fibranne\" root@10.17.18.103");

    if (WEXITSTATUS(my_rc) != 0) {
        printf("system command failed\n");
        printf("WEXITSTATUS(my_rc) =%d\n",WEXITSTATUS(my_rc));
        printf("my_rc =%d\n",my_rc);
        printf("Session limit reached###########################\n");
        return "Session limit reached";
    }

    printf("Thread %d is exiting\n",*(int*)arg);

    return NULL;
}

最佳答案

MaxSessions 并没有按照您的想法进行操作,并且该错误代码并不代表您认为的那样。这是来自 sshd_configMaxSessions 描述手册页:

MaxSessions
    Specifies the maximum number of open sessions permitted per network
    connection. The default is 10.

ssh 协议(protocol)允许通过单个 ssh 连接多路复用多个 ssh“ channel ”。 channel 是一个单独的双向数据流,例如交互式 session 、SFTP channel 或事件端口转发。某些 channel (例如交互式连接、SFTP channel 或 SCP 实例)需要 ssh 服务器启动命令来为 channel 提供服务。 “ session ”是指由 ssh 服务器启动的进程,该进程为 channel 提供服务。当您运行 ssh 程序的新实例时,您正在创建一个新的网络连接。这些连接中的每一个都可以有 MaxSessions session 。事实上,他们每个人都有一个 session ,所以你甚至没有接近达到极限。

要体验 MaxSessions 限制,您必须能够在单个连接中启动多个 session 。使用 ssh 命令行实用程序很难做到这一点。您可以考虑使用 ssh ControlMaster, ControlPath,ControlPersist 选项。或者您可以编写自己的 ssh 客户端,在同一连接中打开多个 session 。

关于 ERROR_SSH_TOO_MANY_CONNECTIONS,实际代码似乎是断开消息代码 12,SSH2_DISCONNECT_TOO_MANY_CONNECTIONS。这实际上是指连接,而不是 session 。 OpenSSH 源代码定义了这个断开消息代码,但它从来没有发出过它。 OpenSSH ssh 服务器对一次可以打开的未验证 ssh 连接的数量有限制;这是由 MaxStartups sshd_config 选项控制的。但是 OpenSSH 只是在超过限制时关闭连接;它不会发出实际的断开连接消息。

关于用于验证最大 ssh session 数的 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25349306/

相关文章:

ssh - 通过 ssh 连接到 Jupyter Notebook

c - 使用 Visual Studio 调试 Fork [C]

使用 getchar() 额外数字将 char 转换为 Int

c - 没有任何语句的for循环

python - 将python代码(linux)移植到windows

linux - 使子域指向特定端口

linux - 使用 Curl 的缓冲输出将文件上传到 ftp 服务器

Git 在错误的位置寻找我的 SSH key

security - 如何在同一(但不断变化的)IP 地址上处理 2 个不同主机的 ssh 主机 key 验证?

c - 如何从函数返回矩阵(二维数组)? (C)