umask 默認權(quán)限是 Linux 權(quán)限的一種,主要用于讓 Linux 中的新建文件和目錄擁有默認權(quán)限。Linux 是一個比較安全的操作系統(tǒng),而安全的基礎(chǔ)就是權(quán)限,所以,在 Linux 中所有的文件和目錄都要有基本的權(quán)限,新建的文件和目錄當然也要有默認的權(quán)限。
在 Linux 中,通過 umask 默認權(quán)限來給所有新建立的文件和目錄賦予初始權(quán)限,這一點和 Windows 不太一樣,Windows 是通過繼承上級目錄的權(quán)限來給文件和目錄賦予初始權(quán)限的。
査看系統(tǒng)的 umask 權(quán)限:
[root@localhost ~]# umask
0022
#用八制數(shù)值顯示umask權(quán)限
[root@localhost ~]# umask -S
u=rwx, g=rx, o=rx
#用字母表示文件和目錄的初始權(quán)限
使用"-S"選項,會直接用字母來表示文件和目錄的初始權(quán)限。我們査看數(shù)值的 umask 權(quán)限,看到的是 4 位數(shù)字"0022",其中第一個數(shù)字"0"代表的是文件的特殊權(quán)限(SetUID、SetGID、Sticky BIT),特殊權(quán)限我們放在后續(xù)章節(jié)來詳細講解,現(xiàn)在先不討論。也就是后 3 位數(shù)字"022"才是真正的 umask 默認權(quán)限。
umask默認權(quán)限的計算方法
在學(xué)習(xí) umask 默認權(quán)限的計算方法之前,我們需要先了解一下新建文件和目錄的默認最大權(quán)限。
對文件來講,新建文件的默認最大權(quán)限是 666,沒有執(zhí)行(x)權(quán)限。這是因為執(zhí)行權(quán)限對文件來講比較危險,不能在新建文件的時候默認賦予,而必須通過用戶手工賦予。
對目錄來講,新建目錄的默認最大權(quán)限是 777。這是因為對目錄而言,執(zhí)行(x)權(quán)限僅僅代表進入目錄,所以即使建立新文件時直接默認賦予,也沒有什么危險。
接下來我們學(xué)習(xí)如何計算 umask 默認權(quán)限。按照官方的標準算法,umask 默認權(quán)限需要使用二進制進行邏輯與和邏輯非聯(lián)合運算才可以得到正確的新建文件和目錄的默認權(quán)限。這種方法既不好計算,也不好理解,筆者并不推薦。
我們在這里還是按照權(quán)限字母來講解 umask 權(quán)限的計算方法。我們就按照默認的 umask 值是 022 來分別計算一下新建文件和目錄的默認權(quán)限吧。
文件的默認權(quán)限最大只能是 666,換算成字母就是"-rw-rw-rw-";而 umask 的值是 022,也換算成字母就是"-----w--w-"。把兩個字母權(quán)限相減,得到的就是新建文件的默認權(quán)限:(-rw-rw-rw-) - (-----w--w-)=(-rw-r--r--)。
目錄的默認權(quán)限最大可以是 777,換算成字母就是"drwxrwxrwx";而 umask 的值是022,也換算成字母就是"d----w--w-"。也把兩個字母權(quán)限相減,得到的就是新建目錄的默認權(quán)限:(drwxrwxrwx) - (d----w--w-)=(drwx-r-xr-x)。
我們測試一下:
[root@localhost ~]# umask 0022
#默認umask的值是0022
[root@localhost ~]# touch laowang
[root@localhost ~]# mkdir fengjie
[root@localhost ~]# ll -d laowang fengjie/drwxr-xr-x 2 root root 4096 6月 16 02:36 fengjie/ -rw-r--r-- 1 root root 0 6月 16 02:36 laowang#新建立目錄的默認權(quán)限是755,新建立文件的默認權(quán)限是644注意,這里強調(diào)一下,umask 默認權(quán)限的計算是不能直接使用數(shù)字相減的。很多人會理解為,既然文件的默認權(quán)限最大是"666",umask 的值是"022",而新建文件的值剛好是"644",那是不是就是直接使用"666-644"呢?
這是不對的,如果 umask 的值是"033"呢?按照數(shù)值相減,就會得到"633"的值。但是我們強調(diào)過文件是不能在新建立時就擁有執(zhí)行(x)權(quán)限的,而權(quán)限"3"是包含執(zhí)行(x)權(quán)限的。我們測試一 下:
[root@localhost ~]# umask 033
#修改umask的值為033
[root@localhost ~]# touch xuejie
#建立測試文件xuejie
[root@localhost ~]# ll xuejie
-rw-r--r-- 1 root root 0 6月 16 02:46 xuejie#xuejie文件的默認權(quán)限依然是644
由這個例子我們可以知道,umask 默認權(quán)限一定不是使用權(quán)限數(shù)字相減得到的,而是通過二進制邏輯與和邏輯非聯(lián)合運算得到的。最簡單的辦法還是使用權(quán)限字母來計算。
文件的默認權(quán)限最大只能是 666,換算成字母就是"-rw-rw-rw-";而 umask 的值是 033,也換算成字母就是"-----wx-wx"。把兩個字母權(quán)限相減,得到的就是新建文件的默認權(quán)限:(-rw-rw-rw-)-(-----wx-wx)=(-rw-r--r--)。
umask 默認權(quán)限的修改方法
umask 默認權(quán)限可以直接通過命令來進行修改,例如:
[root@localhost ~]# umask 002
[root@localhost ~]# umask 033
不過,通過命令進行的修改只能臨時生效,一旦重啟或重新登錄就會失效。如果想讓修改永久生效,則需要修改對應(yīng)的環(huán)境變量配置文件 /etc/profile。例如:
[root@localhost ~]# vi /etc/profile
...省略部分內(nèi)容...
if [ $UID -gt 199]&&[ "'id -gn'" = "'id -un'" ]; then umask 002#如果UID大于199(普通用戶),則使用此umask值else
umask 022
#如果UID小于199(超級用戶),則使用此umask值fi
…省略部分內(nèi)容…
這是一段 Shell 腳本,大家目前可能看不懂,但是沒有關(guān)系,只需知道普通用戶的 umask 值由 if 語句的第一段定義,而超級用戶的 umask 值由 else 語句定義即可。 如果修改的是這個文件,則 umask 值是永久生效的。
我們學(xué)習(xí)了文件的基本權(quán)限和 umask 默認權(quán)限這兩種權(quán)限,但是 Linux 的權(quán)限并不只有這兩種,其他的權(quán)限內(nèi)容我們會在后續(xù)章節(jié)中介紹,這里就不一一列舉了。