兩個組具有相同的名稱(但不同的gid)是否有效?
今天在centos系統上安裝“passenger”web伺服器時遇到了一個奇怪的問題。
伺服器未能為其創建的目錄設置 GID,即使它正在嘗試使用目前使用者的組。錯誤如下:
無法更改目錄“/tmp/passenger.spawn.XXXX6rOcmE/envdump”,其 UID 為 1005,GID 為 100:不允許操作 (errno=1)
經過一番探勘,我發現問題在於有兩個組名稱相同,但 GID 不同,如下面的命令所示:
$ getent group | grep users users:x:100: users:*:1001:asdf,sdafsdf,zzzz
重命名兩個組之一後,問題得到解決。
所以我的問題是:根據規範,同一系統上的兩個組具有相同的名稱是否有效,或者不是?
原因是如果它有效,我打算為乘客送出一個錯誤報告,因為它無法處理這種情況,如果它無效,那麼應該向 centos 報告一個錯誤。
忘記規範,並考慮在實踐中會發生什麼。主要需要注意的是文件系統權限,不包含組名,它們只包含整數組id。(底層系統呼叫是
chown()
,你可以gid_t
在參數列表中看到 。)因此,,
chgrp
,chown
或任何用於更改目錄組的工具,必須從使用者提供的名稱中找出正確的組 id。當您有兩個同名時,無法分辨出哪個是同名的。在 中的組中/etc/group
,您很可能總是獲得第一個。其他一些儲存使用者和組的方法甚至可能無法將相同的名稱儲存兩次,例如,如果它用於 LDAP DN 或其他類似的主鍵中。假設第一行生效,命名組
users
將解析為 GID 100,如果有問題的使用者是asdf
,他們將是組 1001 的成員,而不是組 100 的成員,並且chgrp
會失敗。
不,它無效;我不確定它是否在 POSIX 中明確說明,但該
chgrp
定義假定給定組名存在單個組 ID(如果有):團體
組數據庫中的組名或數字組 ID。要麼指定一個組 ID,要賦予由文件操作數之一命名的每個文件。如果組數據庫中存在數字組操作數作為組名,則與該組名關聯的組 ID 號用作組 ID。
以類似的方式,
getgrnam
只處理給定名稱的單個組。(從技術上講,如果多個組名指向同一個 id,則一切正常,儘管規範並不允許這樣做;但反之則不然。)