管道連接到另一個終端過 程的標準輸入的危險
出於惡意,我打開了 2 個終端,每個終端都執行 bash shell。在第一個我輸入:
$ echo $$ 11458
在第二個:
$ echo -n "echo this command" >> /proc/11458/fd/0
然後這個文本
echo this command
確實通過管道傳送到第一個終端上的提示符。但是在第一個終端中輸入時,該文本不會作為命令執行,我只是得到一個新的提示。在第二次嘗試中,我在第一個終端中執行了這個命令:
$ read line;echo $line
在讀取等待輸入時,我再次
/proc/11458/fd/0
在第二個終端中回顯一些文本。該文本確實出現在第一個終端上,但是在按下<enter>
第一個終端時,read
終止,並且echo $line
顯示沒有讀取任何輸入。所以我仍然沒有找到傷害的方法;我所能做的就是從第二個終端修改第一個終端上的文本。當然,第一個終端上的螢幕閱讀器一定要選擇它。通過螢幕閱讀器,我正在考慮滑鼠選擇或終端功能,例如
Save Contents ...
;我都試過了。但是,如果我還知道如何將文件結尾或其他控製字元回顯到第一個終端的
stdin
,我難道不會把第一個終端中的程序搞得一團糟嗎?
這可能是一個簡單的解釋:
如果終端程序寫入終端(
stdin
、stdout
和stderr
都指向同一個設備/pty),則此輸出不會成為其下一個輸入。明顯地。迴聲富
與打字的效果不同
f``o``o``enter
。那麼為什麼寫入終端的不同程序會變成另一個程序終端輸入呢?沒有任何意義。
與文件相比,使用(偽)終端寫入和讀取的數據不相關,因為數據源是完全不同的東西(鍵盤或程序)。見
man 7 pty
。偽終端具有由終端應用程序使用的客戶端和生成客戶端輸入的主控端。我的終端模擬器是 konsole (PID 40818),目前只執行一個 shell/終端:
start cmd:> ll /proc/40818/fd insgesamt 0 lr-x------ 1 hl hauke 64 27. Nov 15:06 0 -> 'pipe:[1177680901]' lrwx------ 1 hl hauke 64 27. Nov 15:06 1 -> 'socket:[89302]' lrwx------ 1 hl hauke 64 27. Nov 15:06 10 -> /dev/dri/renderD128 lrwx------ 1 hl hauke 64 27. Nov 15:06 11 -> /dev/dri/renderD128 lrwx------ 1 hl hauke 64 27. Nov 15:06 12 -> /dev/dri/renderD128 lrwx------ 1 hl hauke 64 27. Nov 15:06 13 -> /dev/dri/renderD128 lrwx------ 1 hl hauke 64 27. Nov 15:06 18 -> /dev/ptmx lrwx------ 1 hl hauke 64 27. Nov 15:06 19 -> /dev/pts/40 lrwx------ 1 hl hauke 64 27. Nov 15:06 2 -> 'socket:[89302]' l-wx------ 1 hl hauke 64 27. Nov 15:06 21 -> 'pipe:[1177664260]' lr-x------ 1 hl hauke 64 27. Nov 15:06 28 -> 'pipe:[1177664264]' l-wx------ 1 hl hauke 64 27. Nov 15:06 29 -> 'pipe:[1177664264]' lrwx------ 1 hl hauke 64 27. Nov 15:06 3 -> 'socket:[1177673938]' lrwx------ 1 hl hauke 64 27. Nov 15:06 4 -> 'anon_inode:[eventfd]' lrwx------ 1 hl hauke 64 27. Nov 15:06 5 -> 'anon_inode:[eventfd]' lrwx------ 1 hl hauke 64 27. Nov 15:06 6 -> 'socket:[1177650969]' lrwx------ 1 hl hauke 64 27. Nov 15:06 7 -> 'anon_inode:[eventfd]' lrwx------ 1 hl hauke 64 27. Nov 15:06 8 -> 'socket:[1177677086]' lrwx------ 1 hl hauke 64 27. Nov 15:06 9 -> 'socket:[1177677087]' ec:0 15:06:36 hl@monster:~ start cmd:> tty /dev/pts/40
您可以看到,shell 使用
/dev/pts/40
但終端仿真器寫入/dev/ptmx
. 只有終端模擬器的文件描述符18
可以寫入 /dev/pts/40 的輸入。如果打開了一個不同的程序,/dev/ptmx
那麼它會創建一個新的偽終端來寫入。
第 1 部分 - 這是否回答了您的問題?寫入程序的標準輸入
第 2 部分 - 您可以寫入(和讀取)屬於您擁有的任何程序的終端。但是標準的 UNIX 權限會阻止您寫入(或讀取)與不同使用者登錄相關聯的任何設備。
ls -l /proc/$$/fd/0 lrwx------ 1 roaima roaima 64 Nov 27 13:19 /proc/7859/fd/0 -> /dev/pts/0 ls -lL /proc/$$/fd/0 crw--w---- 1 roaima tty 136, 0 Nov 27 13:24 /proc/7859/fd/0
我可以寫這個設備:
( tput smso; echo 'surprise!' ) >/dev/pts/0