Linux—用戶新建目錄和文件的默認許可權設置: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>199UID=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值我們可以反推出用戶新建目錄和文件的默認許可權是什麼。

原理

  1. 將目錄或文件的默認最高許可權(目錄777、文件666)和umask掩碼值都轉換為二進位。
  2. 對umask取反
  3. 將兩個二進位值做與運算
  4. 將與運算後的二進位值轉換為十進位,即為用戶的新建目錄或文件的默認許可權。

示例

目錄場景

  • 掩碼值:0022
  • 目錄默認最高許可權:777

計算默認許可權:

  1. 轉為二進位:
    777 = 0111 0111 0111
    022 = 0000 0010 0010
  2. umask取反
    NOT運算:1111 1101 1101
  3. 與運算
    0111 0111 0111 總許可權777
    1111 1101 1101 umask取反
    ====================
    0111 0101 0101 新建目錄默認許可權
  4. 轉為十進位
    0111 0101 0101=755
    即該用戶新建目錄的默認許可權為755,即為rwxr-xr-x

文件場景

  • 掩碼值:0022
  • 目錄默認最高許可權:666

計算默認許可權:

  1. 轉為二進位:
    666 = 0110 0110 0110
    022 = 0000 0010 0010
  2. umask取反
    NOT運算:1111 1101 1101
  3. 與運算
    0110 0110 0110 總許可權666
    1111 1101 1101 umask取反
    ====================
    0110 0100 0100 新建目錄默認許可權
  4. 轉為十進位
    0110 0100 0100 = 644
    即該用戶新建目錄的默認許可權為644,即為rw-r--r--

公式

  按照umask計算的原理很麻煩,所以弄一個公式來總結計算如下:

  • 目錄(文件)的初始許可權 = 目錄(文件)的最大默認許可權 - umask許可權

  而這種公式方式需要注意分類:

  • 目錄公式:
    用戶目錄默認許可權 = 777 - umask值

  • 文件公式:
    1)偶數umask:用戶文件默認許可權 = 666 - umask偶數值
    2)奇數umask:用戶文件默認許可權 = 666 - umask奇數值 + 1

示例

  1. 對照原理示例umask值=022,計算如下:
    用戶目錄默認許可權:777-022=755,即為rwxr-xr-x
    用戶文件默認許可權:666-022=644,即為rw-r--r--

  2. 對照引言中的實驗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

/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來控制應用程式輸出的文件或目錄的默認許可權。