SSH 'connection reset' ao tentar várias conexões de saída simultâneas para o mesmo host

4

Eu tenho um script que executa uma tarefa remota Rake que é executada uma vez para cada uma das duas funções. Ambas as funções são usuários na mesma instância do Vagrant. Então, essencialmente, a tarefa está abrindo duas conexões SSH para a mesma VM em paralelo e executando alguns comandos em cada conexão. Muitas vezes descubro que, quando essa tarefa é executada, ela produz o seguinte erro:

ssh_exchange_identification: read: Connection reset by peer

No entanto, isso só acontece em nosso nó escravo Jenkins, que é um Mac Mini. Eu criei um exemplo simples que reproduz o comportamento de redefinição de conexão:

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

Eu também descobri que a execução do comando acima não reproduz o erro na minha instância local do MacBook Pro, que tem a mesma configuração do Vagrant, mesmo que eu o faça repetidamente.

Ambas as máquinas têm a mesma versão do SO, assim como a mesma versão do SSH. Eu também executei os comandos ssh acima com -vvv mas não vi nada óbvio. A única coisa que me vem à mente é que vejo alguns processos sshd na máquina do Jenkins, supostamente usados por 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

Alguém tem alguma idéia de por que esse comportamento apareceria em uma máquina, mas não na outra?

    
por yixu34 10.01.2013 / 04:05

1 resposta

2

Você já tentou configurar uma conexão mestre de controle? isso permitirá que você multiplexe várias sessões ssh em uma única conexão.

Para configurar o uso mestre de controle

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

-o "ControlMaster = yes" diz ao ssh que esta conexão será o processo mestre. O caminho de controle é um soquete configurado para permitir outras sessões ssh através desta conexão.

Para fazer seu ssh usar o caminho de controle, você só precisa usar em um terminal separado.

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

Se isso não resolver o problema, você pode postar a saída do ssh com os sinalizadores -vvv?

    
por 14.01.2013 / 10:34