強制輸出到輸入(緩衝區),如腳本中的“\033[6n”

強制輸出到輸入(緩衝區),如腳本中的“\033[6n”

我嘗試過使用管道和重定向來讓(C 程式或腳本)輸出最終出現在輸入緩衝區上,printf "\033[6n"但沒有得到積極的結果。

有人知道這是怎麼可能的:

  1. 命令列
  2. 在 shell 腳本中
  3. C程式碼

管道輸出_cmd_ > /dev/stdin和 C 代碼fprintf(stdin, "blah\n");沒有可測量的影響。

筆記:我不想將輸入“通過管道”輸出到另一個命令,我想將字元“注入”到“鍵盤緩衝區”(事實上)。

編輯:最初的用例是一個沙盒 cli 應用程序,允許shellsystem外部命令與作業系統(例如Bas)交互,但是不是處理文件描述符。

答案1

編輯:簡短的回答曾是 /dev/uinput,現在是TIOCSTI(見帖子末尾)


這是迄今為止的答案,並針對評論:

ioctl_tty(2)TIOCSTI我沒有,但是在內核原始碼上尋找(透過自由電子)將顯示tiocsti“假輸入字元”,它使用上下文tty_struct

相關應用程式始終以互動方式運行,因此無法使用管道和重定向。它可以shell用於編寫腳本,但是,與許多其他類似的應用程式不同,它不會也不允許捕獲結果,只允許stdin&stdout按照正常方式執行操作。

在可預見的未來,沒有機會改變這一點,這不是我的申請。但是,我能夠剪切 的結果"\033[6n",這些結果已由內核通過tty_insert_flip_char& tty_schedule_flipin注入到鍵盤緩衝區中src/drivers/tty/tty_buffer.c,它使用tty_port上下文。

如果沒記錯的話,在 FD 檔案結構改變之前,當有僅有的4個檔案描述符,也許可以實現這一點。如今,雖然您可以寫入/dev/stdin/proc/self/fd/0,但它們已連接到/dev/tty#TTY 設備,寫入到 TTY 設備的任何內容最終都會顯示在螢幕上 ( /dev/stdout)。使用 TTY 時,核心似乎繞過了檔案描述符路由,請注意這些flip函數將其稱為港口

任何用戶態應用程式都無法存取這些核心函數中的任何一個。在 X-Windows 下,可以使用xvkbdxdotoolxte,但此應用程式正在 linux (VT) 控制台上使用。


(幾乎)真實的答案:

儘管/dev/uinput沒有使用者權限(在大多數系統上),但所有參數都將起作用sudo的腳本printf

或者,鍵盤事件也將工作,因為所有用戶都可以訪問它,但它每次啟動和每個系統都會改變(我的通常是/dev/input/event0,但並非總是如此)。

經過進一步研究,這些方法都不實用,尤其是腳本編寫。我們需要了解需要做什麼,我們只是想呈現文字在輸入緩衝區上,而不是「模擬按鍵」(這是上述裝置的工作方式)。


(最實用的)真實答案:

一個場外問題引用了 stackexchange 上的答案,從 2011 年開始(這裡)。它用TIOCSTI。再次查看 Perl 範例後,它對於不提供應用程式的腳本編寫也可能很實用。

perl -le 'require "sys/ioctl.ph";
      ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV
     ' `_cmds_`

然而,它也將其回顯到螢幕上。經過幾個小時的進一步研究和實驗,以下內容在腳本或命令列中是實用的:

stty -echo; perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV ' `_cmds_` ;stty echo

筆記:雖然TIOCSTI被撤銷於OpenBSD 6.2(2017 年 10 月),顯然 Linux 核心開發人員屬於對面的請記住,斷然拒絕撤銷它(您可以在OpenBSD 期刊)。

答案2

從 Debian Bullseye 開始,console-tools被吸收到kbd其中的writevt不是包括。如果您需要,可以在本文末尾的更新中連結來源。


writevt /dev/tty# text,至少在 Linux 上,也許是 BSD 和 Unix,它目前是軟體包的一部分console-tools。使用者必須擁有VT 的權限。具體來說,(編輯:如果它在您的作業系統上可用)OP的完整且正確的答案是:

writevt `tty` "`_cmds_`"

這個問題顯示 StackExchange 社群作為一個整體缺乏對基礎作業系統的深入了解。writevt非常古老,它是 99%(編輯:Debian Linux)系統上安裝的基本命令。直到 2002 年 6 月,Debian 中還沒有它的手冊頁或維護者,這也許可以解釋為什麼很多人不知道它,儘管那是 15 年前的事了。然而,即使在 Kali Linux(它有一切)它通常不會列在下面可用的 命令,儘管它從一開始就存在。


從 Debian Buster 開始,預設writevt不再安裝,根據某些人的說法,甚至可能不再存在於任何軟體包中(由於缺少維護者?或軟體包發生變化console-tools?)

更新:如果事實上我無法再console-tools在 debian 軟體包搜尋中找到(我最初驗證了內容),甚至無法向後移植。

原始包項目在這裡:

http://lct.sourceforge.net/

不需要補丁。 Raspbian/RPiOS 具有 debian 版本(Wheezy 到 Buster):

http://raspbian.raspberrypi.org/raspbian/pool/main/c/console-tools/

引用 Yan Dirson 的話:

目前(公共)軟體專案 我參與 Debian GNU/Linux 項目,自 1997 年以來我一直是該專案的成員。

http://ydirson.free.fr/en/software/

等待kbd吸收 - 2001

console-tools「Linux Console Tools」專案中的軟體包在 RPiOS 中仍然可用。它與linuxconsoletools「Linux Console Project」專案中的套件不同,該專案也在 SourceForge 上。

相關內容