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


17

因此,假设您一直将Linux安装引导到桌面。您可以启动gnome-terminal / konsole /任何设备,以便有tty输入命令。

现在,假设我通过SSH进入同一台计算机。它将把我绑定到另一个tty上,以输入命令。

现在让我们说我想将我的tty从我的原始SSH“切换”到更早启动的gnome终端。

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

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

有任何想法吗?



Answers:


16

也许这些架构可以澄清这种情况。这是通常的设置:

                               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, …)

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

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

屏幕(和其他屏幕)的作用是分配一些伪终端设备(如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)

使用,screen -x您可以将另一个终端xterm附加Terminal 3到屏幕会话上。

因此,不能,您无法通过stdin / stdout与连接到另一个终端的进程直接通信。如果它恰好是伪终端,并且确信该过程确实是这样做的,则只能通过控制此终端的过程来做到这一点(如屏幕所示)。


这是一个很好的解释!我认为这并不是一个真正的答案,但很适合这个问题。一种观察:只有在你禁止的情况下ptrace,“没有办法”才是正确的。感谢ptrace,程序一样neercsretty等有时可以做到这一点。
吉尔(Gilles)'所以

@Gilles:好他们做别的事情:他们改变文件描述符的值(stdinstdout直接被劫持过程中对架构的右侧)。纯粹的邪恶!
斯蒂芬·吉梅内斯

1
嗯,你是对的,他们改变了另一个箭头。邪恶,但是方便!
吉尔(Gilles)“所以,别再邪恶了”,

8

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

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

简单的答案是,如果要从其他位置重新连接到终端,请使用screentmux

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.