Bash
如果 ssh 控制套接字已經存在,如何中止?
我在我的腳本中使用以下行:
ssh -f -N -M -S <control socket> <host>
這意味著初始連接僅保留在後台,我可以將其用於後續呼叫
ssh
:ssh -S <control socket> <host> <command>
但是,如果我有多個帶有命令的腳本,這些命令應該使用相同的控制套接字並將“後台”呼叫
ssh
放入所有腳本中,我將在某個時候收到以下消息:ControlSocket <control socket> already exists, disabling multiplexing
這對腳本的其餘部分沒有影響,因為顯然套接字存在並且可以被後續
ssh
命令使用。然而,即使“後台”會話無法打開套接字,它也不會退出並保持活動狀態——只是沒有多路復用。使用
[ -S
orssh -O check
來檢查套接字的存在仍然會留下競爭條件的可能性。我該如何做“如果它不存在則打開控制套接字,如果存在則退出”?
我認為您正在尋找
ControlMaster auto
,可以在配置文件中指定,也可以直接在命令行中使用-o ControlMaster=auto
.這使您可以統一打開連接並使用它的命令(對 也很有幫助
ControlPersist
)。