Linux—用戶新建目錄和文件的默認許可權設置:umask詳解
- 2021 年 3 月 28 日
- 筆記
- linux, linux umask值設置, linux新建目錄和文件的默認許可權, umask值修改, umask命令詳解, umask永久修改
關注微信公眾號:CodingTechWork,一起學習進步。
引言
我們有沒有思考過一個問題,在登錄Linux系統後,我們創建的目錄或者文件的許可權,為什麼每次創建都是統一的?我們做以下實驗:新建一個用戶userA,然後分別創建目錄dir01和dir02,文件t1.txt和t2.txt。
[root@linux01 ~]# useradd userA
[root@linux01 ~]# su - userA
[userA@linux01 ~]$ ll
total 0
[userA@linux01 ~]$ mkdir dir01
[userA@linux01 ~]$ mkdir dir02
[userA@linux01 ~]$ touch t1.txt
[userA@linux01 ~]$ touch t2.txt
[userA@linux01 ~]$ ll
total 8
drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir01
drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir02
-rw-r----- 1 userA userA 0 Mar 27 10:25 t1.txt
-rw-r----- 1 userA userA 0 Mar 27 10:25 t2.txt
從上述的實驗中發現,每次創建目錄的許可權都是drwxr-x---
,即為750
,文件的許可權都是-rw-r-----
即為640
。我們能想到的必定這是個默認許可權,那這個默認許可權由誰來控制?答案是:umask
。
[userA@linux01 ~]$ umask
0027
是的,我們可以通過umask來改變用戶的創建文件和目錄的默認許可權,Linux是注重安全性的OS,而安全離不開許可權的設置,對於創建新的目錄和文件設定必要的初始許可權是必不可少的,Linux和Windows在許可權一個很大的區別就是:Windows中,新建目錄和文件是繼承上級目錄許可權;Linux是通過使用umask設置的默認許可權給新建的目錄和文件賦予初始許可權。下面將一起走進umask的學習和使用。
umask
umask介紹
首先,我們要了解的是,Linux文件的最大許可權是666,目錄的最大許可權是777,為何目錄要比文件許可權大?因為目錄需要有執行權(x)才能夠進入到目錄中。
umask的作用是在用戶登錄Linux系統環境下,設置用戶創建目錄和文件的初始化許可權。
umask命令
語法:
umask [-p] [-S] [mode]
參數:-p
:表示完整列印umask內容。-S
:表示以符號形式顯示設置。mode
:表示設置許可權,mode和chmod的命令格式一樣。
示例:
[userA@linux01 ~]$ umask -p
umask 0027
[userA@linux01 ~]$ umask -S
u=rwx,g=rx,o=
[userA@linux01 ~]$ umask u=rw
[userA@linux01 ~]$ umask -p -S
umask -S u=rw,g=rx,o=
[userA@linux01 ~]$ umask -p
umask 0127
[userA@linux01 ~]$ umask u=rwx
[userA@linux01 ~]$ umask -p
umask 0027
[userA@linux01 ~]$ umask o=x
[userA@linux01 ~]$ umask -p
umask 0026
[userA@linux01 ~]$ umask -p -S
umask -S u=rwx,g=rx,o=x
umask存放位置
一般umask的值可以在/etc/profile
文件中定義。
# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
··· ···
··· ···
umask 027
其中,我們可以看到帳號UID>199
且UID=GID
且用戶名=用戶組名
時,umask值為002
,否則,umask值為022
。
umask 027
表示當前用戶的umask掩碼值設置為027。
umask值計算
上面一直在講umask掩碼值,那這個值究竟怎麼計算?或者說,這個掩碼值和目錄或文件的默認許可權關係是怎樣的?
[userA@linux01 ~]$ umask
0027
我們通過umask命令獲取到當前用戶的umask掩碼值為0027,為何是4位?其實真正有效的是後3位。第1位是代表文件所具有的特殊許可權(SetUID、SetGID、Sticky BIT)。
通過umask值我們可以反推出用戶新建目錄和文件的默認許可權是什麼。
原理
- 將目錄或文件的默認最高許可權(目錄777、文件666)和umask掩碼值都轉換為二進位。
- 對umask
取反
。 - 將兩個二進位值做
與運算
。 - 將與運算後的二進位值轉換為十進位,即為用戶的新建目錄或文件的默認許可權。
示例
目錄場景:
- 掩碼值:0022
- 目錄默認最高許可權:777
計算默認許可權:
- 轉為二進位:
777 = 0111 0111 0111
022 = 0000 0010 0010 - umask取反
NOT運算:1111 1101 1101 - 與運算
0111 0111 0111 總許可權777
1111 1101 1101 umask取反
====================
0111 0101 0101 新建目錄默認許可權 - 轉為十進位
0111 0101 0101=755
即該用戶新建目錄的默認許可權為755
,即為rwxr-xr-x
。
文件場景:
- 掩碼值:0022
- 目錄默認最高許可權:666
計算默認許可權:
- 轉為二進位:
666 = 0110 0110 0110
022 = 0000 0010 0010 - umask取反
NOT運算:1111 1101 1101 - 與運算
0110 0110 0110 總許可權666
1111 1101 1101 umask取反
====================
0110 0100 0100 新建目錄默認許可權 - 轉為十進位
0110 0100 0100 = 644
即該用戶新建目錄的默認許可權為644
,即為rw-r--r--
。
公式
按照umask計算的原理很麻煩,所以弄一個公式來總結計算如下:
目錄(文件)的初始許可權 = 目錄(文件)的最大默認許可權 - umask許可權
而這種公式方式需要注意分類:
-
目錄公式:
用戶目錄默認許可權 = 777 - umask值
-
文件公式:
1)偶數umask:用戶文件默認許可權 = 666 - umask偶數值
2)奇數umask:用戶文件默認許可權 = 666 - umask奇數值 + 1
示例
-
對照原理示例umask值=022,計算如下:
用戶目錄默認許可權:777-022=755
,即為rwxr-xr-x
。
用戶文件默認許可權:666-022=644
,即為rw-r--r--
。 -
對照引言中的實驗umask值=027,計算如下:
用戶目錄默認許可權:777-027=750
,即為drwxr-x---
。
用戶文件默認許可權:666-027+1=640
,即為-rw-r-----
。
umask值修改
暫時修改
暫時修改的方式,可以通過umask命令來更改,比如計算出許可權對應的umask值要改為027,則直接用該用戶登錄Linux系統後,使用命令umask 027
即可。但是,一旦用戶退出登錄後,umask將恢復默認值,剛才設置的將會失效。所以,這種umask命令方式,只是適合當前會話。
永久修改
除了使用umask命令進行當前會話的用戶默認許可權設置外,我們還可以對該用戶永久性修改umask值。針對某個用戶修改,需要用該用戶登錄Linux,然後修改/etc/profile文件中的umask值。
修改前:
[userA@linux01 ~]$ umask
0027
[userA@linux01 ~]$ vim /etc/profile
修改後:
[userA@linux01 ~]$ vim /etc/profile
[userA@linux01 ~]$ umask
0022
[userA@linux01 ~]$ mkdir dir03
[userA@linux01 ~]$ touch t3.txt
[userA@linux01 ~]$ ll
total 12
drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir01
drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir02
drwxr-xr-x 2 userA userA 4096 Mar 27 21:48 dir03
-rw-r----- 1 userA userA 0 Mar 27 10:25 t1.txt
-rw-r----- 1 userA userA 0 Mar 27 10:25 t2.txt
-rw-r--r-- 1 userA userA 0 Mar 27 21:48 t3.txt
明顯可以看出修改後,新建目錄和文件的許可權已經發生變化。
總結
如果我們登陸Linux系統後,新建目錄或者文件很多,且許可權都是某種特定的,則可以通過umask命令來暫時設置當前會話的默認許可權。如果後期需要永久性的可以修改/etc/profile
中的umask值。
當然,對於應用程式一些吐文件時需要先新建的目錄或者文件設置許可權時,我們為了安全方式,可能不能永久性修改umask值,但,我們可以在啟動腳本裡面加上umask 022
這種命令,來使得當前應用啟動時受到當前啟動腳本中的umask來控制應用程式輸出的文件或目錄的默認許可權。