如果 ssh 控制套接字已经存在,如何中止?

fin*_*oot 3 command-line scripting bash ssh shell-script

我在我的脚本中使用以下行:

ssh -f -N -M -S <control socket> <host>
Run Code Online (Sandbox Code Playgroud)

这意味着初始连接仅保留在后台,我可以将其用于后续调用ssh

ssh -S <control socket> <host> <command>
Run Code Online (Sandbox Code Playgroud)

但是,如果我有多个带有命令的脚本,这些脚本应该使用相同的控制套接字并将“后台”调用ssh放入所有脚本中,我将在某个时候收到以下消息:

ControlSocket <control socket> already exists, disabling multiplexing
Run Code Online (Sandbox Code Playgroud)

这对脚本的其余部分没有影响,因为显然套接字存在并且可以被后续ssh命令使用。然而,即使“后台”会话无法打开套接字,它也不会退出并保持活动状态——只是没有多路复用。

使用[ -Sssh -O check检查套接字的存在仍然会留下竞争条件的可能性。

如何执行“如果尚不存在则打开控制套接字,如果存在则退出”?

Jak*_*uje 5

我认为您正在寻找ControlMaster auto,它可以在配置文件中指定,也可以直接在命令行中使用-o ControlMaster=auto.

这允许您统一打开连接和使用它的命令(对 也很有帮助ControlPersist)。