假设您将 Linux 安装一直启动到桌面。你启动一个 gnome-terminal/konsole/无论什么,这样你就有一个 tty 来输入命令。
现在假设我通过 SSH 连接到同一台机器。它将我绑定到另一个 tty 以输入命令。
现在假设我想将我的 tty 从原来的 SSH 终端“切换”到之前启动的 gnome-terminal 终端。
基本上我问是否有任何方法可以做同样的事情screen -x
但没有屏幕?
我知道您只需将某些内容回显到 /dev 文件中就可以轻松地将输出发送到另一个 tty,但我不知道如何“查看”tty 中的内容。
有任何想法吗?
答案1
也许这些模式可以澄清情况。这是通常的设置:
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)
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)
使用screen -x
您可以将另一个终端 xterm 等附加Terminal 3
到屏幕会话。
所以不,您不能通过 stdin/stdout 直接与附加到不同终端的进程进行通信。您只能通过控制该终端的进程来执行此操作,前提是它恰好是伪终端,并且该进程被设计为这样做(就像 screen 一样)。
答案2
如果没有肮脏的技巧,就不可能将另一个终端上的进程重新连接到当前终端。可以通过强制进程执行某些系统调用(使用ptrace
);这会导致某些程序崩溃。有多种工具可以执行此操作,例如neercs
、retty
、cryopid
、reptyr
、 ...;看我怎样才能否认它是一个正在运行的进程并将其关联到一个新的屏幕外壳?以及相关问题。
获取已在另一个终端上显示的输出是一个不同的问题。没有完全通用的解决方案:原则上,一旦渲染输出,终端可能仅将其存储为图像。实际上,所有 X 终端模拟器都将其输出缓冲区保留为文本形式,以便您可以复制粘贴它。获取该输出的方式取决于终端模拟器;基本思想是模拟选择整个回滚缓冲区。对于 Linux 控制台(例如 )/dev/tty1
,回滚缓冲区可以轻松使用/dev/vcs1
(并且/dev/vcsa1
具有文本属性)。
简单的答案是,如果您想从不同的地方重新连接到终端,请使用screen
或tmux
。