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