【问题标题】:C code to verify maximum number of ssh sessions验证最大 ssh 会话数的 C 代码
【发布时间】:2014-08-17 22:23:31
【问题描述】:

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

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

最大会话数 10

2) 我在 switch 中运行此代码,它会从 switch 连接到我的主机服务器。

请告诉我为什么我没有收到此“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;
}

【问题讨论】:

  • OT:为什么每次我读到一个使用“代码”而不是“代码”的问题时,我都会自动开始害怕即将发生的事情?我有那么老的笨蛋吗?相关问题:从您愿意分享的这件事中得到任何实际的输出(不仅仅是单个错误消息@invoke 79)?

标签: c linux ssh


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多