常用指令
一般格式
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!
操作函式
umask
#include <sys/stat.h>
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 <unistd.h> #include <sys/stat.h> #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-------。
檔案函式
umask
(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()例子 <?php $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'); } ?> |