Shell-Script

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

  • December 5, 2017

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

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

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

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

**注意:**我不想將輸入“管道”到另一個命令,我想將字元“注入”到“鍵盤緩衝區”(就像它一樣)。

writevt /dev/tty# text,至少在 Linux 上,也許是 BSD 和 Unix,它目前是console-tools軟體包的一部分。使用者必須具有VT 的寫入權限。具體來說,對 OP 的完整和正確答案是:

writevt `tty` "`_cmds_`"

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

**編輯:**簡短的回答 /dev/uinput,現在是TIOCSTI(見文章結尾)


這是迄今為止的答案,並解決評論:

man ioctl_tty我沒有,但是TIOCSTI對核心原始碼的查找(通過FreeElectrons)將顯示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/stdinor /proc/self/fd/0,但它們已連接到/dev/tty#,寫入 TTY 設備的任何內容最終都會顯示在螢幕上 ( /dev/stdout)。核心在使用 TTY 時似乎繞過了文件描述符路由,請注意flip函式將其稱為port

任何使用者態應用程序都無法訪問這些核心函式中的任何一個。在 X-Windows 下可以使用xvkbdandxdotoolxte,但這個應用程序正在 linux (VT) 控制台上使用。


(幾乎)真實的答案:

雖然/dev/uinput沒有使用者權限(在大多數係統上),但所有參數都可以sudo使用的腳本。printf

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

經過進一步研究,這些方法都不是實用的,尤其是對於腳本。關於需要做什麼,我們需要了解的是,我們只想在輸入緩衝區上呈現文本,而不是“模擬按鍵”(這是上述設備的工作方式)。


(最實用的)真實答案:

從 2011 年開始,一個場外問題提到了 stackexchange 上的一個答案(此處)。它使用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目前在 BSD(2017 年 11 月)中已被撤銷,但顯然 Linux Kernel 開發人員持相反意見,斷然拒絕撤銷它

引用自:https://unix.stackexchange.com/questions/406690