如何连接到另一个终端的一个终端的输出?


44

我需要从虚拟终端连接到当前正在运行的终端(tty1)的输出并捕获它(正在运行X服务器)。


5
虽然我了解到有时有时需要在命令运行后捕获另一tty上的内容,但采取一盎司预防措施是值得的,所以始终考虑开始使用screentmux在启动可能要从另一个终端访问的命令之前。
2013年

而且,当您可以事先准备好它时,也许tmate也将是一个不错的候选人,甚至可以在Internet上工作,而不仅仅是本地工作。(并且具有可选的写访问权限)
地毯

Answers:


23

我遇到了一个名为的工具ttylog。这是对现有CPAN Perl程序在这里。它有两个警告,一个是我只能弄清楚如何附加到一个终端,这个终端是作为某人插入我的盒子的一部分而创建的。另一个是您必须以提升的特权(即root或sudo)运行它。

但这有效!

例如

首先在TERM#1中将ssh放入您的机器中:

TERM#1% ssh saml@grinchy

注意此新终端的tty:

TERM#1% tty
/dev/pts/3

现在在另一个终端(TERM#2)中运行以下命令:

TERM#2% ttylog pts/3
DEBUG: Scanning for psuedo terminal pts/3
DEBUG: Psuedo terminal [pts/3] found.
DEBUG: Found parent sshd pid [13789] for user [saml]

现在回到TERM#1并输入内容,它将显示在TERM#2中。

终端SS

我尝试过的所有命令(top,ls等)都可以正常使用,而不会发生意外ttylog


正是我一直在寻找的东西(我过去曾经使用过它,但是忘记了名称并且无法记住)。非常感谢,我暂时使用了dirty选项(gdb和输出复制)。
pruzinat

是的,这gdb是我遇到的第一个选择,过去我自己使用过它,但至少对我来说这是很棘手的。很高兴这帮助了您!
slm

1
ttylog似乎无法连接到正确的过程,但-谁能回答我的问题:serverfault.com/questions/560972/...
LittleBobbyTables

21

的确是。/ dev / vcs *和/ dev / vcsa *设备对应于/ dev / tty *设备(虚拟终端)。F1 = tty1 = vcs1 / vcsa1,依此类推。对于“当前”虚拟终端,vcs / vcsa就像tty一样。

作为root用户,您可以为这些设备(例如cat / dev / vcs2)提供服务,并像拍摄快照一样查看相应VT(例如F2上的/ dev / tty2)上的内容。vcsa *与vcs *的不同之处在于,它们包含有关终端(屏幕)尺寸的信息。请注意,这只是屏幕上显示的字符的原始快照-从分配给终端的内存中收集的-因此不要指望有一个不错的,容易解析的输出。

缺点是,如果信息闪烁过快,则可能难以捕获。如果您需要遵循几个screenfull(可能自己没有尝试过),也许tail -f / dev / vcs1可以工作吗?首先简单地将其重定向到文件可能是最简单的。使用VT(F1-F6)进行查看也是一个好主意,因为端子将具有相同的尺寸。以我的经验,最好使用vcs *-而不是vcsa *-设备。

如果这样不起作用,也许允许管理员关注终端上的活动的“大兄弟”软件包之一可能会起作用。

PS:我忘了问您使用什么操作系统。这是针对Linux的,尽管其他操作系统上也可能存在类似的设备。尝试在设备的手册页中搜索“虚拟控制台内存”。


有什么办法可以将输入从ssh注入tty1吗?例如,我需要使用运行Debian的树莓派,但问题是它只有一个USB端口,它被wifi适配器占用,因此我无法实际连接键盘来使用tty1。因为我需要运行一个脚本,该脚本在执行过程中会关闭wlan0,所以实际上我遇到了catch 22的情况,试图调试该脚本失败的地方。假设我无法使用USB集线器...是否可以通过某种方式将字符通过管道传输到/ dev / tty1?
史蒂文·卢

2
好。我可以将内容/dev/tty1作为根发送,但是所有要做的就是在屏幕上显示字符,而不是输入字符
Steven Lu

1
抱歉,这只是噪音。并不是100%相关。但是,我在回答上面的评论我的问题
史蒂芬路

18

看着:

man 1 script

例如:

script -f /dev/tty1

我一直在寻找。试图依附screen失败很惨。有用。
sdkks

5

tty在每个终端中使用命令来标识它们:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

假设这些TTY,要将第一个的stdout重定向到第二个,在第一个终端中运行:

exec 1>/dev/pts/1

注意:现在每个命令输出将在pts / 1上显示

恢复默认行为标准输出pts / 0:

exec 1>/dev/pts/0

观看此视频进行演示。


2

这为我工作:

  • 使用计算机“ A”(即要控制的物理计算机)上的键盘,运行: screen -q

  • 连接与ssh来自计算机“B”到计算机“A”。

  • 在ssh会话中,键入:screen -ls以获取要连接的会话ID(包含tty的行上的4位数字)。

  • screen -x <session id>使用以下screen -ls命令连接到上述会话:...使用从上面的命令收到的会话ID号。

在“会话”中键入的任何内容都会在两个“会话”中发生,因此例如键入screen -d将退出两个会话。


1

另一种方法是screen在本地计算机上使用gnu 实用程序。使用-L选项调用它,或者不使用该选项开始使用^aH命令序列。两种方法都将所有输入和输出记录到一个文件中screenlog.x,其中x是屏幕编号。

这很方便,因为不需要在远程计算机上安装任何额外的东西。


1

由于我没有使用屏幕启动tty1,因此该脚本有所帮助:

我使用了上面的Baard Kopperud的答案。“ 128”是我的tty1的1行。可以将睡眠设置为适当的数字。

#!/bin/bash
while true
do
    sudo tail -c 128 /dev/vcs1 && echo ""
    sleep 10
done

我在终止符中使用了它并调整了列的大小,因此滚动是一行文本。


谢谢这个主意,在树莓派上,我只需要执行'''watch cat / dev / vcs'''要观看一个进程,我在虚拟控制台上开始,却忘记了使用“屏幕”。我刚刚调整了我的gnome终端,我将其设置为80个字符宽。
axkibe

0

打开两个端子。键入tty每个,您将获得它的ID/dev/pts/nº

然后在第一个中键入script -f /dev/pts/nºofSecondTerminal,在第二个中执行相反的操作,script -f /dev/pts/nºofFirstTerminal以便它们被链接

恭喜!两个终端输出和接收相同的东西。需要三分之一吗?好吧,你研究过组合吗?您将需要6个script -f命令。甚至更多的tty?等等...

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.