繁体   English   中英

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

[英]C code to verify maximum number of ssh sessions

我写了一个代码,使用每个线程以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”。

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

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会在超出限制时关闭连接。 它不会发出实际的断开连接消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM