我正在寻找 Linux 上 OpenSSH 的一个选项,以坚持使用预先存在的控制主连接。也就是说,我想确保如果 ssh 命令无法连接到主连接套接字并且永远不会尝试连接到远程主机本身,则该命令将失败。
我尝试了 ControlPath 和 ControlMaster 的不同组合,但似乎当主套接字不可用时,ssh 无论如何都会尝试连接。
作为一种解决方法,我在 ~/.ssh/config 中输入了:
Match host my-master-only-host
# Use non-existing port to insist on using master connection
Port 55555
因此默认情况下 ssh 会失败,然后在启动主连接时切换到真实端口:
ssh -p 22 -M my-master-only-host
这可行,但根据防火墙设置,无主 ssh 可能需要一段时间才能连接超时。还有更好的方法吗?
答案1
我猜可以使用 ProxyCommand 来强制执行此操作。为此目的,请查看 socat。
编辑:
ssh -o ProxyCommand="socat - SOCKET:<path_to_control_path>" <hostname>
答案2
tomek 的建议提示了我如何使用 ProxyCommand。想法是.ssh/config
:
# By default prevent any connections via immediate exit from proxy.
Match host my-master-only-host
ProxyCommand exit 1
然后我可以在设置控制主机时调用 ssh,如下所示:
ssh -M -o ProxyCommand=none my-master-only-host
此处ProxyCommand=none
使配置中的 ProxyCommand 设置无效。此用法none
未记录在案,但至少适用于 OpenSSH 7.7。