Ssh
嘗試到同一主機的多個同時出站連接時 SSH“連接重置”
我有一個執行 Rake 遠端任務的腳本,該任務為兩個角色中的每一個執行一次。這兩個角色都是同一個 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 這個連接將是主程序。控制路徑是一個設置為允許其他 ssh 會話通過此連接的套接字。
要使您的 ssh 使用您只需要在單獨的終端中使用的控制路徑。
ssh -o "ControlPath=~/.ssh/%r@%h:%p" root@server "cmds" & \ ssh -o "ControlPath=~/.ssh/%r@%h:%p" root@server "cmds"
如果這不能解決問題,您可以使用 -vvv 標誌發布 ssh 的輸出嗎?