我在脚本中使用以下行:
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
或ssh -O check
检查套接字是否存在仍然会留下竞争条件的可能性。
我怎样才能做到“如果控制套接字尚不存在则打开它,如果存在则退出”?
答案1
我认为您正在寻找ControlMaster auto
,它可以在配置文件中指定,也可以直接在命令行上使用-o ControlMaster=auto
.
这允许您统一打开连接和使用它的命令(对于 也非常有帮助ControlPersist
)。