如何查看用户正在 vi 中编辑哪个文件

如何查看用户正在 vi 中编辑哪个文件

如果我执行 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 脚本)。

要安装snoopysysdig

$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 - 这将告诉您该进程的当前目录,该目录很可能是您想要的目录。vivim

但请注意:

  • 用户可以在启动编辑器后更改进程的当前目录(例如使用命令:cd)。您可能还希望检查生成编辑器的 shell 进程的当前目录,尽管这也不是 100% 可靠。
  • 用户可以打开其他文件,并且这些文件不会显示在命令行中 - 因此他们可能正在完全编辑其他内容。

相关内容