我编写了一个代码,使用每个线程间隔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"。
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;
}
答案 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只是在超出限制时关闭连接;它没有发出实际的断开连接消息。