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
放入所有脚本中,我将在某个时候收到以下消息:
Run Code Online (Sandbox Code Playgroud)ControlSocket <control socket> already exists, disabling multiplexing
这对脚本的其余部分没有影响,因为显然套接字存在并且可以被后续ssh
命令使用。然而,即使“后台”会话无法打开套接字,它也不会退出并保持活动状态——只是没有多路复用。
使用[ -S
或ssh -O check
检查套接字的存在仍然会留下竞争条件的可能性。
如何执行“如果尚不存在则打开控制套接字,如果存在则退出”?
我认为您正在寻找ControlMaster auto
,它可以在配置文件中指定,也可以直接在命令行中使用-o ControlMaster=auto
.
这允许您统一打开连接和使用它的命令(对 也很有帮助ControlPersist
)。