此错误信息的含义是什么:lsof:警告:无法 stat() fuse.gvfs-fuse-daemon 文件系统 /home/nes/.gvfs

此错误信息的含义是什么:lsof:警告:无法 stat() fuse.gvfs-fuse-daemon 文件系统 /home/nes/.gvfs

当我lsofsudo这样使用时

sudo lsof ~


lsof: WARNING: can't stat() fuse.gvfs-fuse-daemon file system /home/nes/.gvfs
      Output information may be incomplete.

但是,当我不使用时sudo,不会出现此错误。

这条消息是什么意思?

答案1

有一个 FUSE 虚拟文件系统安装在~/.gvfs

对于大多数文件系统访问,root 用户的权限会被忽略。但是,FUSE 虚拟文件系统挂载是少数例外之一。FUSE 虚拟文件系统通常仅限于挂载它们的用户。

在这种情况下,gvfs-fuse-daemon命令(作为桌面会话的一部分运行)创建了此挂载,属于您,并且没有其他人可以访问它,包括 root。

答案2

也有类似的问题Unix 和 Linuxlsof:警告:无法 stat() fuse.gvfsd-fuse 文件系统它有两个有趣的答案,我在下面引用。

pabouk - 乌克兰保持强势的答案

FUSE 及其访问权限

lsof默认情况下检查所有已挂载的文件系统,包括保险丝- 在用户空间实现的文件系统在 Linux 中具有特殊的访问权限。

正如你所看到的在 Ask Ubuntu 上回答一辆垂直起降系统文件系统(FUSE 的特殊情况)通常仅供挂载它的用户(的所有者gvfsd-fuse)访问。即使root无法访问它。要覆盖此限制,可以使用挂载选项allow_rootallow_other。还必须在 FUSE 守护程序中启用该选项,例如,在此回答...但就您而言,您不需要(也不应该)更改访问权限。

从 lsof 中排除文件系统

在您的情况下lsof不需要检查 GVFS 文件系统,因此您可以stat()使用该选项排除对它们的调用-e(或者您可以忽略警告):

lsof -e /run/user/1000/gvfs

通过 lsof 检查某些文件

您使用lsof获取有关系统上运行的所有进程的信息,然后才使用 过滤完整输出grep。如果您只想检查某些文件和相关进程,请使用-f选项,后面不带值,然后在“选项结束”分隔符 后指定文件列表--。这样会快得多。

lsof -e /run/user/1000/gvfs -f -- /tmp/report.csv

通用解决方案

要排除所有stat()失败的已安装文件系统,您可以运行以下命令(在bash):

x=(); for a in $(mount | cut -d' ' -f3); do test -e "$a" || x+=("-e$a"); done
lsof "${x[@]}" -f -- /tmp/report.csv

或者确保使用stat()test -e可以用不同的方式实现):

x=(); for a in $(mount | cut -d' ' -f3); do stat --printf= "$a" 2>/dev/null || x+=("-e$a"); done

Gilles 的回答是“所以,别再作恶了”

lsof总是尝试获取有关所有文件系统的一些基本信息,即使参数恰好暗示某个文件系统不会产生任何结果。如果它无法访问文件系统(具体来说,stat如消息所述,无法在其挂载点调用),它会发出抱怨。

作为 root,您通常有权访问文件系统。但是,由于保险丝,root 不会自动拥有 FUSE 文件系统的所有权限。这不是安全功能(root 可以成为拥有文件系统的用户并以此方式获得访问权限),而是一项技术限制。

GVFS-FUSE 是一个 FUSE 接口垂直起降系统,这是一种允许 Gnome 应用程序访问由 Gnome 插件实现的虚拟文件系统的机制:GVFS 允许非 Gnome 应用程序通过常规文件系统接口访问这些虚拟文件系统。

相关内容