2012-12-25 32 views
3

我正在嘗試使用C獲取Unix文件的所有者名稱。我發現的唯一方法是使用stat(),然後使用getpwuid(stat.st_uid)。但是,它只會返回帶有該uid的第一個用戶名,其中密碼文件中的用戶可以具有相同的uid。顯然,這是不可接受的,不能被信任。如何使用C獲得Unix文件的所有者

參考文獻:

所有者從密碼文件recievd: 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

+0

我要通過我在互聯網上發現的信息來獲得這一點。我已經閱讀getpwuid()從密碼文件中獲取它的信息。我也讀過它發現的第一個uid。不止一個人可以擁有相同的uid。我有錯誤的信息嗎? – cxx6xxc

+0

這裏是說它從哪裏得到uid:http://pubs.opengroup.org/onlinepubs/007904875/functions/getpwuid.html – cxx6xxc

回答

9

Unix文件權限通過使用UID工作。用戶名不能擁有文件。只有UID可以。所以如果一個文件屬於一個特定的UID,那麼所有擁有該UID的用戶都擁有該文件。

因此,您得到的是哪個用戶名並不重要,因爲具有該UID的所有用戶都擁有該文件。

+0

我的問題是業主,而不是用戶。不知何故,Unix可以準確識別這個,我猜測它不會搜索密碼文件。 – cxx6xxc

+0

@ cxx6xxc文件的所有者是UID。 –

+0

我的意思是業主的名字。不知何故,一個名字被放在一個文件 – cxx6xxc

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,因爲如果你這樣做,你會讓自己的生活太過艱難。

+0

因此,如果我在共享目錄上創建一個文件,並且更改了文件的權限,只有我可以讀取和寫入該文件,那麼unix如何知道用戶使用我的uid無法讀取和寫入? – cxx6xxc

+1

@ cxx6xxc它知道只有具有與擁有該文件相同的UID的用戶才能被讀取和寫入。默認情況下,用戶不具有相同的UID,因爲這會導致無法區分它們。 –

相關問題