強制輸出到輸入(緩衝區),如腳本中的“033[6n”
我曾嘗試使用管道和重定向使(C 程序或腳本)輸出最終出現在輸入緩衝區
printf "\033[6n"
上,但沒有積極的結果。有誰知道這是怎麼可能的:
- 命令行
- 在 shell 腳本中
- 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_flip
in注入鍵盤緩衝區src/drivers/tty/tty_buffer.c
,它使用tty_port
上下文。如果記憶體服務,在FD文件結構改變之前,當只有4個文件描述符時,可能已經可以做到這一點。如今,儘管您可以寫入
/dev/stdin
or/proc/self/fd/0
,但它們已連接到/dev/tty#
,寫入 TTY 設備的任何內容最終都會顯示在螢幕上 (/dev/stdout
)。核心在使用 TTY 時似乎繞過了文件描述符路由,請注意flip
函式將其稱為port。任何使用者態應用程序都無法訪問這些核心函式中的任何一個。在 X-Windows 下可以使用
xvkbd
andxdotool
或xte
,但這個應用程序正在 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 開發人員持相反意見,斷然拒絕撤銷它