我正在尝试读取两个特定文件,即status
和smaps_rollup
下的所有进程/proc
。所有进程目录都有dr-xr-xr-x
权限,我可以进入这些目录中的每一个。
对于所有进程,这两个文件的权限都是-r--r--r--
.
这是奇怪的行为。假设我尝试读取 PID 1 的两个文件。我可以读取status
file,但不能读取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 作为解决方法之外,我还能做些什么来解决这个问题吗?
答案1
这似乎没有明确记录;它被传递地记录在man 5 proc
,通过文档/proc/[pid]/maps
:
ptrace
访问此文件的权限由访问模式检查控制PTRACE_MODE_READ_FSCREDS
;看ptrace(2)
。
文档smaps
说
这些行中的第一行显示的信息与 中的映射显示的信息相同
/proc/[pid]/maps
。
由于后者是敏感的,它以类似的方式受到保护。smaps_rollup
不太敏感并且可以打开但据我所知,后一个补丁还没有取得任何进展。
应该可以使用功能来解决这个问题,但我还没有尝试过。
许多文件、目录和链接/proc
不一定如其权限所指示的那样可访问;特别是,许多文件需要与maps
和smaps
,相同的权限PTRACE_MODE_READ_FSCREDS
。这些要求详述于man 5 proc
。这意味着可见权限只能被视为权限的上限;特别是,它们对于确定/proc
条目是否用于更新内核设置(可写)而不是仅查看它们非常有用。