1. 程式人生 > >(轉)深入淺出linux系統umask值及其對應的文件權限講解

(轉)深入淺出linux系統umask值及其對應的文件權限講解

答案 聲明 建議 小結 content inux運維 思維 感謝51cto ide

深入淺出linux系統umask值及其對應的文件權限講解

原文:http://blog.51cto.com/oldboy/1060032

緣起:
1、此文的撰寫特別為感謝51cto的博客工作人員和領導,老男孩博客很榮幸的成為了專家博客,老男孩責任更重了,爭取以後加油為大家分享文章。
2、老男孩本人駕駛考試今天正好拿到本(歷時2個月,完全靠實力通過,補考一次)。
3、有一些網友和學生總糾結這個umask問題,到處搜索也找不到好的說明文章。
另:本文最值得博友思考的地方不是內容,而是勤於思考並較周全的努力實踐的學習心態,然後能夠自我下一個比較準確結論的學習記憶的思路,打個比方吧,金庸的小說大家很難記,那麽把它搞成對聯後就沒人能忘記掉了了。在學習linux運維方向同樣如此,我們應該多模擬設定一些試驗場景去驗證測試,最後總結一個自己能牢記住的小結論,這才是學習linux的最佳途徑。


本文省略了對linux文件權限和umask基本知識的介紹,有需要的了解的博友可以參看其他資料。

1)簡單好用的加減法計算(老男孩推薦)

特別說明:第一種計算法簡單、易用、好記,但是由於大部分網友都直接用減法(不考慮此方法的特殊性而被批判)或被某些書籍誤導甚至不相信不敢用這個方法了。其實,學習就是一個記憶的思路而已,沒有對錯,就是多思考多實踐,然後,總結一個小技巧結論,有利於自己學習記憶就夠了。

最後,老男孩想說的是學習總結結論不是做科學,所以,未必就需要那麽嚴謹,有偽科學的小結論很正常(但追求嚴謹的心態必須要有),例如:nginx服務配置的標準是什麽,mysql優化的標準是什麽,裝linux系統選擇安裝包的標準是什麽,給系統分區的標準是什麽,其實,這些都是沒標準答案的,但是這不影響我們學好linux運維,這就是老男孩傳導給大家的思維。

文件權限計算小結論:

創建文件默認最大權限為666 (-rw-rw-rw-),默認創建的文件沒有可執行權限x位。

對於文件來說,umask的設置是在假定文件擁有八進制666的權限上進行的,文件的權限就是666減去umask(umask的各個位數字也不能大於6,如,077就不符合條件)的掩碼數值;重點在接下來的內容,如果umask的部分位或全部位為奇數,那麽,在對應為奇數的文件權限位計算結果分別再加1就是最終文件權限值。

創建目錄默認最大權限777(-rwx-rwx-rwx),默認創建的目錄屬主是有x權限,允許用戶進入。
對於目錄來說,umask的設置是在假定文件擁有八進制777權限上進行,目錄八進制權限777減去umask的掩碼數值。

文件權限的一般計算方法:

默認文件權限計算方法

1)假設umask值為:022(所有位為偶數)

6 6 6 ==>文件的起始權限值

0 2 2 - ==>umask的值

---------

6 4 4

2)假設umask值為:045(其他用戶組位為奇數)

6 6 6 ==>文件的起始權限值

0 4 5 - ==>umask的值

---------

6 2 1 ==>計算出來的權限。由於umask的最後一位數字是5,所以,在其他用戶組位再加1。

0 0 1 +

---------

622 ==>真實文件權限

默認目錄權限計算方法

7 7 7 ==>目錄的起始權限值

0 2 2 - ==>umask的值

---------

7 5 5

規範成圖表如下:


實例一:umask所有位全為偶數時,多數讀者對這個例子無疑問

[root@oldboy oldboy]# umask

0022 #→umask當前數值

[root@oldboy oldboy]# umask 044 #→更改為044

[root@oldboy oldboy]# umask

0044

[root@oldboy oldboy]# mkdir umask_test #→建目錄測試

[root@oldboy oldboy]# ls -ld umask_test

drwx-wx-wx 2 root root 4096 Nov 12 19:21 umask_test #→對應數字權限為733,是不是符合上面的計算方法?

[root@oldboy oldboy]# touch umask_test.txt

[root@oldboy oldboy]# ls -l umask_test.txt

-rw--w--w- 1 root root 0 Nov 12 19:21 umask_test.txt #→對應數字權限為622,是不是符合上面的計算方法?

