为什么每次有人执行`ls -l`命令时都使用/ etc / passwd?


28

APUE阅读,只是感到好奇:

每次用户登录UNIX系统以及每次有人执行ls -l命令时都使用该密码文件。


3
仅供参考,我稍后再试strace ls -l,我看到一条openat(AT_FDCWD, "/etc/passwd", O_RDONLY|O_CLOEXEC) = 4声明。
里克

7
当然,如今现实更加复杂。它不在/etc/passwdBSD上。一个积极的人nscd会改变一切;NSS也一样。因此请注意,此问题基于第七版世界观。
JdeBP

4
@JdeBP 在Unix环境中的远古编程呢?
安德鲁·亨利

@JdeBP 不是吗?当您这么说时,我感到很惊讶,因为我认为很多程序(脚本和二进制文件)会中断(可能错误地,但仍然)依赖于/ etc / passwd的程序。
彼得-恢复莫妮卡

并非如此,因为正确阅读该手册页(包括其FILES部分)不会显示出来。(-:
JdeBP

Answers:


50

文件系统直接将数字UID(用户ID)和GID(组ID)值与文件关联,而不是与用户名和组名(字符串)关联。因此,该ls -l命令(以及显示文件的用户和组所有者的任何其他命令)都需要从某个位置获取用户名和组名。该/etc/passwd文件就是这样的一种来源(可能是原始且最常见的来源)。手册对此进行了说明-从PASSWD(5)(即/etc/passwd文件的手册页)中进行了说明:

许多实用程序,例如ls(1)都使用它来将用户ID映射到用户名


17
为了补充回答:POSIX指定选项-nls。这样可以防止将UID和GID转换为用户名和组名。我已经ls -n使用GNU core utils 进行了测试,ls并且该选项阻止了两者的访问,/etc/passwd并且无法/etc/group按预期进行访问。
pabouk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.