在我的 中~/.ssh/config
,我ControlMaster auto
启用了该设置。它对我来说效果很好,但有一种行为让我恼火,我想消除它。
假设我有两个终端仿真器窗口 A 和 B。在窗口 A 中,我调用ssh
连接到远程主机,然后在窗口 B 中执行相同操作。接下来,我exit
在窗口 A 中键入以关闭会话。尽管我已经断开连接,但ssh
窗口 A 中的进程不会退出到本地会话,因为它必须等待窗口 B 中的进程也结束其远程会话:它必须保持控制套接字运行。
我宁愿这样,当我在窗口 A 中断开连接时,我会立即返回到我调用的原始本地会话ssh
,而窗口 B 中的会话继续运行。您可能会问:那么,哪个进程应该管理控制套接字呢?理想情况下,我希望它成为在用户 systemd 实例的监督下运行的专用第三进程,当没有更多会话运行时,它会自动断开连接。但我也接受一种更老套的方法,带有挥之不去的后台进程。
我宁愿避免手动启动控制套接字主机。当我打开第一个会话时,它应该会自动启动。
这可以吗?
答案1
诸如以下的命令
ssh -f -N remote_host
将创建ssh
到远程主机的会话,但不运行命令 ( -N
) 和后台本身 ( -f
)。该命令可以作为主控使用。
如果你想通过隧道传输 X 这样的东西,那么也可以通过这个命令来完成
ssh -X -f -N remote_host
如果您发现空闲会话断开连接(例如由于 NAT 超时),则添加类似内容
-o ServerAliveInterval=30
(或config
文件中的同等内容)将尝试保持会话处于活动状态。