實例二:umask值的部分或全部位為奇數時,這個是讀者疑問最大的

umask值的其他屬組位為奇數時

[root@oldboy oldboy]# umask 0023

[root@oldboy oldboy]# mkdir dir

[root@oldboy oldboy]# touch file

[root@oldboy oldboy]# ls -l

總計 4

drwxr-xr-- 2 root root 4096 11-15 01:04 dir #→對應數字權限為754

-rw-r--r-- 1 root root 0 11-15 01:04 file #→對應數字權限為644

提示:根據前面的計算方法,當umask為0023時,dir的權限應該是754,而file的權限應該為643,但是由於umask的其他組位為奇數,因此最終權限為其他組位加1,即643加001(對應實踐結果644)。註意:umask為偶數的位不要加1。

實例三:umask值的所有位為奇數時

[root@oldboy oldboy]# umask 0551

[root@oldboy oldboy]# umask

0551

umask 為0551 根據掩碼方法計算:目錄權限為226,文件權限115,而實際文件權限為226(umask的三個權限位都是奇數,所以,每個位分別加1就是正確的權限)

[root@oldboy oldboy]# mkdir dir5

[root@oldboy oldboy]# touch file5

[root@oldboy oldboy]# ls -l

總計 4

d-w--w-rw- 2 root root 4096 11-15 01:27 dir5 #→目錄對應數字權限為226

--w--w-rw- 1 root root 0 11-15 01:27 file5 #→目錄對應數字權限為226

再來一例驗證下:

[root@oldboy oldboy]# umask 0333

[root@oldboy oldboy]# umask

0333

umask 為0333 根據掩碼方法計算:目錄權限為444,文件權限333,而實際文件權限為444(umask的三個位都是奇數,所以,每個位分別加1就是正確的權限)

[root@oldboy oldboy]# mkdir dir3

[root@oldboy oldboy]# touch file3

[root@oldboy oldboy]# ls -l|grep 3

dr--r--r-- 2 root root 4096 11-15 01:30 dir3 #→目錄對應數字權限為444

-r--r--r-- 1 root root 0 11-15 01:30 file3 #→目錄對應數字權限為444

2)通過8進制字母符號計算(記憶此法也可)

拿上面的實例3驗證。

[root@oldboy oldboy]# umask 551

umask值為551,對應的權限為-r-xr-x--x,即所有的文件和目錄都取消權限中的-r-xr-x--x權限。

文件權限:【-rw-rw-rw-】-【-r-xr-x--x】=【--w--w--rw-】=226(文件的x位上沒有x,就不用取消了)

目錄權限:【-rwxrwxrwx】-【-r-xr-x--x】=【--w--w--rw-】=226(目錄的x位上有x,直接取消即可)

繼續拿前面的例子驗證:

[root@oldboy oldboy]# umask 333

umask值為333,對應的權限為-wx-wx-wx,即所有的文件和目錄都取消權限中的-wx-wx-wx權限。

文件權限:【-rw-rw-rw-】-【-wx-wx-wx】=【-r--r--r--】=444(文件的x位上沒有x,就不用取消了)

目錄權限:【-rwxrwxrwx】-【-wx-wx-wx】=【-r--r--r--】=444(目錄的x位上有x,直接取消即可)

3)通過二進制方法計算(不好記憶不推薦)

通過進制之間轉換,八進制轉成二進制來計算。

0022

0 2 2

---------- #→八進制轉換二進制

0 10 10

說明:把umask值八進制轉換成二進制

6 6 6

------------ #→八進制轉換二進制

110 110 110

說明:把文件默認最大權限值八進制轉換成二進制

0 10 10 #→umask二進制

------------- #→與運算

110 110 110 #→文件最大權限二進制

-------------

000 010 010

------------- #→轉換八進制

0 2 2

說明:最後得到的值是022,然後使用666減去022,那麽文件的創建權限就是644

[root@oldboy oldboy]# umask 551

[root@oldboy oldboy]# umask

0551

5 5 1

------------- #→轉換二進制

101 101 001 #→umask二進制

------------- #→與運算

110 110 110 #→文件最大權限二進制

-------------

100 100 000

------------- #→轉換八進制

4 4 0

說明:最後得到的值是440,然後使用666減去440,那麽文件的創建權限就是226。
後記:特別歡迎大家給本文提建議,共同創造一個更好好的學習linux的生態環境。

版權聲明:原創作品,如需轉載,請與作者聯系。否則將追究法律責任

(轉)深入淺出linux系統umask值及其對應的文件權限講解