2014-07-14 36 views
2

linux的內核級的控制檯/非X終端模擬器包含非常涼爽特徵(如果編譯):每個/dev/ttyN設備與/dev/vcsaN/dev/vcsN裝置其表示TTY的存儲器內(顯示)狀態對應,分別具有和不具有屬性(顏色,閃爍等)。這可以讓您非常容易cat /dev/vcs7,並在發現cat的任何地方查看/dev/tty7的轉儲。
那天我使用了這種令人難以置信的實用功能,通過SSH登錄系統,並遠程觀看我忘記放入screen(或類似的)會話中的dd進程 - 它運行在文本控制檯上,因此我拿了一個微調了我想抓住的角色範圍,目前我正在通過SSH觀看dd的轉移狀態(順便說一句,每秒一次)。如何以編程方式在Linux控制檯中「轉儲」X終端的內容la/dev/vcs {,a}?

要重申和澄清,/dev/vcs{,a}*是檢索當前內存中表示的字符設備,內核控制檯VT100模擬器表示爲單個「文本行」(每行「結束時沒有」換行符「 「的屏幕)。
只是爲了消除混淆,我想指出,我不能tail -f這個設備:它不是像TTY本身的字符流。 (但我從來沒有需要這種行爲,因爲它的價值。)

我一直堅持我的耳朵Perk多年來一種方法來轉儲字符單元內存狀態的X終端模擬器 - 或者確實任何需要與ttys一起工作的任意進程,與我在Linux控制檯上可以採用的方式類似。而且......對於這個問題沒有切實可行的解決方案,我感到很驚訝 - 因爲它可以說存在了大約30年--X是在1984年引入的 - 或者說,是迂腐的,在至少 19年 - /dev/vcs{,a}*在內核1.1.94中引入;在該版本中最新的文件的日期是2月22日1995年(最早是從1993年12月1日:P)

我想說,我也明白和意識到TTY本身並不是「屏幕緩衝區「,而是一個字符流,而我上面實際使用的非標準功能是Linux VT102仿真器特有的一種獨特功能。但是,此功能是不夠冷靜(這否則爲什麼在主線樹:d),在我看來,有應該是對方給它的東西,與/dev/pts*工作。

今天下午,我需要屏幕截取交互式ncurses應用程序的輸出,以便我可以從終端中顯示的信息中提取元數據。 (沒有其他實用的方法來實現我所瞄準的目標。)Linux的內核VT100驅動程序將允許這樣的任務很容易地完成非常,我犯了一個錯誤,認爲它,根據這個,它不可能真的難以在X11下做同樣的事情。

到上午9時,我已經決定,最簡單的方法實驗請求遠程屏幕的轉儲將在dtach運行它(認爲「screen -x」沒有任何其他選項),並破解dtach代碼請求屏幕更新並退出。

大約上午11點到12點,我要求屏幕更新並將它們轉儲到stdout

大約下午3:30,我接受了使用dtach是不可能的:

  • 首先,它依賴於應用本身發送屏幕重繪上的要求,通過設計,保持代碼的簡單。這很棒,但是,幸運的是,我使用的應用程序不支持全屏重繪 - 它只會重畫屏幕大小的變化(並且只有在屏幕大小完全不同的情況下!)。
  • 運行screen會話內的程序(因爲screen是一個真正的終端仿真器和具有內部2D字符單元緩衝液),然後運行screen -x內部dtach,也神祕未能產生字符單元的更新。

我以前檢查過screen,發現代碼足夠瘋了,以消除我可能必須破解的任何傾向;我只能說,瘋狂可能是screen還沒有我在這裏介紹的能力(這可能會很容易實現)的原因之一。

其他類似這個問題的問題經常得到使用打字稿的答案,或script;我只是想澄清script保存tty本身的流到一個文件,我需要通過一個VT100模擬器來獲取屏幕圖像的當前狀態的問題。換句話說,script對我的問題是一個非常瘋狂的解決方案。

回答

0

我並不認爲這是可以接受的,因爲它沒有解決實際的核心問題(這已經有很多年了),但是我能夠實現我設定的具體目標。

我的具體要求是我想要屏蔽ncdu交互式磁盤使用瀏覽器的輸出,所以我可以簡單地在另一個終端上按Enter(或者執行一些類似的簡單順序)以添加當前突出顯示的目錄/在ncdu中選擇一個我想要使用的文件的文件列表。
我的目標是不必爲無盡的複製粘貼和/或重新鍵入目錄名稱而分心(可能不會有一些不準確的情況引導),所以我可以專注於我想要選擇的目錄。 (默認)CTRL + A,CTRL + L。我將dtach的副本擴展爲除了將遠程屏幕轉儲到標準輸出外還能夠發送擊鍵,並將dtach包裝在一個腳本中,該腳本將內部dtach內的刷新序列(\001\014)發送到screen -x。這工作完美,檢索完整的屏幕更新沒有任何閃爍。

但是,我會警告任何有興趣嘗試這種技術的人,你需要完善隱藏VT100轉義序列的藝術。我使用了正則表達式,因此我沒有編寫數千行代碼;下面是提煉出來的,我需要兩條信息的腳本的特定部分:

sh -c "(sleep 0.1; dtach -k qq $'\001\014') &"; path="$(dtach -d qq -t 130000 | sed -n $'/^\033\[7m.*\/\.\./q;/---.*$/{s/.*--- //;s/ -\+.*//;h};/^\033\[7m/{s/.\033.*//g;s/\r.*//g;s/ *$//g;s/^\033\[7m *[^ ]\+ \[[# ]*\] *\(\/*\)\(.*\)$/\/\\2\\1/;p;g;p;q}' | sed 'N;s/\(.*\)\n\(.*\)/\2\1/')"

由於截圖涼爽,幫助人們想象的事情,下面就來看看它是如何工作的時候,它的運行:

Screenshot of ncdu-scrape

顯示在ncdu-scrape窗口底部的倒置文件正在從ncdu窗口本身屏幕刮取;列表中的四個文件在那裏,因爲我使用ncdu中的箭頭鍵選擇了它們,將鼠標移到了ncdu-scrape窗口(我使用focus-follow-mouse),然後按Enter鍵。該文件添加到列表(一個簡單的文本文件本身)。

說了這話之後,我想澄清一下,上面的正則表達式不是一個可以運行的代碼示例;它是,而是一個警告:對於任何超出難以置信的瑣碎!!)內容提取,如這裏提出的內容,你基本上進入相同的領土作爲大公司/利益誰想要從VT100轉換基於系統的系統更加現代化,他們不得不花費數千年的時間來調試大型翻譯框架,這些翻譯框架可以進行上述特別大規模的轉換。

讚賞解決方案。

相關問題