一、預設許可權 每一個終端都有一個 umask 屬性,是用來確定新建文件或目錄的預設許可權的許可權“掩碼”(mask 有“掩碼”的含義,至於 u,後面說)。 Linux 中一般有預設的許可權掩碼,使用命令 umask 用以查看或設置: 一般地,普通用戶(uid 為 500 以上)的許可權掩碼預設為 0002, ...
一、預設許可權
每一個終端都有一個 umask 屬性,是用來確定新建文件或目錄的預設許可權的許可權“掩碼”(mask 有“掩碼”的含義,至於 u,後面說)。
Linux 中一般有預設的許可權掩碼,使用命令 umask 用以查看或設置:
umask 0022 帶許可權值是設置,否則是查看
一般地,普通用戶(uid 為 500 以上)的許可權掩碼預設為 0002,root 用戶(uid 為 0)的許可權掩碼預設為 0022。
如果新建了一個文件或目錄,那麼這個文件或目錄的預設許可權等於 文件或目錄的預設最高許可權 & (~ umask) 。
那麼,“文件或目錄的預設最高許可權”是多少呢?一般來說,目錄的預設最高許可權是 0777,文件的預設最高許可權為 0666(去掉了 x 許可權,禁止執行,安全考慮)。註意:Linux 的許可權值是八進位的!所以,網上的某些所謂十進位減法運算來計算新建文件或目錄預設許可權的邏輯是錯誤的。還有什麼分情況討論的,在我看來實在麻煩。用電腦思維來理解電腦,這是我認為最合理、最準確且最簡單的思維方式。
怎麼記憶和理解這個運算邏輯?
umask ,我把它的中文全稱記為用於“位取反的許可權掩碼”。“位取反” 來自 "u",“掩碼” 來自 "mask" 。拿這個位取反的許可權掩碼(~ umask)跟預設最高許可權相與 "&",就得到了新建文件(或目錄)的預設許可權。
怎麼理解?
這裡主要是“掩碼”:掩碼是用來和目標數進行邏輯與 "&" 運算,取得目標數里跟掩碼的位均為 1 的位組合,並將跟掩碼中位為 0 的對應位全部丟棄。掩碼的原理是邏輯與的原理,任何數和 1 相與都是它本身,任何數和 0 相與都是 0。而一個數跟掩碼的反碼(位取反)進行邏輯與,得到結果恰恰相反,結果是保留這個數里跟掩碼里位為 0 相對應的位,丟棄跟掩碼里位為1 相對應的位。
這裡的 umask 就是這個作用,用預設最高許可權跟取反的 umask 相與,就從預設最高許可權里丟棄了 umask 不允許的許可權。所以並不是簡單的十進位減法運算,例如 umask 值為 0022 和 0033 的時候,普通用戶新建文件的預設許可權都是 0644(因為 0666 & (~ 0022) 和 0666 & (~ 0033) 的運算結果是一樣的),用 rwx 符號表示就是 -rw-r--r-- 。
二、特殊許可權
除了普通許可權外,還有三個特殊許可權:
許可權 | 對文件的影響 | 對目錄的影響 |
suid |
以文件的所屬用戶身份執行, 而非執行文件的用戶 |
無 |
sgid |
以文件所屬組身份執行 |
在該目錄中創建的任意新文件的 所屬組與該目錄的所屬組相同, 即子文件自動繼承該目錄的所屬組 |
sticky | 無 |
對目錄擁有寫入許可權的用戶僅可以 刪除其擁有的文件,無法刪除其他 用戶所擁有的文件 |
擁有suid許可權的passwd命令
Linux 中普通用戶的密碼口令都保存在 /etc/shadow 文件里,這個文件的許可權是只有root用戶和root組才可以訪問的。那麼普通用戶使怎麼修改自己密碼的呢?Linux 提供了 passwd 命令普通用戶使用來實現自己的密碼:
我們看到,這個 passwd 的 U 許可權里有個 "s" 占用了原來的 "x"位,這表示執行該命令的用戶擁有 "suid" 許可權,以 root 用戶身份來運行,所以普通用戶可以通過執行 passwd 命令的來修改自己的密碼,並將它寫到 /etc/shadow 文件里。
三、設置特殊許可權
設置 suid:
chmod u+s filename
設置 sgid:
chmod g+s filename
設置 sticky:
chmod o+t filename
其中,設置 sgid 許可權會使 "s" 占用 G 許可權的 "x" 位,例如:"-rwxr-s---";設置 sticky 許可權會使 "t" 占用 O 許可權的 "x" 位,例如:"drwxr-xr-t"。這裡我所說的 G 許可權、O 許可權是基於 UGO 模型的 Linux 許可權。
一般來說,我們使用 sgid 來設置目錄的許可權,它允許了目錄的子文件(或目錄)自動繼承該目錄的所屬組,常見的情況例如市場部目錄的員工目錄自動屬於市場部用戶組。經常使用 sticky 來設置目錄下的用戶可以刪除自己的文件,但不能刪除別人的文件,例如營銷部目錄的員工文件可以被員工刪除,但不能刪除同事的文件。
與普通許可權一樣,特殊許可權也可以用八進位數值表示:
suid = 4 (2 ^ 2) sgid = 2 (2 ^ 1) sticky = 2 (2 ^ 0)
所以,我們也可以通過以下命令設置:
chmod 4755 filename 普通許可權755,所屬用戶可讀可寫可執行,所屬組和其他用戶不可寫,特殊許可權允許以所屬用戶身份執行