コンピュータにログインしたらw
。システム管理者としてユーザーがこっそりこの端末を垣間見ることができますか?つまり、その端末で行われたすべての作業を私の端末の出力として見たいのです。
次の点に注意してください。
- これは、ユーザーのアクティビティを監視する実際のユースケースには適用されません。この目的のためのシステム監査ツールがあることを知っています。できるかと思います。
- わかりましたこの問題
strace
すべての解決策が邪魔になったり(ユーザーが私がしていることに気づいたり)、あまりにも多くのノイズを生成(ソリューション)することを提案しているので、私が求めているものを扱っていないようです。近い解決策が提案されましたgdb
。ただし、これは他の端末からの標準出力のみを表示できます。
私が試したこと
私の端末でこれを試しました。
tee /dev/pts/user_pts </dev/pts/user_pts
これにより、ユーザーが別の擬似端末に入力したすべての文字を表示できます。問題は、数文字ごとに「スキップ」することです。つまり、ある端末装置には悪意のある文字が表示されますが、他の端末装置には表示されません。また、ユーザの擬似端末装置でコマンドが実行されるのを防止する。なぜこれが起こるのか、改善する方法があるのかはわかりません。
私は何を見たいですか?
USER TERMINAL | MY TERMINAL
$ echo "Test" | # slick_command_here
Test | echo "Test"
$ | Test
ベストアンサー1
ターミナルエミュレータに表示される内容を表示するには、そのターミナルエミュレータで疑似ターミナルの基本側の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
fd 4から読み取ったstrace
内容の16進ダンプを出力しますxterm
。残りのコマンドは、これを実際の文字に変換することです。私は試しましたが、peekfd -n -8 15173 4
何らかの理由で書かれたものだけを提供します。
-opost
監視端末で後処理を無効にして、スレーブxxd
側に記録されているすべての内容がマスター側で変更されないようにして、監視が監視されたのとxterm
同じ結果を得るようにします。-echo
問題は、監視されている端末のアプリケーションが端末から応答を要求するためにエスケープシーケンスを送信する場合(たとえば、カーソルの位置、端末の種類、またはウィンドウのタイトルを要求する)、これは私たちの監視とxterm
意志xterm
に入ります。返信する私たちはこのようなことがローカルで起こることを望んでいません。
write
同じread
fdのシステムコールを追跡して、入力されている内容(上記の内容の置き換え)を監視することもできますwrite
。を押すと、Enter端末エミュレータはLFの代わりにCR文字を送信します。また、私たちはメイン側で追跡しているので、ユーザーが を入力すると、エンドデバイスがa<Backspace>b
標準モードになっていても、3つのキー入力がすべて表示されます。
あなたがうまくいかない理由は次のとおりです。
tee /dev/pts/user_pts </dev/pts/user_pts
端末装置から読み取るのはユーザー入力を読み取ることであり、書き込むことはそれをユーザーに表示することです。
tee
端末装置から読み取るように指示します。したがって、読み取る内容(ユーザー入力)は、端末read
で実行されているアプリケーションでは読み取られません(その逆も端末入力のために競合します)。端末装置への書き込みは表示するためのものであり、入力として書き戻すためのものではありません。するときtee
application
echo test
(echo
stdoutが端末です)入力した内容とは異なりますtest
。
ioctl
文字を再入力に入れることができる()がありますがTIOCSTI
、それでも書き戻すことができ、機能しません。後ろにアプリケーションがより多くの内容を読み取ったため、アプリケーションが入力を読み取る順序が変わります。つまり、とにかく何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も読んでいきます。