我使用以下选项来~/.ssh/config
启用连接多路复用:
ControlMaster auto
ControlPath ~/.ssh/control/master-%r@%h:%p
但是,这有一个令人讨厌的问题,即连接到特定服务器的第一个 shell 必须是最后一个断开的,因为它是所有其他连接正在使用的主连接。因此,如果您注销主服务器,它似乎只是挂起。为了解决这个问题,我想用一个脚本包装 ssh,该脚本检查控制主文件是否存在,如果不存在,则在后台启动主 ssh 进程。然后它将启动从属 ssh 会话。
为了实现这一点,我的脚本必须确定 ssh 将使用的控制文件的路径。这将需要解析 ssh 命令行选项和配置文件并实现确定 ControlPath 的逻辑。有没有办法只询问 ssh 将使用什么路径,这样我就可以检查它了?
答案1
刚刚发现。ssh -O check HOST
答案2
根据我的测试,可以接受的答案是:
ssh -O check HOST
仅当不存在时才会提供控制文件
Control socket connect(<path to control file>): No such file or directory
否则
Master running (pid=<number>)
但是,grepssh -G
总会给你路径。
-G 使 ssh 在评估主机和匹配块后打印其配置并退出。
>>> ssh -G HOST | grep controlpath
controlpath <path to control file>
注意:如果您在 ssh 配置文件中使用%l
或%C
(例如),这将对本地机器进行评估。