linux之umask權(quán)限掩碼解讀
umask這個接口在一些程序初始化的時候經(jīng)常會見到,處于安全性,可以縮小進(jìn)程落盤文件的權(quán)限。
linux文件系統(tǒng)的權(quán)限規(guī)則
文件的默認(rèn)權(quán)限由系統(tǒng)決定(通常是 0666,即所有人可讀可寫)。
目錄的默認(rèn)權(quán)限通常是 0777(所有人可讀可寫可執(zhí)行)。
實(shí)際創(chuàng)建的文件 / 目錄權(quán)限 = 默認(rèn)權(quán)限 & ~mask(按位取反后與默認(rèn)權(quán)限按位與)。
1. 權(quán)限的二進(jìn)制與八進(jìn)制對應(yīng)
| 權(quán)限 | 二進(jìn)制值 | 八進(jìn)制值 | 符號表示 |
|---|---|---|---|
| 讀 (Read) | 100 | 4 | r |
| 寫 (Write) | 010 | 2 | w |
| 執(zhí)行 (Execute) | 001 | 1 | x |
| 無權(quán)限 | 000 | 0 | - |
2. 組合權(quán)限計算
通過二進(jìn)制加法或八進(jìn)制數(shù)值相加來組合多個權(quán)限:
- 可讀可寫 =
讀 (4)+寫 (2)=6(二進(jìn)制:110)。 - 可讀可執(zhí)行 =
讀 (4)+執(zhí)行 (1)=5(二進(jìn)制:101)。 - 讀寫執(zhí)行全權(quán)限 =
4 + 2 + 1=7(二進(jìn)制:111)。
3. 用戶組與權(quán)限表示
權(quán)限分為三個用戶組:所有者 (Owner)、組用戶 (Group)、其他用戶 (Others),每個組對應(yīng)一個八進(jìn)制數(shù):
文件權(quán)限示例:0644
- 第一位
0:八進(jìn)制前綴。 - 第二位
6(所有者):4 (r) + 2 (w)= 可讀可寫。 - 第三位
4(組用戶):4 (r)= 只讀。 - 第四位
4(其他用戶):4 (r)= 只讀。 - 符號表示:
-rw-r--r--。
目錄權(quán)限示例:0755
- 所有者:
7 (rwx)= 讀寫執(zhí)行。 - 組用戶和其他用戶:
5 (r-x)= 可讀可執(zhí)行。 - 符號表示:
drwxr-xr-x。
4. 特殊權(quán)限位(SetUID/SetGID/Sticky)
| 特殊權(quán)限 | 二進(jìn)制值 | 八進(jìn)制值 | 符號表示(文件) | 符號表示(目錄) |
|---|---|---|---|---|
| SetUID | 1000 | 4 | s 或 S | s 或 S |
| SetGID | 0100 | 2 | s 或 S | s 或 S |
| Sticky Bit | 0010 | 1 | t 或 T | t 或 T |
SetUID(4)
- 作用:當(dāng)文件被執(zhí)行時,臨時獲得文件所有者的權(quán)限。
- 典型場景:
/usr/bin/passwd(修改密碼需要訪問/etc/shadow,但普通用戶無權(quán)限)。
SetGID(2)
- 對 文件:執(zhí)行時臨時獲得文件所屬組的權(quán)限。
- 對 目錄:在此目錄下創(chuàng)建的文件自動繼承目錄的組,而非創(chuàng)建者的主組。
- 典型場景:團(tuán)隊共享目錄(如
chmod g+s /team_data)。
Sticky Bit(1)
- 作用:僅文件所有者或 root 能刪除該文件,即使其他用戶有寫權(quán)限。
- 典型場景:公共目錄
/tmp(權(quán)限通常為1777,即drwxrwxrwt)。
內(nèi)核提供的接口
umask 是 Unix/Linux 系統(tǒng)中的一個系統(tǒng)調(diào)用,用于設(shè)置當(dāng)前進(jìn)程創(chuàng)建文件或目錄時的默認(rèn)權(quán)限掩碼。
基本信息
- 頭文件:
#include <sys/stat.h> - 函數(shù)原型:
mode_t umask(mode_t mask); - 作用:設(shè)置當(dāng)前進(jìn)程的文件模式創(chuàng)建掩碼,并返回之前的掩碼值。
- 掩碼規(guī)則:新文件的實(shí)際權(quán)限 = 預(yù)設(shè)權(quán)限(如
0666)按位與~umask。
權(quán)限計算示例
| 文件類型 | 預(yù)設(shè)權(quán)限 | umask 值 | 實(shí)際權(quán)限計算 | 最終權(quán)限 |
|---|---|---|---|---|
| 文件 | 0666 | 0022 | 0666 & (~0022) = 0644 | -rw-r–r– |
| 目錄 | 0777 | 0022 | 0777 & (~0022) = 0755 | drwxr-xr-x |
使用注意事項(xiàng)
- 永久性:
umask設(shè)置僅對當(dāng)前進(jìn)程及其子進(jìn)程有效,不會影響系統(tǒng)全局設(shè)置。 - 默認(rèn)值:通常系統(tǒng)默認(rèn)
umask為0022(屏蔽其他用戶的寫權(quán)限)。 - 目錄與文件差異:目錄默認(rèn)權(quán)限通常為
0777,文件默認(rèn)權(quán)限為0666(受限于系統(tǒng)限制,文件不能被設(shè)置為可執(zhí)行)。
一些使用技巧
umask(server.umask = umask(0777));
這么寫可以安全地獲取并保存系統(tǒng)當(dāng)前的 umask 值,同時避免多線程環(huán)境下的競態(tài)條件。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Ubuntu LTS服務(wù)器部署Jenkins詳細(xì)介紹
這篇文章主要介紹了Ubuntu LTS服務(wù)器部署Jenkins詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-03-03
CentOS 6.4安裝配置LNMP服務(wù)器(Nginx+PHP+MySQL)
這篇文章主要介紹了CentOS 6.4下配置LNMP服務(wù)器的詳細(xì)步驟,需要的朋友可以參考下2013-06-06
centos7.2.1511安裝jdk1.8.0_151及mysql5.6.38的方法
這篇文章主要介紹了centos7.2.1511安裝jdk1.8.0_151及mysql5.6.38的方法,較為詳細(xì)的講述了centos7.2.1511安裝jdk1.8.0_151及mysql5.6.38的具體步驟與相關(guān)設(shè)置技巧,需要的朋友可以參考下2018-01-01
CentOS6.5與CentOS7 ssh修改默認(rèn)端口號的方法
這篇文章主要介紹了CentOS6.5與CentOS7 ssh修改默認(rèn)端口號的方法,結(jié)合實(shí)例形式分別描述了CentOS6.5及CentOS7針對ssh修改默認(rèn)端口號的具體操作步驟、相關(guān)命令與使用技巧,需要的朋友可以參考下2018-04-04
Linux的/etc/hosts文件的基礎(chǔ)知識和在實(shí)用指南
在 Linux 和 Unix 系統(tǒng)中,/etc/hosts 文件扮演著一個至關(guān)重要的角色,在網(wǎng)絡(luò)和系統(tǒng)管理中,了解如何正確使用這個文件能夠大大提升效率和靈活性,本文將深入探討 /etc/hosts 文件的用途、結(jié)構(gòu)和實(shí)際應(yīng)用,需要的朋友可以參考下2026-02-02
Linux實(shí)現(xiàn)DHCP服務(wù)器的搭建
Linux常見的服務(wù)器有幾種,本文詳細(xì)介紹了Linux實(shí)現(xiàn)DHCP服務(wù)器的搭建,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
linux下shell腳本啟動jar包實(shí)現(xiàn)過程
確保APP_NAME和LOG_FILE位于目錄內(nèi),首次啟動前需手動創(chuàng)建log文件夾,否則報錯,此為個人經(jīng)驗(yàn),供參考,歡迎支持腳本之家2025-07-07
linux保留端口避免被隨機(jī)分配占用方式(ip_local_reserved_ports)
文章分析Nginx服務(wù)器偶發(fā)端口沖突問題,指出因端口復(fù)用機(jī)制導(dǎo)致的連接數(shù)虛高現(xiàn)象,提出通過擴(kuò)大端口范圍、保留特定端口及分離Nginx與應(yīng)用服務(wù)部署的解決方案,強(qiáng)調(diào)端口動態(tài)分配特性與實(shí)際資源消耗的差異2025-09-09

