web-dev-qa-db-ja.com

同じホストへの複数の同時アウトバウンド接続を試行する場合のSSH「接続リセット」

2つの役割のそれぞれに対して1回実行されるRakeリモートタスクを実行するスクリプトがあります。両方のロールは、同じVagrantインスタンスのユーザーです。したがって、基本的に、タスクは同じVMへの2つのSSH接続を並行して開き、各接続でいくつかのコマンドを実行することです。このタスクを実行すると、次のエラーが発生することがよくあります。

ssh_exchange_identification: read: Connection reset by peer

ただし、これはMacMiniであるJenkinsスレーブノードでのみ発生します。接続のリセット動作を再現する簡単な例を考え出しました。

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

また、上記のコマンドを実行しても、同じVagrantセットアップを持つローカルのMacBook Proインスタンスで、繰り返し実行してもエラーが再現されないこともわかりました。

両方のマシンのOSバージョンは同じで、SSHのバージョンも同じです。また、-vvvを使用して上記のsshコマンドを実行しましたが、明らかなものは何も表示されませんでした。頭に浮かぶ唯一のことは、おそらくJenkinsによって使用されているJenkinsマシン上にいくつかのsshdプロセスが表示されることです。

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

この動作が一方のマシンに表示され、もう一方のマシンには表示されない理由について、誰かが何か考えを持っていますか?

4
yixu34

コントロールマスター接続を設定してみましたか?これにより、1つの接続で複数のsshセッションを多重化できます。

コントロールマスターを設定するには

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

-o "ControlMaster = yes"は、この接続がマスタープロセスになることをsshに通知します。制御パスは、この接続を介して他のsshセッションを許可するように設定されたソケットです。

Sshにcontrolpathを使用させるには、別の端末で使用する必要があります。

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

これで問題が解決しない場合は、-vvvフラグを使用してsshの出力を投稿できますか?

2
peteches