を実行すると、w
ユーザーがviで特定のファイルを編集していることを確認できます。
ただし、異なるディレクトリに同じ名前の複数のファイルがあります。
これらのファイルのうち、ユーザーが編集しているファイルが何であるかをどうやって知ることができますか?
答え1
次のようにlsof
ユーザーを選択してプロセスを検索できます。vim
sudo lsof -u user -a -c vim | grep swp
@Foxが指摘したように、古典的なアプローチは一時ファイルをvi
生成するため、/var/tmp
これを表示するには選択(テストしない)が必要です。
sudo lsof -u user -a -c vi | grep '/var/tmp/'
しかし、@Foxが指摘したように、クラシックファイルと実際のファイルを関連付けることはできず、答えで次にvi
議論するツールが必要です(クラシックのvi
場合はvim
それで十分ですlsof
)。通常vim
今日のLinuxではvi
。
バラより15 Linux lsofコマンドの例(オープンファイルの識別)
vim
例に戻ると、使用しているスワップファイルが次のようにfile
開かれていることがわかります。.file.swp
ユーザーがuser1
以下を行う場合vi file
:
$ sudo lsof -c vi -a -u user1 | grep swp
vi 3615 user1 3u REG 8,1 12288 265061 /home/user1/.file.swp
~からman lsof
-a はリスト選択オプションを AND に連結します。
-ccこのオプションは、c文字で始まるコマンドを実行するプロセスのファイルのリストを選択します。複数の -c オプションを使用して複数のコマンドを指定できます。 ANDオプションの選択に参加する前に、単一のORセットに追加されます。
-usこのオプションは、ログインまたはユーザーID番号がカンマで区切られたグループ内のユーザーのファイルのリストを選択します。
lsof
ルートとして使用できる他にも、sysdig
強力なデバッグフレームワークがあります。
これにより、システムで開いているすべてのファイルがリアルタイムで表示され、ファイルが開くとすぐにユーザー、PID、およびプロセスが一覧表示されます。
sudo sysdig -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open"
sysdig:システムレベルのナビゲーションとトラブルシューティングツール
SysdigはLinuxカーネルにインストールし、システムコールやその他のオペレーティングシステムイベントをキャプチャし、オペレーティングシステムレベルで物理マシンと仮想マシンを検出します。その後、sysdigのコマンドラインインターフェイスを使用してこれらのイベントをフィルタリングしてデコードして、有用な情報と統計を抽出できます。
Sysdigを使用すると、リアルタイムシステムをリアルタイムで確認したり、後で分析したりできるトレースファイルを作成できます。
snoopy
システム管理者にとって便利なツールとして、プロセスで行われたすべての呼び出しをsyslogに記録するツールをインストールすることもできます。ユーザーがコマンドラインから呼び出すと、vi file
システムログに表示されます。
インストールされたら、snoopy
削除するまでexecve()を介してすべてのプロセス呼び出しを記録することに注意してください。
snoopy: execve() ラッパーとロガー
snoopyは、syslog(authpriv)へのすべての呼び出しを記録するためにlibcによって提供されるexecve()関数の周りのラッパーとして機能する共有ライブラリです。システム管理者は、スヌーピーが軽量/重いシステムの監視、他の管理者のタスクの追跡、システムで何が起こっているのかについての良い「感覚」の取得(Apache実行cgiスクリプトなど)などのタスクに役立ちます。
インストールするには、次のようにしsnoopy
ますsysdig
。
$sudo apt-get install snoopy sysdig
関連質問も参照してください。Linuxバイナリが実行するタスクの理解
答え2
これは場合によっては効果があるかもしれません。ps
ファイルを編集したインスタンスのプロセスIDを見つけることができます。vi
$ w
...
username pts/2 :0.0 11:42 2:34m 0.28s 0.27s vim foo
$ ps aux | grep 'vim foo'
...
username 55899 .... vim foo
次に、ルートとしてそのpidに関連付けられている開かれたファイル記述子を確認します。
# ls -l /proc/55899/fd
...
lrwx------ 1 username group 64 Feb 8 14:23 6 -> /path/to/.foo.swp
これを考慮すると、そのファイルが/path/to/foo
。
答え3
以下を使用する必要がありますlsof
。
$ lsof |grep -i vim
答え4
ユーザーが実行したコマンドを知っていると仮定しますが、ユーザーがそのコマンドを実行したディレクトリが何であるかを知りたいです。したがって、実行した場合、そのコマンドが、または他のものであるかどうかがvi myfile.txt
わかります。/home/user/myfile.txt
/tmp/myfile.txt
この場合、rootとして実行すると仮定すると、次のことができます。
readlink /proc/<pid>/cwd
ここで、/<pid>
は関心のあるプロセスのプロセスIDです。これは、そのプロセスの現在のディレクトリを知らせます。これは目的のディレクトリである可能性が最も高いです。vi
vim
しかし、注意してください:
- ユーザーはエディタを起動した後にプロセスの現在のディレクトリを変更できます(たとえば、コマンドを使用
:cd
)。 100%信頼できませんが、エディタを作成したシェルプロセスの現在のディレクトリを確認することもできます。 - ユーザーは別のファイルを開くことができ、これらのファイルはコマンドラインに表示されないため、まったく別のファイルを編集している可能性があります。