ターミナルエミュレーターの擬似端末のマスター側へのfdで、表示されるものを確認したい場合に監視します。そのマスター fdは、実際の端末に向かうワイヤをシミュレートします。何xterm
それに書き込みすることで、押したキーから生成された文字です。それから読み取るものが表示されます。
たとえば、Linuxの場合:
$ lsof -ac xterm /dev/ptmx
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xterm 15173 chazelas 4u CHR 5,2 0t0 2131 /dev/ptmx
そして、たとえば、実行します:
stty -echo -opost
strace -e read -e read=4 -p15173 2>&1 | stdbuf -o0 sh -c '
grep "^ |" | cut -b11-60 | tr -d " " | xxd -r -p'
もちろん、監視しようとしている端末と同じタイプとサイズの端末で実行するとうまく機能します。サイズは次の方法で取得できます。
stty size < /dev/pts/that-terminal
これは、端末のマスター側から読み取られたものをダンプするxterm
ため、echo
入力されているもののローカルを含む、そこに表示されるものです。
-e read=4
上記のためにあるstrace
もののhexdumpが出力にxterm
そのFD 4.コマンドの残りの部分に読み込むには、実際の文字にそれを変換することです。私は試しましたpeekfd -n -8 15173 4
が、何らかの理由で書かれていたものだけを与えました。
私たちは、使用している-opost
ことはすべてのため、私たちは、端末の監視に任意の後処理を無効にするために、xxd
私たちの監視がそうすることを、スレーブ側への書き込みは、私たちのマスター側にそれがそのままになりxterm
1を監視対象と同じものを取得します。-echo
監視対象端末のアプリケーションが、端末からの応答を要求するエスケープシーケンス(カーソル位置、端末タイプ、またはウィンドウタイトルを要求するものなど)を送信すると、監視xterm
とxterm
意志への道が開かれます返信も。局所的なエコーは必要ありません。
また、トレースすることでタイプされているものを監視することができるwrite
(置き換え、同じFDにシステムコールをread
してwrite
上記)。を押すEnterと、ターミナルエミュレータはLFではなくCR文字を送信することに注意してください。また、マスター側でトレースしているため、ユーザーa<Backspace>b
がを入力すると、端末デバイスが標準モードであっても3つのキーストロークがすべて表示されます。
なぜ機能しないのか:
tee /dev/pts/user_pts </dev/pts/user_pts
端末デバイスからの読み取りはユーザー入力を読み取り、書き込みはユーザーへの表示です。
tee
端末デバイスから読み取るように指示しています。だから何それは読み込み(ユーザー入力)ができなくなりread
、端末内のアプリケーション(複数可)を実行して(その逆とVIS、tee
それはapplication
端末入力を戦うことになります)。端末デバイスへの書き込みは、そこで表示するためのものであり、入力としてそこに戻すためではありません。するとき
echo test
(echo
'stdout'が端末である場合)、それはあなたがタイプしたかのようにはなりませんtest
。
入力として文字を戻すためのioctl
(TIOCSTI
)がありますが、アプリケーションが既に読み取った後にそれを戻すことができるため、それでも実際には機能しません。それはあなたが何度も何度もそれを読むことを意味するでしょう。
ttysnoop
か、おそらくpeekfd
。