深入理解檔案許可權

Craftor發表於2014-06-27

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

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

$ 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組的任意使用者都可以寫這個檔案了。

相關文章