3

我正在尝试使用 C 获取 Unix 文件的所有者名称。我发现的唯一方法是使用 stat(),然后使用 getpwuid(stat.st_uid)。但是,它只返回具有该 uid 的第一个用户名,其中密码文件中的用户可以具有相同的 uid。显然,这是不可接受的,也不可信。

参考:

所有者是从密码文件中收到的:http: //pubs.opengroup.org/onlinepubs/007904875/functions/getpwuid.html

Uid 在密码文件中找到: http ://www.cyberciti.biz/faq/understanding-etcpasswd-file-format/

Unix允许多个用户拥有相同的uid: http ://www.e-reading.org.ua/htmbook.php/orelly/networking/puis/ch04_01.htm

是否有准确的方法或较低级别的方法,某种可以保证我准确结果的查找表?

4

2 回答 2

9

Unix 文件权限通过使用 UID 起作用。用户名不能拥有文件。只有 UID 可以。因此,如果文件属于特定的 UID,则具有该 UID 的所有用户都拥有该文件。

因此,您获得哪个用户名并不重要,因为具有该 UID 的所有用户都拥有该文件。

于 2012-12-25T08:54:17.150 回答
5

如果您有多个名称与单个 UID 关联,则您有多个名称与该 UID 关联。但就内核而言,所有这些名称都是 SAME 用户的别名。

也就是说,这个名字纯粹是人类虚构的,唯一存储的就是 UID。

例如,假设我们在 /etc/passwd 中有两行:

user:50:50:...
resu:50:50:...

这定义了从用户名到 UID 的两个映射。在内部,只有数字 UID 用于确定“某人是谁”,因此如果resu创建文件并将权限设置为 user:read/write、group:none、other:none,user仍然可以读取它,因为就就内核而言,他们是同一个用户。

/the/example/file
  owner: 50
  group: 50
  permissions: rw-------

就所有权而言,存储在文件系统中的唯一内容是数字用户 ID 和数字组 ID。对于从数字 ID 到人类友好字符串的映射,找到的第一个映射就是使用的映射,因为它们都是相同的。

简而言之,不要给两个用户提供相同的数字 ID,因为如果你这样做,你会让自己的生活变得太难。

于 2012-12-25T08:54:35.447 回答