Debian

使用 chmod 數字模式取消設置 setgid 位

  • September 20, 2017

chmod在取消設置 setgid 位時,我剛剛注意到一些有趣的行為:

$ mkdir test
$ chmod 2755 test
$ stat -c '%a %n' test
2755 test  # as expected
$ chmod 0755 test
$ stat -c '%a %n' test
2755 test  # what? see below
$ chmod 00755 test
$ stat -c '%a %n' test
755 test  # double what?!

嘗試取消設置 setgid 位chmod 0755不起作用,這令人驚訝。但是,手冊頁表明這是預期的行為:

設置和設置位

如果文件的組 ID 與使用者的有效組 ID 或使用者的補充組 ID 之一不匹配,則 chmod 清除正常文件的 set-group-ID 位,除非使用者具有適當的權限。其他限制可能會導致 MODE 或 RFILE 的 set-user-ID 和 set-group-ID 位被忽略。此行為取決於底層 chmod 系統呼叫的策略和功能。如有疑問,請檢查底層系統行為。

chmod 保留目錄的 set-user-ID 和 set-group-ID 位,除非您另外明確指定。您可以使用 u+s 和 gs 等符號模式設置或清除位,並且可以使用數字模式設置(但不清除)位。

(重點補充)

所以它似乎chmod 0755並不意味著取消設置 setgid 位。但是,為什麼不chmod 00755設置它呢?數字模式的五位chmod數字似乎沒有任何用處。再次來自手冊頁:

數字模式是從1 到 4 個八進制數字 (0-7),通過將具有值 4、2 和 1 的位相加得出。省略的數字假定為前導零。

(重點補充)

這裡發生了什麼?為什麼會chmod決定忽略單個前導 0?為什麼它忽略兩個前導 0?

(Debian Stretch 9.1,帶有 chmod (GNU Coreutils) 8.6)

我找到了!手冊頁中缺少此資訊,但在 Coreutils 線上手冊中。以機智:

在大多數係統上,如果設置了目錄的 set-group-ID 位,則新創建的子文件會繼承與目錄相同的組,而新創建的子目錄會繼承父目錄的 set-group-ID 位。在少數係統上,目錄的 set-user-ID 位對新子文件的所有權和新子目錄的 set-user-ID 位有類似的影響。這些機制通過減少使用chmodchown共享新文件的需要,讓使用者更輕鬆地共享文件。

這些便利機制依賴於目錄的 set-user-ID 和 set-group-ID 位。如果命令喜歡chmodmkdir定期清除目錄上的這些位,則該機制將不那麼方便,並且更難以共享文件。因此,命令 likechmod不會影響目錄的 set-user-ID 或 set-group-ID 位,除非使用者以符號模式特別提及它們,或使用運算符數字模式,例如 ‘=755’,或設置它們在數字模式下,或在具有五個或更多八進制數字的數字模式下清除它們。

參考:https ://www.gnu.org/software/coreutils/manual/html_node/Directory-Setuid-and-Setgid.html

引用自:https://unix.stackexchange.com/questions/393531