如何使用C语言获取Unix文件的所有者

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

有没有一种准确的方式或更低级的方式,某种查找表可以保证我得到准确的结果?


2
这怎么能信任呢?在经典的Unix权限中,所有者的UID确实与inode一起存储,并且一个UID可以匹配多个用户。此外,在大多数现代Unix系统上,它可能不在密码文件中,这取决于您的nsswitch配置。 - fge
我目前所了解的信息是基于我在互联网上找到的。我已经阅读了getpwuid()函数从密码文件中获取信息的相关内容。同时,我也了解到它会选择第一个找到的UID。但是,多个人可能会有相同的UID。请问我的理解是否正确? - cxx6xxc
这里说uid在密码文件中:http://www.cyberciti.biz/faq/understanding-etcpasswd-file-format/ - cxx6xxc
但是uid不是我的问题。Unix必须通过其他方式来确定文件的所有权,因为我可以拥有相同的uid,但与我的uid不共享。 - cxx6xxc
不,它只使用UID,并将该UID与用户名匹配取决于您的nsswitch配置。请参见/etc/nsswitch.confgetent命令(服务passwd)。 - fge
显示剩余7条评论
2个回答

9

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

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


我的问题是Owner,而不是uid。不知何故Unix能够准确识别它,我猜测它并没有搜索密码文件。 - cxx6xxc
@cxx6xxc 文件的所有者是一个 UID。 - Nikos C.
我的意思是文件所有者的名字。不知何故,一个名字被放在了文件上。 - cxx6xxc
@cxx6xxc 是的,可以通过passwd文件实现。如果有多个用户名,我不知道会选择哪一个。但无论如何都没关系。 - Nikos C.
1
@cxx6xxc 这里没有安全漏洞,因为只有 root 用户可以创建新用户,并且新用户的 UID 总是不同的,除非 root 明确请求自定义 UID。 - Nikos C.
显示剩余4条评论

5
如果一个UID与多个名称相关联,则该UID会与多个名称相关联。但就内核而言,所有这些名称都是相同用户的别名。
也就是说,名称仅仅是人为的虚构,唯一存储的东西是UID。
例如,假设在/etc/passwd中有两行:
user:50:50:...
resu:50:50:...

这里定义了两个从用户名到UID的映射关系。内部仅使用数值型UID来确定“某人”的身份,因此如果resu创建一个文件并将权限设置为user:读/写、组:无、其他人:无,则user仍然可以读取该文件,因为对于内核而言,它们是同一用户。

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

就所有权而言,文件系统中仅存储数值用户ID和数值组ID。为了将数值ID映射为易于理解的字符串,找到的第一个映射将被使用,因为它们都是相同的。

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


如果我在共享目录上创建一个文件,并将文件的权限更改为只有我可以读写,那么Unix如何知道具有我的UID的用户无法读写该文件? - cxx6xxc
1
它知道只有与拥有文件相同UID的用户才能读写它。默认情况下,用户没有相同的UID,因为这会使它们无法区分。 - Nikos C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接