经典故事是这样的:
我有一个带有多个选项卡/屏幕的终端仿真器。在每个选项卡中,我启动与远程服务器的 SSH 会话。我在这些会话中启动可能长时间运行的交互式作业。与远程服务器的连接中断,受影响的选项卡现在显示本地 shell,我通过启动新的 SSH 会话重新连接到服务器,发现服务器上的交互式作业已停止。
现在,对此的规范答案是:使用screen
或tmux
。除了“保存”您的会话之外,还有多个选项卡等功能。但是,如果我的本地终端仿真器应用程序已经处于多选项卡环境中,为什么还需要多个选项卡?
问题是:我可以在终端仿真器的选项卡/屏幕内进行持久的远程 SSH 会话,而无需手动启动(或附加到现有会话)screen
或类似操作吗?是否可以在我的每个选项卡中运行 SSH 会话的包装器,以便管理会话的持久性?(就像屏幕对本地 shell 所做的那样)
理想情况下:我在终端仿真器中创建一个新选项卡,启动远程 ssh 会话,执行长时间运行的工作,断开连接,重新连接,选项卡自动重新连接,然后我看到我的工作继续进行。就像这样,byobu
但这些选项卡是我的终端仿真器的原生选项卡。
答案1
简短回答:是的...但这取决于
长期不间断地坚持你所理解的内容。
使用附加软件
使用mosh-shell
来自的mosh-server
。
使用兼容的 SSH 客户端,即使网络连接中断,也可以连接到服务器,例如在可中断的 LTE/4G 或不同的 WiFi 上使用手机时。
在 Debian 上的设置非常简单:
apt install mosh-server
使用默认设置将允许兼容的客户端(如 Android 上的 JuiceSSH)使用这些功能。您保持连接或重新连接到同一会话。
原生解决方案
但一般来说,在不中断的情况下,不使用 Screen、tmux、byod 或类似虚拟终端的情况下,您可能希望从问题的当前状态运行隐藏的命令或程序,
ssh [email protected] "command &"
这通常会将命令分离到后台。这样您就可以运行它,而无需保持连接。
如果命令仍在运行,您可能需要使用
[jobs] -l
要再次附加到它,您可能需要使用
[fg]
在默认状态下,您可能需要使用变通方法。Telnet 或 SSH 尚未设计为重新连接到同一会话。
您可能想要使用文件中的功能
/etc/ssh/sshd_config
并添加TCPKeepAlive Yes
您还需要在客户端上使用该文件/etc/ssh/ssh_config
并添加ServerAliveInterval 60
允许发送空数据包并保持连接处于活动状态。这不能防止完全失败,但可以减少断开连接的不活动会话的数量。
正如最后所述:在问题的当前状态下,未知将启动什么命令。因此,我目前只能假设一般解决方案。
答案2
简短回答:不。
尽管你可能花费大量时间来解决各种问题,但却无法获得你想要的结果。
如果您的本地终端支持脚本(终端 - 而不是它访问的 shell)并且您在 expect 中具有相当好的脚本编写能力,那么您可以向 ssh 写入一些内容 / 轮询现有的 tmux/screen 会话 / 打开选项卡以连接到其中的每一个。
答案3
我可能没有正确理解您的要求,但您是否已经知道阿布杜科(1)和dtach(1)?
abduco 提供了一种将给定应用程序与其控制终端断开的方法,因此它提供了与 screen(1)、tmux(1) 或 dtach(1) 大致相同的会话连接/分离支持。
dtach 是一个模拟 screen 分离功能的程序。它被设计为透明和非侵入式的;它避免解释连接的终端和受其控制的程序之间的输入和输出。因此,它最适合与 emacs 等全屏应用程序配合使用。
dtach 适用于那些想要使用 screen 的分离功能而又不想使用 screen 的其他开销的用户。它很小,不使用太多库,并且尽可能不妨碍工作。
dtach 中的会话是程序在 dtach 的控制下运行的单个实例。该程序与原始终端分离,因此可以防止原始终端因某种原因断开连接。
dtach 的其他实例可以将其自身附加到特定会话。输入和输出在 dtach 会话中运行的程序和附加的终端之间复制。