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

时间:2014-08-17 12:46:44

标签: c linux ssh

我编写了一个代码,使用每个线程间隔3秒b / w的线程打开多个ssh会话,我希望" ERROR_SSH_TOO_MANY_CONNECTIONS"(错误编号112(0x0070))最大值。没有。会话超出了。但我没有得到这个错误,我能够成功完成78次会议,在第79次会议期间,我得到了#34;无法分配内存"但是在第11次会议期间我应该得到" ERROR_SSH_TOO_MANY_CONNECTIONS"。

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

MaxSessions 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;
}

1 个答案:

答案 0 :(得分:1)

MaxSessions并没有按照您的想法行事,错误代码并不意味着您的想法。以下是sshd_config手册页中的MaxSessions说明:

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

ssh协议允许多路复用多个ssh" channel"通过单个ssh连接。信道是单独的双向数据流,例如交互式会话,SFTP信道或活动端口转发。某些通道 - 例如交互式连接,SFTP通道或SCP实例 - 需要ssh服务器启动命令来为通道提供服务。 A"会话"指由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只是在超出限制时关闭连接;它没有发出实际的断开连接消息。