![有没有办法在不阻止本地 TTY 会话的情况下建立机会共享的 SSH 连接?](https://linux22.com/image/13896/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E5%9C%A8%E4%B8%8D%E9%98%BB%E6%AD%A2%E6%9C%AC%E5%9C%B0%20TTY%20%E4%BC%9A%E8%AF%9D%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E5%BB%BA%E7%AB%8B%E6%9C%BA%E4%BC%9A%E5%85%B1%E4%BA%AB%E7%9A%84%20SSH%20%E8%BF%9E%E6%8E%A5%EF%BC%9F.png)
在我的 中~/.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
文件中的同等内容)将尝试保持会话处于活动状态。