web-dev-qa-db-ja.com

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

wを実行すると、ユーザーがviで特定のファイルを編集していることがわかります。

ただし、異なるディレクトリに同じ名前のファイルがいくつかあります。

これらのファイルのうち、ユーザーが編集しているファイルを確認するにはどうすればよいですか?

3
LINUX G33NYUS

これはいくつかのケースでうまくいくかもしれません。 psを使用して、ファイルを編集しているviインスタンスのプロセスIDを見つけることができます。

$ 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であると結論付けることができます。

2
Andy Dalton

lsofを使用する必要があります:

$ lsof  |grep -i vim
2
PersianGulf

viの内部から、またはシェルからそれを見たいですか? -vimから

<ESC>:ls list buffers opened 

Viはできないと思いますが、ctrl+wwファイル間を切り替える

-シェルから

lsof | grep -i  vi 
1
francois P

Rootを持っていないが、ディレクトリを読み取る権限がある場合は、おそらく、問題のファイルの.swpファイルを探すことです(ユーザーがvimのデフォルトのスワップ場所を変更していないと仮定します)。 :

$ find . -type f
./1/foo
./0/foo
./2/foo

$ cd 1
$ vi foo
^Z 
[1] 19650

$ cd ..
$ find -type f
./1/foo
./1/.foo.swp
./0/foo
./2/foo

ただし、同じディレクトリでfoo.fooを編集する場合、vimは異なる一時ファイル名拡張子を作成する必要があります。

-rw-r--r--   1 user grp  12288 Feb  8 14:59 .foo.swo
-rw-------   1 user grp   4096 Feb  8 14:58 .foo.swp

したがって、find . -user username -name '.*.sw*'を使用して表示することをお勧めします

これは XY問題 -のように少し感じますが、解決しようとしているより大きな問題は何ですか?共通ファイルを編集している複数のユーザーを管理しようとしている場合は、ソース管理システムに移行することをお勧めします。

0
rrauenza

ユーザーが実行したコマンドはわかっているが、ユーザーが実行したディレクトリを知りたいと想定している(したがって、ユーザーがvi myfile.txt、それが/home/user/myfile.txt、または/tmp/myfile.txt、 または、他の何か)。

その場合、ルートとして実行していると想定すると、次のことができます。

readlink /proc/<pid>/cwd

どこ <pid>は、関心のあるvi/vimプロセスのプロセスIDです。これにより、そのプロセスの現在のディレクトリがわかります。 。

ただし、次のことに注意してください。

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