為什麼不能使用 chmod 透過八進位表示法清除 setuid/setgid/sticky 位元?

為什麼不能使用 chmod 透過八進位表示法清除 setuid/setgid/sticky 位元?

今天上班時,管理階層隨機出現,要我給一群工程師上一門關於使用 Linux 的速成課程。顯然,他們已經聽到了我與 Microsoft 的分歧(由於 Win 10 隱私和安全問題),現在我是任何事情的常駐「專家」*nix。

在向小組解釋了 Linux 的簡單之美之後,提出了有關檔案權限的問題。我解釋了chmod用於分配權限的使用者群組世界八進制語法。

然後是 setuid/setgid/sticky 位元——我用一個簡單的例子進行演示,chmod 2755 somefile.txt並指出 setgid 位元現在已啟用。為了清除該位,我發出chmod 0755,但令我沮喪的是 setgid 位仍然存在。什麼?我知道我以前曾使用過該語法來清除黏性位元(儘管可能是十年前)。當我談論完這個設計有多優雅之後,我發現它不起作用,這真是令人尷尬。

不管怎樣,我還向他們展示了替代的g+s速記g-s法,並發現它g-s確實有效。

演示結束後,我以為我發現了一個錯誤chmod,但在查看man頁面後,我發現該行為是“設計使然”,因為有一個明確的註釋說明chmod可用於設置粘性標誌,但不能清除它們。

chmod為什麼使用八進位表示法清除黏性位的功能被刪除了?我用谷歌搜索,發現有些人說前導零“令人困惑”,應該省略。真的嗎?按照這種邏輯,我們不妨說位元組(例如 ASCII 代碼)包含前導「0」位元是非法的,因為它「令人困惑」。覺得前導零令人困惑的人可以使用符號表示法。想要使用八進位表示法的人應該能夠使用八進制。

為什麼chmod不支援八進位表示法來清除黏滯位?

答案1

問題是,在引入黏性位元之前,已經有許多 shell 腳本等只使用了三個八進制數字(或更少)。此外,任何數字都可以用前導零填充的慣例是相當根深蒂固的。

因此,如果允許帶有前導零的八進制形式重置黏性位,許多腳本會意外地重置黏滯位。調試這將是一場噩夢,因此最終chmod會受到無法以八進制形式重置黏性位的限制。畢竟,如果您確實想重置它們(這種情況很少發生),您始終可以使用替代形式。

因此,就像許多令人驚訝的複雜性形式一樣,答案是「向後相容性」。

相關內容