我正在尝试读取两个特定文件,即status
和smaps_rollup
下的所有进程/proc
。所有进程目录都有dr-xr-xr-x
权限,我可以进入这些目录中的每一个。
对于所有进程,这两个文件的权限都是-r--r--r--
.
这是奇怪的行为。假设我尝试读取 PID 1 的两个文件。我可以读取status
文件,但不能读取smaps_rollup
. 见下文:
$ cd /proc/1
$ ls -l status smaps_rollup
-r--r--r-- 1 root root 0 Apr 5 18:34 smaps_rollup
-r--r--r-- 1 root root 0 Mar 21 12:18 status
$ grep "Swap:" status
VmSwap: 1072 kB
$ grep "Swap:" smaps_rollup
grep: smaps_rollup: Permission denied
$ cat smaps_rollup
cat: smaps_rollup: Permission denied
我查找了相关问题并发现了其中的一些问题[1][2][3][4]。他们都没有同样的问题。这些其他问题的解决方案与修复目录上缺少的可执行权限有关。这里不是这种情况。
这是 proc 的挂载信息:
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
我正在使用 Arch Linux 提供的内核 6.2.7-arch1-1 运行 Arch Linux。
我正在寻找对这种奇怪行为的正确解释。除了使用 sudo 作为解决方法之外,我还能做些什么来解决这个问题?
这似乎没有明确记录;它
man 5 proc
通过以下文档在 , 中被传递地记录/proc/[pid]/maps
:文件
smaps
说由于后者是敏感的,所以它以类似的方式受到保护。
smaps_rollup
不太敏感,可以打开,但据我所知,后一个补丁还没有到任何地方。应该可以使用 capabilities 来解决这个问题,但我还没有尝试过。
中的许多文件、目录和链接
/proc
不一定像其权限所指示的那样可访问;maps
特别是,许多文件需要与和smaps
,相同的权限PTRACE_MODE_READ_FSCREDS
。这些要求在 中有详细说明man 5 proc
。这意味着可见权限只应被视为权限的上限;特别是,它们可用于确定/proc
条目是否用于更新内核设置(它是可写的),而不是仅用于查看它们。