umask
用來設置限制新文件許可權的掩碼
當我們登錄系統之後創建一個文件總是有一個默認許可權的,那麼這個許可權是怎麼來的呢?這就是umask乾的事情。umask設置了用戶創建文件的默認 許可權,它與chmod的效果剛好相反,umask設置的是許可權“補碼”,而chmod設置的是文件許可權碼。一般可在/etc/profile、/etc/bashrc、$ [HOME]/.bash_profile、$[HOME]/.profile或$[HOME]/.bashrc中設置umask值。具體取決於Linux發行版,比如Fedora19下要更改自己的umask值,在$[HOME]/.profile或$[HOME]/.bash_profile下的增加umask的值覆蓋不了/etc/profile中的配置值的,必須在$[HOME]/.bashrc下增加umask值才可以永久定義自己的umask值。
umask [選項] [掩碼]
該命令用來設置限制新文件許可權的掩碼。當新文件被創建時,其最初的許可權由文件創建掩碼決定。用戶每次註冊進入系統時,umask命令都被執行,並自動設置掩碼改變默認值,新的許可權將會把舊的覆蓋。
選項及其含義如下。
-S:顯示當前的掩碼。
umask是從許可權中“拿走”相應的位,且文件創建時不能賦予執行許可權。
• A 什麼是umask?
你的系統管理員必須要為你設置一個合理的 umask值,以確保你創建的文件具有所希望的預設許可權,防止其他非同組用戶對你的文件具有寫許可權。在已經登錄之後,可以按照個人的偏好使用umask命 令來改變文件創建的預設許可權。相應的改變直到退出該shell或使用另外的umask命令之前一直有效。一般來說,umask命令是在/etc /profile文件中設置的,每個用戶在登錄時都會引用這個文件,所以如果希望改變所有用戶的umask,可以在該文件中加入相應的條目。如果希望永久 性地設置自己的umask值,那麼就把它放在自己$HOME目錄下的.profile或.bash_profile或.bashrc文件中。
• B 如何計算umask值
umask 命令允許你設定文件創建時的預設模式,對應每一類用戶(文件屬主、同組用戶、其他用戶)存在一個相應的umask值中的數字。對於文件來說,這一數字的最 大值分別是6。系統不允許你在創建一個文本文件時就賦予它執行許可權,必須在創建後用chmod命令增加這一許可權。目錄則允許設置執行許可權,這樣針對目錄來 說,umask中各個數字最大可以到7。
該命令的一般形式為:
umask nnn
其中nnn為umask置000-777。
讓我們來看一些例子。
計算出你的umask值:
可以有幾種計算umask值的方法,通過設置umask值,可以為新創建的文件和目錄設置預設許可權。下表列出了與許可權位相對應的umask值。
在計算umask值時,可以針對各類用戶分別在這張表中按照所需要的文件/目錄創建預設許可權查找對應的umask值。
例如,umask值002 所對應的文件和目錄創建預設許可權分別為6 6 4(666 減 2)和7 7 5(777 減 2)。
還有另外一種計算umask值的方法。我們只要記住umask是從許可權中“拿走”相應的位即可。
umask值與許可權
umask值 | 文件 | 目錄 |
0 6 7 | 600 | 710 |
1 6 6 | 600 | 611 |
2 4 5 | 422 | 532 |
344 | 422 | 433 |
423 | 244 | 354 |
522 | 244 | 255 |
601 | 066 | 176 |
700 | 066 | 666 |
例如,對於umask值0 0 2,相應的文件和目錄預設創建許可權是什麼呢?
第一步,我們首先寫下目錄具有全部許可權的模式,即777 (所有用戶都具有讀、寫和執行許可權)。
第二步,在下面一行按照umask值寫下相應的位,在本例中是0 0 2。
第三步,在接下來的一行中記下上面兩行中沒有匹配的位。這就是目錄的預設創建許可權。
稍加練習就能夠記住這種方法。
第四步,對於文件來說,在創建時不能具有執行許可權,只要拿掉相應的執行許可權比特即可。
這就是上面的例子,其中umask值為0 0 2:
1) 文件的最大許可權 rwx rwx rwx (777)
2) umask值為0 0 2 --- --- -w-
3) 目錄許可權 rwx rwx r-x (775) 這就是目錄創建預設許可權
4) 文件許可權 rw- rw- r-- (664) 這就是文件創建預設許可權
下面是另外一個例子,假設這次u m a s k值為0 2 2:
1) 文件的最大許可權 rwx rwx rwx (777)
2 ) u m a s k值為0 2 2 --- -w- -w-
3) 目錄許可權 rwx r-x r-x (755) 這就是目錄創建預設許可權
4) 文件許可權 rw- r-- r-- (644) 這就是文件創建預設許可權
• C 常用的umask值
下表列出了一些umask值及它們所對應的目錄和文件許可權。
常用的umask值及對應的文件和目錄許可權
umask 值 | 文件 | 目錄 |
022 | 644 | 755 |
027 | 640 | 750 |
002 | 664 | 775 |
006 | 660 | 771 |
007 | 660 | 770 |
• D umask命令
如果想知道當前的umask 值,可以使用umask命令:
$umask
如果想要改變umask值,只要使用umask命令設置一個新的值即可:
$ umask 002
確認一下系統是否已經接受了新的u m a s k值:
$umask
002
$touch testfile
$ls -l testfile
rw- rw- r--
在使用umask命令之前一定要弄清楚到底希望具有什麼樣的文件/目錄創建預設許可權。否則可能會得到一些非常奇怪的結果;例如,如果將umask值設置為6 0 0,那麼所創建的文件/目錄的預設許可權就是0 6 6!
#include
mode_t umask(mode_t cmask);
其中cmask對應下面的9個位的“或”值:
S_IRUSR 用戶讀
S_IWUSR 用戶寫
S_IXUSR 用戶執行
S_IRGRP 組讀
S_IWGRP 組寫
S_IXGRP 組執行
S_IROTH 其他讀
S_IWOTH 其他寫
S_IXOTH 其他執行
這9個位對應linux文件的許可權位。
umask函數為進程設置文件模式創建屏蔽字,並返回以前的值。在進程創建一個新文件或新目錄的時候,就一定會使用文件模式創建屏蔽位元組,對於文件模式創建屏蔽字中為1的位,在創建文件函數create的mode對應的位則被關閉。
例如:
#include #include #define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) int main(void) { mode_t mask=umask(0); if(creat("foo",RWRWRW)<0) printf("create error for foo\n"); umask(S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); if(creat("bar",RWRWRW)<0) printf("creat error for bar\n"); exit(0); } |
程序輸出為:
lijsf@ubuntu:~$ umask 0002 lijsf@ubuntu:~$ ./a.out lijsf@ubuntu:~$ ls -l foo bar -rw------- 1 lijsf lijsf 0 Apr 27 01:59 bar -rw-rw-rw- 1 lijsf lijsf 0 Apr 27 01:59 foo lijsf@ubuntu:~$ umask 0002 |
可見umask函數並比改變父進程的文件屏蔽字。第一個文件foo的許可權都沒有屏蔽,所以最終許可權為RW-RW-RW-。相應的第二個文件bar的屏蔽字為S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH,即066,最終的bar的許可權對應的應為RW-------。
(PHP 3, PHP 4, PHP 5)
umask -- 改變當前的 umask
int umask( [int mask] )
umask()將 PHP 的 umask 設定為 mask & 0777 並返回原來的 umask。當 PHP 被作為伺服器模塊使用時,在每個請求結束后 umask 會被恢復。
無參數調用 umask()會返回當前的 umask。
注:在多線程的伺服器上盡量避免使用這個函數。創建文件后要改變其許可權最好還是使用 chmod()。使用 umask()會導致併發程序和伺服器發生不可預知的情況,因為它們是使用相同的 umask 的。
umask()例子 $old = umask(0); chmod("/path/some_dir/some_file.txt", 0755); umask($old); // Checking if ($old != umask()) { die('An error occured while changing back the umask'); } ?> |