/proc/中的权限是什么意思/fd/?

/proc/中的权限是什么意思/fd/?

ls -l我正在查看运行的结果/proc/<pid>/fd/

lr-x------ 1 root root 64 Apr 22 23:13 0 -> /dev/null
lrwx------ 1 root root 64 Apr 22 23:13 1 -> 'socket:[19700]'
lrwx------ 1 root root 64 Apr 22 23:13 2 -> 'socket:[19700]'
...

符号链接上的权限意味着什么?我首先想到的是它们代表文件描述符的“模式”。但是,如果确实如此,为什么会stdout可读呢?此外,为什么所有描述符都是可执行的?

答案1

Linux 的/proc文件系统将实际上不是文件的对象呈现为文件:它使用已知的 API 将对象呈现为文件。

对于文件描述符,不存在实际的符号链接。但符号链接是显示有关文件描述符信息的便捷方法。此类符号链接是在需要时即时创建的(并且可能会缓存在 VFS 中,因此它们通常具有首次显示的日期)。通常在 Linux 上,符号链接总是拥有所有可能允许的权限,因为它们的目标是经过验证的。但在这里,权限的显示反映了文件描述符的打开方式。它们显示为用户(或有时为 root,例如进程设置为不可转储或不可追踪)所拥有,并且仅限于用户访问属性,即使未真正检查访问属性(所有权检查)强制执行,见下文)。许多细节都记录在proc(5)/proc/[pid]/fd/例如在入口处:

/proc/[pid]/fd/

[...]

对于管道和套接字的文件描述符,条目将是符号链接,其内容是带有 inode 的文件类型。对此文件的 readlink(2) 调用返回以下格式的字符串:

类型:[索引节点]

[...]

取消引用或读取 (readlink(2)) 此目录中的符号链接的权限由 ptrace 访问模式检查控制 PTRACE_MODE_READ_FSCREDS;请参阅 ptrace(2)。

因此,人们只能检查属于同一用户的进程(或者甚至不检查,如果进程设置为不可转储/不可处理和其他特殊警告)。

我没有找到记录的proc(5)是,通常符号链接上显示的访问权限proc/[pid]/fd/反映了文件描述符的打开方式。因此打开只读 ( ls -l /proc/self/fd/9 9</dev/null)、只写 ( ls -l /proc/self/fd/9 9>/dev/null) 或读写 ( ls -l /proc/self/fd/9 9<>/dev/null) 将分别显示以下访问权限:

lr-x------
l-wx------
lrwx------

同样,使用创建的(非命名)管道pipe(2)将有一个处于读取模式的 FD 和一个处于写入模式的 FD。套接字是双向的:没有以只读或只写方式“打开”它们的概念,实际上从来没有open(2)针对它们的系统调用。它们将被视为lrwx------反映它们可以被读取或写入。

答案2

男人 chmod(1) 说:

chmod 永远不会更改符号链接的权限; chmod 系统调用无法更改其权限。这不是问题,因为符号链接的权限从未被使用过。但是,对于命令行上列出的每个符号链接,chmod 都会更改指向文件的权限。

它们基本上没有任何意义。

相关内容