web-dev-qa-db-ja.com

Linux用の他のttyを監視するツール?

BSDシステムにはきちんとした watch 他のttyをスヌーピングするためのツールがあります:

ユーザーがボックスにログインして、助けを求めたことはありますか?または、ユーザーがシステムで何をしているのか知りたいと思ったことはありませんか? watch(8)ユーティリティを使用すると、別のttyをスヌープして、他のユーザーが何をしているかを確認したり、ユーザーとやり取りしたりすることができます。これは、すべてのネットワーク管理者にとってなくてはならないユーティリティです。

残念ながら、watchはLinuxでは別の獣です。

これまでのところ私は持っています:

  • ttysnoopは/ etc/inittabを変更する必要がありますがこれは面倒です
  • conspyこれまでのところ機能させることができませんでした
  • peekfdは機能しますが、一方向のみです(ユーザー入力は表示されますが、出力は表示されません)
  • screenはもちろんいいですが、ユーザーはscreenを使用する必要があります...

Linuxに相当するものはありませんか?

4
lemonsqueeze

peekfdに複数のファイル記述子を指定できます。

例えば.

peekfd -n -8 -d -c 24184 0 1 2

pid 24184のstdin、stdout、およびstderrをスヌープします。

-cオプションは、すべての子プロセスにもアタッチされます。これは、それらからの出力を確認するために必要です(たとえば、スヌープされたシェルプロセスで実行されたlsの出力を確認する)

不思議なことに、それは常に子に正常にアタッチされていることがわかります(スヌープされたttyで実行する子プロセスに関係なく--lsuname/bin/echo組み込みのecho)とは対照的に、常にエラーメッセージを出力しますError attaching to pid -38(そして「pid」は常に -38です)。

man peekfd言う:

診断

Stderrで次の診断が発行される場合があります。

  Error attaching to pid ...

プロセスにアタッチしようとしたときに不明なエラーが発生しました。rootである必要がある場合があります。

私にはバグのように見えます-私はルートとしてpeekfdを実行しています、そしてそれは常に常に同じ偽物(-38)PID。

注意:manページにも次のように書かれています。

バグ

おそらくたくさん。監視しているプロセスが停止しても驚かないでください。

1
cas

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 を参照してください。

1
lemonsqueeze