viでユーザーがどのファイルを編集しているかを確認する方法

viでユーザーがどのファイルを編集しているかを確認する方法

を実行すると、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です。これは、そのプロセスの現在のディレクトリを知らせます。これは目的のディレクトリである可能性が最も高いです。vivim

しかし、注意してください:

  • ユーザーはエディタを起動した後にプロセスの現在のディレクトリを変更できます(たとえば、コマンドを使用:cd)。 100%信頼できませんが、エディタを作成したシェルプロセスの現在のディレクトリを確認することもできます。
  • ユーザーは別のファイルを開くことができ、これらのファイルはコマンドラインに表示されないため、まったく別のファイルを編集している可能性があります。

関連情報