如果我执行 a 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
与实际文件相关联,然后您将需要我接下来在答案中讨论的工具(对于 classic 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 号位于逗号分隔组 s 中的用户选择文件列表
除了 之外lsof
,您还可以以 root 身份使用 ,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 只是一个共享库,用作 libc 提供的 execve() 函数的包装器,以记录对 syslog (authpriv) 的每次调用。系统管理员可能会发现 snoopy 在轻型/重型系统监控、跟踪其他管理员的操作以及对系统中正在发生的事情有一个良好的“感觉”等任务中很有用(例如 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
然后,以 root 身份查看与该 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
)。您可能还希望检查生成编辑器的 shell 进程的当前目录,尽管这也不是 100% 可靠。 - 用户可以打开其他文件,并且这些文件不会显示在命令行中 - 因此他们可能正在完全编辑其他内容。