‘cat’:无法打开文件:权限被拒绝

‘cat’:无法打开文件:权限被拒绝

我正在尝试将整个/目录复制到其他位置。当以递归方式执行 cp 时,它会在某些文件上失败,例如:-

/ # ls -lrt /sys/module/nf_conntrack_ipv4/uevent
--w-------    1 root     root          4096 Mar  7 06:29 /sys/module/nf_conntrack_ipv4/uevent
/ #
/ # cat /sys/module/nf_conntrack_ipv4/uevent
cat: can't open '/sys/module/nf_conntrack_ipv4/uevent': Permission denied
/ # cp /sys/module/nf_conntrack_ipv4/uevent /tmp
cp: can't open '/sys/module/nf_conntrack_ipv4/uevent': Permission denied

如果我创建一些仅具有w权限的文件并尝试复制/cat 它,我看不到任何问题。但是,对于上面提到的某些文件,即使我以 root 用户身份尝试,也无法复制或 cat 它。此外,奇怪的是,上面提到的文件的大小是 4096,与我们目录的大小相似。这是特殊的文件吗?

我想我在这里遗漏了一些东西,需要一些输入来了解有关此类文件或此类行为的更多信息。请帮助我理解为什么不允许我 cat 此类文件的内容。

答案1

例如,在常规文件系统中ext4,如果您只w对某个文件有权限,则无法读取 ( cat) 它,您需要读取 ( r) 位才能读取。请注意,root无论权限位如何,都可以读取任何文件。

现在,/sys是 Linux 内核提供的一个特殊的挂载点,sysfs它实际上是一个虚拟文件系统,其工作方式与常规文件系统不同。/sys包含系统的设备相关信息。

修改某些内容/sys会直接改变内核的内部数据结构,因此允许或拒绝什么取决于内核。

对于/sys/module/nf_conntrack_ipv4/uevent,您只w为所有者设置了位(root),即使您rroot这是一个非常糟糕的主意),在读取文件时您会收到 I/O 错误,因为根据设计,内核不允许任何人读取模块的 uevent nf_conntrack_ipv4

答案2

为了避免使用像/sys和这样的特殊文件系统/proc,您应该为提供以下选项cp

-x, --one-file-system
    stay on this file system

(引自手册页

如果您有多个实际的文件系统,例如//home,那么您将需要给出多个cp命令。

小心不要抄袭同一个地方。这会导致无限循环,您会复制……

相关内容