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

如果 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命令使用。然而,即使“后台”会话无法打开套接字,它也不会退出并保持活动状态 - 只是没有多路复用。

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

我怎样才能做到“如果控制套接字尚不存在则打开它,如果存在则退出”?

答案1

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

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

相关内容