如何在不使用屏幕的情况下在 ttys 之间切换?

use*_*244 18 gnu-screen terminal-multiplexer terminal

因此,假设您将 Linux 安装一直引导到桌面。你启动了一个 gnome-terminal/konsole/whatever,所以你有一个 tty 来输入命令。

现在假设我通过 SSH 连接到同一台机器。它会将我绑定到另一个 tty 以输入命令。

现在假设我想将我的 tty 从我原来的 SSH 一个“切换”到更早开始的 gnome-terminal 一个。

基本上我在问是否有任何方法可以做同样的事情screen -x但没有屏幕?

我知道您可以通过将某些内容回显到 /dev 文件中来轻松地将输出发送到另一个 tty,但我不知道如何“查看”tty 中的内容。

有任何想法吗?

Sté*_*nez 17

也许这些模式可以澄清情况。这是通常的设置:

                               Terminal  (/dev/ttyX or /dev/pts/x)
                                device
                                   |
                    (screen)<--[<output]----x-------(stdout) Process1
        Terminal  (keyboard)---[input >]---o-\----->(stdin)
                                            \ \
(hardware console or                         \ `----(stdout) Process2
 virtual console or terminal                  `---->(stdin)
 emulators like xterm, …)
Run Code Online (Sandbox Code Playgroud)

并且没有办法Process3像这样插入一些新的:

                             Terminal
                              device
                                 |
             (screen)<---o---[<output]--x------(stdout) Process1
  Terminal (keyboard)---/-x--[input >]-o-\---->(stdin)
                       | /              \ \
                       | |               \ `---(stdout) Process2
                       | |                `--->(stdin)
                       | |
                       \ `---------------------(stdout) Process3
                        `--------------------->(stdin)
Run Code Online (Sandbox Code Playgroud)

screen(和其他)所做的是分配一些伪终端设备(如 xterm 所做的)并将其重定向到一个或多个“真实”终端(物理、虚拟或模拟):

             Terminal                   pseudo
             devices              ,--> Terminal (/dev/pts/x)
                |         _______/      device
Terminal <--[<output]--- |       |        |
 1       ---[input >]--> |screen | <--[<output]---x-----(stdout) Process1
                         |Process| ---[input >]--o-\--->(stdin)
Terminal <--[<output]--- |       |                \ \
 2       ---[input >]--> |_______|                 \ `--(stdout) Process2
                                                    `-->(stdin)
Run Code Online (Sandbox Code Playgroud)

使用screen -x您可以将另外一个终端 xterm 附加Terminal 3到屏幕会话中(例如)。

所以不,您不能直接通过 stdin/stdout 与连接到不同终端的进程进行通信。如果它恰好是一个伪终端,并且这个进程被认为这样做(就像 screen 一样),你只能通过控制这个终端的进程来这样做。


Gil*_*il' 9

没有肮脏的技巧,就不可能将另一个终端上的进程重新连接到您当前的终端。可以通过强制进程执行某些系统调用(使用ptrace);这会导致一些程序崩溃。有几种工具可以做到这一点,例如neercs, retty, cryopid, reptyr, ...; 请参阅如何将其否认为正在运行的进程并将其关联到新的屏幕外壳?和相关问题。

获取已经显示在另一个终端上的输出是一个不同的问题。没有完全通用的解决方案:原则上,一旦输出被渲染,终端可能只将其存储为图像。实际上,所有 X 终端仿真器都以文本形式保存它们的输出缓冲区,以便您可以复制粘贴它。获取该输出的方式取决于终端模拟器;基本思想是模拟选择整个回滚缓冲区。对于 Linux 控制台,例如/dev/tty1,回滚缓冲区很容易获得/dev/vcs1(并/dev/vcsa1带有文本属性)。

简单的答案是,如果您想从不同的地方重新连接到终端,请使用screentmux