如何查看lsof
特定目录中由其他用户打开 ( ) 的文件列表?
我可以这样做lsof +D /path
,但这只显示当前用户的文件。
有什么方法可以查看其他用户是否打开了目录中的文件?
由于我最近有类似的问题,我也想在这里分享我的发现。还假设用户是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 用户的问题,sudo
有sudoers
必要识别调用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)
我假设您以 root 身份运行/可以 sudo 作为 root lsof:
lsof -u www-data
Run Code Online (Sandbox Code Playgroud)