BSDシステムにはきちんとした watch 他のttyをスヌーピングするためのツールがあります:
ユーザーがボックスにログインして、助けを求めたことはありますか?または、ユーザーがシステムで何をしているのか知りたいと思ったことはありませんか? watch(8)ユーティリティを使用すると、別のttyをスヌープして、他のユーザーが何をしているかを確認したり、ユーザーとやり取りしたりすることができます。これは、すべてのネットワーク管理者にとってなくてはならないユーティリティです。
残念ながら、watch
はLinuxでは別の獣です。
これまでのところ私は持っています:
ttysnoop
は/ etc/inittabを変更する必要がありますがこれは面倒ですconspy
これまでのところ機能させることができませんでしたpeekfd
は機能しますが、一方向のみです(ユーザー入力は表示されますが、出力は表示されません)screen
はもちろんいいですが、ユーザーはscreenを使用する必要があります...Linuxに相当するものはありませんか?
peekfd
に複数のファイル記述子を指定できます。
例えば.
peekfd -n -8 -d -c 24184 0 1 2
pid 24184のstdin、stdout、およびstderrをスヌープします。
-c
オプションは、すべての子プロセスにもアタッチされます。これは、それらからの出力を確認するために必要です(たとえば、スヌープされたシェルプロセスで実行されたls
の出力を確認する)
不思議なことに、それは常に子に正常にアタッチされていることがわかります(スヌープされたttyで実行する子プロセスに関係なく--ls
、uname
、/bin/echo
組み込みのecho
)とは対照的に、常にエラーメッセージを出力しますError attaching to pid -38
(そして「pid」は常に -38です)。
man peekfd
言う:
診断
Stderrで次の診断が発行される場合があります。
Error attaching to pid ...
プロセスにアタッチしようとしたときに不明なエラーが発生しました。rootである必要がある場合があります。
私にはバグのように見えます-私はルートとしてpeekfd
を実行しています、そしてそれは常に常に同じ偽物(-38
)PID。
注意:manページにも次のように書かれています。
バグ
おそらくたくさん。監視しているプロセスが停止しても驚かないでください。
SystemTap
3行、問題解決、SystemTapは完全にルール:
SystemTapをインストールし、 ptysnoop ファイルを作成します。
#!/usr/bin/stap
probe kernel.function("pty_write") {
if (kernel_string($tty->name) == @1) {
printf("%s", kernel_string_n($buf, $c))
}
}
実行可能にします。今見て/dev/pts/6
あなただけ:
$ Sudo ptysnoop pts6
編集:以前に見つかった他のソリューション
ttyrpld かなりしっかりしているように見えます:
ttyrpldは、(a)同期再生をサポートするマルチOSカーネルレベルのttyロガー(ttyのキーおよびスクリーンロガー)です。 vc、bsd、unix98スタイルのptys(xterm/ssh)、serial、isdnなどを含むほとんどのttyタイプをサポートします。カーネル内に実装されているため、デフォルトのユーザーには避けられません。ロギングデーモンがアクティブでない場合、オーバーヘッドなしで実行されます。
ただし、そのためのカーネルモジュールが必要です。
私 終了しました 小さなstraceベースの ttylogger ツールを書き始めました。これは私のニーズに適しています。必要なのはPerlとstraceだけです。
$ Sudo ttylogger pid
これをユーザーShellのpidとともに使用して、後続のすべてのコマンドからの出力をダンプします。
詳細については、 readme を参照してください。