lsof 用于其他用户打开的文件

5 bash lsof

如何查看lsof特定目录中由其他用户打开 ( ) 的文件列表?

我可以这样做lsof +D /path,但这只显示当前用户的文件。

有什么方法可以查看其他用户是否打开了目录中的文件?

U88*_*80D 5

由于我最近有类似的问题,我也想在这里分享我的发现。还假设用户是root其他答案中提到的。

列出特定目录中打开的文件

lsof +D /var/log/
Run Code Online (Sandbox Code Playgroud)

将显示所有用户打开的文件。

指定用户

lsof -u ${USER} +D /var/log/
Run Code Online (Sandbox Code Playgroud)

将显示来自用户或特定目录内的所有文件(...并且独立于用户)。

这是因为并且如以下所述man lsof

由于它们代表排除,因此它们的应用无需 OR 或 AND 运算,并且在应用任何其他选择标准之前生效。

-a 选项可用于对选择进行 AND 运算。例如,指定 -a、-U 和 -ufoo 只会生成属于用户“foo”拥有的进程的 UNIX 套接字文件的列表。

仅列出用户打开的文件以及特定目录中的文件

lsof -u ${USER} -a +D /var/log/ 
Run Code Online (Sandbox Code Playgroud)

然后可以列出不是用户且位于特定目录中的打开文件。

lsof -u ^${USER} -a +D /var/log/ 
Run Code Online (Sandbox Code Playgroud)

这种方法也适用于网络连接。即,如果对非 root 运行进程下打开的所有 TCP 或 UDP 连接感兴趣

lsof -u ^root -P -i TCP -i UDP
Run Code Online (Sandbox Code Playgroud)

要解决非 root 用户的问题,sudosudoers必要识别调用sudo用户

列出特定目录中所有打开的文件以及从用户打开的文件

sudo lsof -u $(who | cut -d " " -f 1) -a +D /usr/lib/
Run Code Online (Sandbox Code Playgroud)

否则它将显示打开的文件或目录内的文件并且独立于用户。

列出特定目录中未由上述用户打开的所有打开文件

sudo lsof -u ^$(who | cut -d " " -f 1) +D /usr/lib/
Run Code Online (Sandbox Code Playgroud)


pQd*_*pQd 2

我假设您以 root 身份运行/可以 sudo 作为 root lsof:

lsof -u www-data
Run Code Online (Sandbox Code Playgroud)

  • 不,运行 lsof 的用户不是(不能是)root。但是,他确实具有对其他用户正在写入的目录和文件的 rwx 访问权限 (2认同)
  • @Ash - 所以用户不能。您可以 suid lsof 或允许用户通过 sudo 以 root 身份运行它。但这些都不是好主意。用户需要有权访问 /proc/processnumber 来检查其他人运行的进程的当前工作目录。仅仅读取他的主文件夹的权限是不够的。 (2认同)