umask這個接口在一些程序初始化的時候經常會見到,處于安全性,可以縮小進程落盤文件的權限。
1、linux文件系統的權限規則
文件的默認權限由系統決定(通常是 0666,即所有人可讀可寫)。
目錄的默認權限通常是 0777
(所有人可讀可寫可執行)。
實際創建的文件 / 目錄權限 = 默認權限 & ~mask(按位取反后與默認權限按位與)。
1. 權限的二進制與八進制對應
權限 | 二進制值 | 八進制值 | 符號表示 |
---|---|---|---|
讀 (Read) | 100 | 4 | r |
寫 (Write) | 010 | 2 | w |
執行 (Execute) | 001 | 1 | x |
無權限 | 000 | 0 | - |
2. 組合權限計算
通過二進制加法或八進制數值相加來組合多個權限:
- 可讀可寫 =
讀 (4)
+寫 (2)
=6
(二進制:110
)。 - 可讀可執行 =
讀 (4)
+執行 (1)
=5
(二進制:101
)。 - 讀寫執行全權限 =
4 + 2 + 1
=7
(二進制:111
)。
3. 用戶組與權限表示
權限分為三個用戶組:所有者 (Owner)、組用戶 (Group)、其他用戶 (Others),每個組對應一個八進制數:
- 文件權限示例:
0644
- 第一位
0
:八進制前綴。 - 第二位
6
(所有者):4 (r) + 2 (w)
= 可讀可寫。 - 第三位
4
(組用戶):4 (r)
= 只讀。 - 第四位
4
(其他用戶):4 (r)
= 只讀。 - 符號表示:
-rw-r--r--
。
- 第一位
- 目錄權限示例:
0755
- 所有者:
7 (rwx)
= 讀寫執行。 - 組用戶和其他用戶:
5 (r-x)
= 可讀可執行。 - 符號表示:
drwxr-xr-x
。
- 所有者:
4. 特殊權限位(SetUID/SetGID/Sticky)
特殊權限 | 二進制值 | 八進制值 | 符號表示(文件) | 符號表示(目錄) |
---|---|---|---|---|
SetUID | 1000 | 4 | s 或 S | s 或 S |
SetGID | 0100 | 2 | s 或 S | s 或 S |
Sticky Bit | 0010 | 1 | t 或 T | t 或 T |
SetUID(4)
- 作用:當文件被執行時,臨時獲得文件所有者的權限。
- 典型場景
/usr/bin/passwd
(修改密碼需要訪問/etc/shadow
,但普通用戶無權限)。
SetGID(2)
-
對 文件:執行時臨時獲得文件所屬組的權限。
-
對 目錄:在此目錄下創建的文件自動繼承目錄的組,而非創建者的主組。
-
典型場景:團隊共享目錄(如
chmod g+s /team_data
)。
Sticky Bit(1)
- 作用:僅文件所有者或 root 能刪除該文件,即使其他用戶有寫權限。
- 典型場景:公共目錄
/tmp
(權限通常為1777
,即drwxrwxrwt
)。
2、內核提供的接口
umask
是 Unix/Linux 系統中的一個系統調用,用于設置當前進程創建文件或目錄時的默認權限掩碼。
基本信息
- 頭文件:
#include <sys/stat.h>
- 函數原型:
mode_t umask(mode_t mask);
- 作用:設置當前進程的文件模式創建掩碼,并返回之前的掩碼值。
- 掩碼規則:新文件的實際權限 = 預設權限(如
0666
)按位與~umask
。
權限計算示例
文件類型 | 預設權限 | umask 值 | 實際權限計算 | 最終權限 |
---|---|---|---|---|
文件 | 0666 | 0022 | 0666 & (~0022) = 0644 | -rw-r–r– |
目錄 | 0777 | 0022 | 0777 & (~0022) = 0755 | drwxr-xr-x |
使用注意事項
- 永久性:
umask
設置僅對當前進程及其子進程有效,不會影響系統全局設置。 - 默認值:通常系統默認
umask
為0022
(屏蔽其他用戶的寫權限)。 - 目錄與文件差異:目錄默認權限通常為
0777
,文件默認權限為0666
(受限于系統限制,文件不能被設置為可執行)。
一些使用技巧
umask(server.umask = umask(0777));
這么寫可以安全地獲取并保存系統當前的 umask 值,同時避免多線程環境下的競態條件。