[英]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”。
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.