2021-05-12 14:32:11
Linux umask 命令使用詳解
新建一個檔案或目錄,它的預設許可權是什麼?如果要修改一個使用者建立的檔案和目錄的預設許可權該如何做?本文將介紹相關的內容。說明:本文演示的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)。
相關文章