umask

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 7600710
1 6 6600611
2 4 5422532
344422433
423244354
522244255
601066176
700066666

例如,對於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 值檔案目錄
022644755
027640750
002664775
006660771
007660770

•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'); } ?>

相關詞條

熱門詞條

聯絡我們