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 都会更改指向文件的权限。
它们基本上没有任何意义。