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

时间:2012-12-25 08:49:15

标签: c file-ownership

我正在使用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 个答案:

答案 0 :(得分:9)

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

因此,您获得的用户名无关紧要,因为拥有该UID的所有用户都拥有该文件。

答案 1 :(得分: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到人性化字符串的映射,找到的第一个映射是使用的映射,因为它们都是相同的。

在hort中,不要给两个用户提供相同的数字ID,因为如果你这样做,你就会让自己的生活太过艰难。