当尝试同时向同一主机发出多个出站连接时,SSH'连接重置'

我有一个脚本执行一个Rake远程任务,为每个angular色执行一次。 这两个angular色都是同一个Vagrant实例的用户。 所以本质上这个任务是并行打开两个SSH连接到同一个虚拟机,并在每个连接上执行一些命令。 我经常发现,当这个任务执行时,会产生下面的错误:

ssh_exchange_identification: read: Connection reset by peer 

但是,这只发生在我们的Jenkins从属节点上,这是一个Mac Mini。 我想出了一个简单的例子来重现连接重置行为:

 ssh root@vagrant-target "echo hello" & ssh root@vagrant-target "echo bye" 

我也发现执行上面的命令不会重现我的本地MacBook Pro实例,它具有相同的Vagrant设置,即使我反复做这个错误。

两台机器都具有相同的操作系统版本,以及相同版本的SSH。 我也用-vvv运行了上面的ssh命令,但没有看到任何明显的东西。 唯一想到的是,我在Jenkins机器上看到了一些sshd进程,可能是由Jenkins使用的:

 jenkins 34394 0.1 0.0 2471700 840 ?? S 6:27PM 0:00.05 /usr/sbin/sshd -i jenkins 35220 0.0 0.0 2470872 1284 ?? S 6:27PM 0:01.38 /usr/sbin/sshd -i root 35218 0.0 0.0 2469596 2908 ?? S 6:27PM 0:00.04 /usr/sbin/sshd -i 

有没有人有任何想法,为什么这种行为会出现在一台机器上,而不是另一台?

你有没有尝试设置控制主连接? 这将允许您通过单个连接复用多个ssh会话。

设置控制主使用

 ssh -o "ControlMaster=yes" -o "ControlPath=~/.ssh/%r@%h:%p" root@server 

-o“ControlMaster = yes”告诉ssh这个连接将是主进程。 控制path是一个套接字,允许通过此连接进行其他ssh会话。

为了使你的SSH使用控制path,你只需要在一个单独的terminal使用。

 ssh -o "ControlPath=~/.ssh/%r@%h:%p" root@server "cmds" & \ ssh -o "ControlPath=~/.ssh/%r@%h:%p" root@server "cmds" 

如果这不sorting的问题,你可以发布sv的输出与-vvv标志?