首頁 > 軟體

Linux umask 命令使用詳解

2020-06-16 16:44:32

新建一個檔案或目錄,它的預設許可權是什麼?如果要修改一個使用者建立的檔案和目錄的預設許可權該如何做?本文將介紹相關的內容。說明:本文演示的Linux環境為 Ubuntu 16.04。

檔案的預設許可權

為了檢視使用者建立的檔案和目錄的預設許可權,我們用一個普通的使用者建立檔案 myfile 和目錄 mydir 並檢視它們的預設許可權:

目錄的許可權為 775,檔案的許可權為 664。對比之下發現目錄比檔案多了執行的許可權。這是因為執行許可權對於目錄來說是非常重要的,有了目錄的執行許可權才能夠進入目錄中進行檔案操作。
預設情況下對於目錄來說最大的許可權是 777,對於檔案來說最大的許可權一般為 666(只有可以執行的檔案才新增可執行許可權)。所以我們建立的檔案和目錄的共同特點是從最大許可權中減去了 2,也就是其他使用者的寫許可權。而這個被減去的值就是我們常說的 umask。umask 還是 bash 的一個內建命令,預設輸出當前使用者的 umask 值:

注意,umask 顯示的值為從預設的最大許可權中減去的值。上圖中的第一個 0 表示的是特殊許可權位,這裡我們可以暫時忽略它。

系統的預設策略(Ubuntu16.04)
系統在使用者登入時通過 login 程式呼叫 pam_umask 模組設定使用者預設的 umask。從 login 程式的組態檔 /etc/login.defs 中我們可以找到 umask 相關的設定:

# UMASK is the default umask value for pam_umask and is used by
# useradd and newusers to set the mode of the new home directories.
# 022 is the "historical" value in Debian for UMASK
# 027, or even 077, could be considered better for privacy
# There is no One True Answer here : each sysadmin must make up his/her
# mind.
#
# If USERGROUPS_ENAB is set to "yes", that will modify this UMASK default value
# for private user groups, i. e. the uid is the same as gid, and username is
# the same as the primary group name: for these, the user permissions will be
# used as group permissions, e. g. 022 will become 002.
#
# Prefix these values with "0" to get octal, "0x" to get hexadecimal.
#
UMASK          022
……..
# Enable setting of the umask group bits to be the same as owner bits
# (examples: 022 -> 002, 077 -> 007) for non-root users, if the uid is
# the same as gid, and username is the same as the primary group name.
#
# If set to yes, userdel will remove the user´s group if it contains no
# more members, and useradd will create by default a group with the name
# of the user.
#
USERGROUPS_ENAB yes

乍一看上面的設定資訊,使用者的預設 umask 應該是 022 才對啊。仔細地閱讀相關的說明資訊發現,當 USERGROUPS_ENAB 被設定為 yes 時(預設值),對於 uid 和 gid 相同且使用者名稱和主組名相同的使用者,系統會把其 umask 改為 002。所以我們看到使用者 nick 的 umask 為 002。
由於 root 使用者的特殊性,它預設的 umask 與其它使用者是不同的,其值為 022:

umask 命令

umask 是 bash 的一個內建命令,用來顯示或設定新建檔案/目錄的許可權掩碼(umask)。前面我們以數位的方式輸出了使用者預設的 umask 值,這次我們以符號的方式進行輸出:

$ umask -S

以符號輸出的就是使用者建立目錄時的預設許可權,算一下,其實就是 775。

為了改變使用者建立的檔案/目錄的預設值,我們可以改變 umask 的預設值。
設定 umask 值
最簡單的方式就是為 umask 命令指定一個數位:

$ umask 026

026 的含義為:去掉 group 中的寫許可權,去掉 other 中的讀寫許可權。

這時建立的檔案許可權為 640,目錄許可權為 751。注意,修改 umask 後只有新建的檔案和目錄受影響,已經存在的檔案和目錄的許可權不會被影響。

以符號的方式設定 umask 值
比如下面的命令:

$ umask u=, g=w, o=rwx

上面的命令表示從 group 中去掉寫許可權,從 other 中去掉讀寫執行的許可權。
注意:"=" 號在 umask 命令和 chmod 命令中的作用恰恰相反。在 chmod 命令中,利用它來設定指定的許可權,而其餘許可權則被刪除。但是在 umask 命令中,將在原有許可權的基礎上刪除指定的許可權。

在 ~/.bashrc 檔案中為使用者設定預設的 umask
如果讓使用者每次登陸後都執行 umask 命令修改預設的 umask 值是不科學的,我們可以在使用者的 ~/.bashrc 檔案中執行 umask 命令,這樣使用者登入後 umask 的值自動就變成了設定的值。把下面的命令新增到 ~/.bashrc 檔案的最後一行:
umask 026
儲存後重新登入一次,然後檢視 umask 的值:

檔案和目錄的建立

下面通過 strace 來跟蹤檔案和目錄建立的過程,看看 mask 是如何影響它們的建立操作的。
建立一個檔案

$ umask 077; strace -eopen touch testfile 2>&1 | tail -2; ls -l testfile

上圖中 open 函數使用 666 許可權建立檔案,但是由於設定了 umask 為 077,所以核心在建立檔案時移除了 group 和 other 的 rwx 許可權,最終建立的檔案許可權為 600。

建立一個目錄

$ umask 022; strace -emkdir mkdir testdir; ls -ld testdir

 

上圖中 mkdir 函數使用 777 許可權建立目錄,但是由於設定了 umask 為 022,核心最終建立的目錄許可權為 755。

umask 與 ACL

如果一個目錄沒有被設定 default ACL,那麼將由 umask 決定新檔案的 ACL 許可權。這種情況其實就是我們常見的沒有 ACL 許可權時的情況。比如我們設定 umask 為 026,那麼建立的檔案和目錄的許可權就是由它決定的。

如果一個目錄被設定了 default ACL,那麼將會由檔案建立函數的 mode 引數和目錄的 default ACL 共通決定新檔案的 ACL 許可權,此時 umask 被忽略。還以 umask 026 為例,我們建立一個目錄 dir2 並設定 default ACL 許可權:

$ setfacl -m d:u:tester:rwx dir2

然後在 dir2 目錄中建立檔案 testfile:

這次 testfile 的許可權已經不受 umask 的影響了!

總結

umask 是一個看似簡單實則影響重大的命令,根據實際需求設定好 umask 不僅能夠保護系統的安全,還會讓操作變得輕鬆(少一些 Permission denied)。


IT145.com E-mail:sddin#qq.com