天天看點

深入了解檔案權限

## 檢視檔案、目錄和裝置的權限

例如,本人某目錄下有如下檔案:

$ ls -l 
total 68 
-rw-rw-r-- 1 craftor craftor 50 2013-06-02 09:31 file1 
-rw-rw-r-- 1 craftor craftor 28 2013-06-03 15:40 file2 
-rwxrwxr-x 1 craftor craftor 4881 2013-05-20 17:23 myprog 
-rw-rw-r-- 1 craftor craftor 287 2013-05-20 17:23 myprog.c 
drwxrwxr-x 2 craftor craftor 4096 2013-06-20 14:20 test1 
drwxrwxr-x 2 craftor craftor 4096 2013-06-22 13:40 test2 
$      

輸出結果的第一個字段是描述檔案和目錄的權限的碼。這個字段的第一個字元代表的對象的類型:

- -代表檔案

- d代表目錄

- l代表連結

- c代表字元型裝置

- b代表塊裝置

- n代表網絡裝置

之後有3組三字元的碼。每一組三字元碼表示三重通路權限:

- r代表對象是可讀的

- w代表對象是可寫的

- x代表對象是可執行的

如果沒有某種權限,在該權限位會出現單破折線。這3組三字碼分别對應對象的3個安全級别:

- 對象的屬主

- 對象的屬組

- 系統其他使用者

如下圖:

-rwxrwxr-x 1 craftor craftor 4882 2013-06-22 13:40 myprog | | | | | +----------其他使用者的權限(r-x) | +-------------屬組使用者的權限(rwx) +----------------檔案屬主的權限(rwx)

## 預設檔案權限

你可能會問這些檔案權限從何而來,答案是umask。umask指令用來設定使用者建立檔案和目錄的預設權限:

$ toucn test 
$ ls -la test 
-rw-rw-r-- 1 craftor craftor 0 Jun 25 10:50 test      

touch指令用配置設定給我的使用者賬号的預設權限建立了這個檔案。umask指令可以顯示和設定這個預設權限:

$ umask 
0002      

其實,很容易了解umask的值。先看一下Linux權限碼:

======================================================= 權 限 二進制值 八進制值 描 述 ------------------------------------------------------- --- 000 0 沒有任何權限 --x 001 1 隻有執行權限 -w- 010 2 隻有寫入權限 -wx 011 3 有寫入和執行權限 r-- 100 4 隻有讀取權限 r-x 101 5 有讀取和執行權限 rw- 110 6 有讀取和寫入權限 rwx 111 7 有全部權限 =======================================================

如果一個檔案的權限碼是rw-rw-rw-,那麼對應的八進制值就是666,即所有人都可以讀取和寫入。

umask是個掩碼。它屏蔽掉了不想授予該安全級别的權限。umask值會從對象的全權限值中減掉,對檔案來說,全權限值是666;而對于目錄來說,是777。是以,上面的例子中,檔案一開始的權限是666,然後經umask值002作用後,變成了664。

可以使用umask指令為預設umask設定一個新值:

$ umask 026 
$ touch test2 
$ ls -la test2 
-rw-r----- 1 craftor craftor 0 Jun 25 15:14 test2      

在把umask值設成026後,預設的檔案權限變成了640,因些新的檔案在對屬組成員來說是隻讀的,而系統裡的其他成員沒有任何權限。umask同樣也會作用在建立目錄上。

$ mkdir newdir 
$ ls -l 
drwxr-x--x 2 craftor craftor 4096 Jun 25 15:16 newdir      

由于目錄的預設權限是777,umask作用後生成的目錄權限是777減支026,留下751作為目錄權限。

## 改變權限

使用chmod指令可以改變檔案或檔案夾權限。格式為:

chmod options mode file      

mode參數後可跟八進制數模式或符号模式來設定安全性。八進制模式設定非常直接,直接用期望賦予的标準的3位八進制權限碼:

$ chmod 760 newfile 
$ ls -l newfile 
-rwxrw---- 1 craftor craftor 0 Jun 25 15:19 newfile      

符号模式的權限就沒這麼簡單了。與通常用到的3組三字元權限字元不同,chmod指令用了另外一種實作。下面是在符号模式下指定權限的格式:

[ugoa...][+-=][rwxXstugo...]      

很有意思,不是嗎?第一組字元定義了權限作用對象:

- u代表使用者

- g代表組

- o代表其他使用者

- a代表所有人

下一步,後面跟着的的符号是表示你是想在現有的權限基礎增權重限(+),還是在現有權限基礎上移除權限(-),還是将權限設定成後面的值(=)。

最後,第3個符号代表作用到設定上的權限。你會發現,這個值要比rwx多,額外的設定有以下幾項:

- X: 如果對象是目錄或者它已有執行權限,賦予執行權限

- s: 運作時重新設定UID或者GID

- t: 保留檔案或目錄

- u: 将權限設定為跟屬主一樣

- g: 将權限設定為跟屬組一樣

- o: 将權限設定為跟其他使用者一樣

例如:

$ chmod o+r newfile 
$ ls -l newfile 
-rwxrw-r-- 1 craftor craftor 0 Jun 25 15:31 newfile      

不管其他使用者在這一安全級别之前都有什麼權限,o+r給這一級别添加了讀取權限。

$ chmod u-x newfile 
$ ls -l newfile 
-rw-rw-r-- 1 craftor craftor 0 Jun 25 15:31 newfile      

u-x移除了屬主已有的執行權限。

如果是對于檔案夾,可以加上-R參數,對所有檔案夾下的檔案和目錄也起作用。

## 改變所屬關系

有時候你需要改變檔案的屬主,比如有人離職或者開發人員建立了一個在産品環境中運作時需要歸屬在系統賬戶下的應用。Linux提供了兩個指令來完成這個功能:chown指令用來改變檔案的屬主,chgrp指令用來改變檔案的預設屬組。

chown指令格式如下:

chown options owner[.group] file      

可用登入名或UID來指定檔案的新屬主:

# chwon dan newfile 
# ls -l newfile 
-rw-rw-r-- 1 dan craftor 0 Jun 25 15:31 newfile      

非常簡單,chown指令也支援同時改變檔案的屬主和屬組:

# chwon dan.shared newfile 
# ls -l newfile 
-rw-rw-r-- 1 dan shared 0 Jun 25 15:31 newfile      

如果你不嫌麻煩,可以這麼改變一個檔案的預設屬組:

# chown .rich newfile 
# ls -l newfile 
-rw-rw-r-- 1 dan rich 0 Jun 25 15:31 newfile      

最後,如果你的Linux系統采用和使用者登入名比對的組名,你可以隻用一個條目就改變二者:

# chown test. newfile 
# ls -l newfile 
-rw-rw-r-- 1 test test 0 Jun 25 15:31 newfile      

同樣,對于chown指令,-R可以遞歸地改變子目錄和檔案的所屬關系,-h參數可以改變該檔案的所有符号連結檔案的所屬關系。

> 說明:隻有root使用者能夠改檔案屬主。任何屬主都可以改變檔案的屬組,但前提是屬主必須是源和目标屬組的成員。

chgrp指令可以很友善地更改檔案或目錄的預設屬組:

$ chgrp shared newfile 
$ ls -l new file 
-rw-rw-r-- 1 test shared 0 Jun 25 15:31 newfile      

現在shared組的任意使用者都可以寫這個檔案了。