“我该怎么做?”;“倾倒”;X终端的内容在Linux控制台中以编程方式显示为la/dev/vcs{,a}?
Linux的内核级控制台/非X终端仿真器包含一个非常酷的特性(如果在中编译):每个“我该怎么做?”;“倾倒”;X终端的内容在Linux控制台中以编程方式显示为la/dev/vcs{,a}?,linux,terminal,console,screen-scraping,gnu-screen,Linux,Terminal,Console,Screen Scraping,Gnu Screen,Linux的内核级控制台/非X终端仿真器包含一个非常酷的特性(如果在中编译):每个/dev/ttyN设备分别对应于/dev/vcsaN和/dev/vcsN设备,它们分别表示该tty的内存(显示)状态,带有和不带属性(颜色、闪烁等)。这使您可以非常轻松地cat/dev/vcs7,并在启动cat的任何位置查看/dev/tty7的转储前几天,我使用这种难以置信的实用功能,通过SSH登录到一个系统,远程观看一个dd进程,我忘了把它放在屏幕(或类似)会话中-它是在一个文本控制台上运行的,所以我花了一些时间
/dev/ttyN
设备分别对应于/dev/vcsaN
和/dev/vcsN
设备,它们分别表示该tty的内存(显示)状态,带有和不带属性(颜色、闪烁等)。这使您可以非常轻松地cat/dev/vcs7
,并在启动cat
的任何位置查看/dev/tty7
的转储前几天,我使用这种难以置信的实用功能,通过SSH登录到一个系统,远程观看一个
dd
进程,我忘了把它放在屏幕
(或类似)会话中-它是在一个文本控制台上运行的,所以我花了一些时间来微调我想要抓取的字符范围,目前,我正在通过SSH观看dd
的传输状态(顺便说一句,每秒一次)
为了重申和澄清,/dev/vcs{,a}*
是从内核控制台VT100 emulator中检索当前内存表示的字符设备,表示为单个文本“行”(屏幕的每个“行”末尾没有“换行符”)为了消除混淆,我想指出,我不能
tail-f
这个设备:它不像TTY本身那样是一个字符流。(但不管怎样,我从来都不需要这种行为。)
多年来,我一直在为一种转储X终端仿真器的字符单元内存状态的方法——或者任何需要使用ttys的任意进程——以某种类似于Linux控制台的方式——而侧耳倾听。而且。。。我相当惊讶的是,这个问题没有实际的解决方案——因为它已经存在了大约30年——X是在1984年引入的——或者说,学究式的,至少有19年了——/dev/vcs{,a}*
是在内核1.1.94中引入的;该版本中的最新文件日期为1995年2月22日。(最早的是1993年12月1日:P)
我想说的是,我确实理解并意识到tty本身并不是一个“屏幕缓冲区”,而是一个字符流,而我在上面基本上利用的非标准特性是Linux VT102模拟器特有的一种奇特功能。然而,这个特性很酷(为什么它会出现在主线树中?:D),在我看来,对于使用/dev/pts*
的东西,应该与之对应
今天下午,我需要对一个交互式ncurses应用程序的输出进行屏幕截取,以便从终端中显示的信息中提取元数据。(没有其他切实可行的方法来实现我的目标。)Linux的内核VT100驱动程序将允许非常轻松地完成这样一项任务,我错误地认为,鉴于此,在X11下完成同样的任务并不那么困难
到了早上9点,我决定实验性地请求远程屏幕转储的最简单方法是运行它(想想“screen-x
”,不带任何其他选项),然后破解dtach
代码请求屏幕更新并退出
大约上午11点到下午12点,我请求屏幕更新并将其转储到标准输出
下午3:30左右,我承认使用dtach
是不可能的:
- 首先,它依靠应用程序本身发送屏幕重画请求,通过设计,保持代码简单。这很好,但是,幸运的是,我使用的应用程序不支持全屏幕重新绘制-它只会在屏幕大小改变时重新绘制(并且只有在屏幕大小确实不同的情况下!)
- 在
会话中运行程序(因为screen
是真正的终端仿真器,并且具有内部2D字符单元缓冲区),然后在screen
中运行dtach
,也无法生成字符单元更新screen-x
屏幕
,发现该代码非常疯狂,足以消除我可能不得不破解的任何倾向;我所能说的是,所说的精神错乱可能是screen
没有我在这里介绍的功能的原因之一(可以说这很容易实现)
与此类似的其他问题经常通过使用typescript或
script
得到答案;我只是想澄清一下,script
将tty本身的流保存到一个文件中,我需要通过VT100仿真器来获取有关tty当前状态的屏幕图像。换句话说,script
对我的问题来说是一个非常疯狂的解决方案。我不认为这是可以接受的,因为它不能解决实际的核心问题(这已经有很多年了),但我能够实现我设定的具体目标
我的具体要求是,我想对交互式磁盘使用浏览器的输出进行屏幕截取,这样我就可以在另一个终端中简单地按Enter键(或执行一些类似的、简单的序列)将当前在ncdu
中突出显示/选择的目录添加到我想要处理的文件列表中。我的目标是不必用无休止的复制+粘贴和/或重新键入目录名(可能会有不少不准确的引导)来分散我的注意力,因此我可以专注于我想要选择的目录
screen
有一个刷新功能,可以通过按(默认)CTRL+a、CTRL+L来访问。我扩展了我的dtach
副本,除了可以将远程屏幕转储到stdout之外,还可以发送击键,并将dtach
包装在发送刷新序列的脚本中(\001\014
)到屏幕-x
内部运行