2007年12月23日 星期日

檔案權限

存取控制 文章可知,stat 指令可知道檔案的相關資訊,在存取的部分,你可以看到一行如 Access: (0644/-rw-r--r--) 的資訊,其中 -rw-r--r-- 在 存取控制 中就說明了,而 0644 呢?就是本篇的主角之一。

位元模式

在 Linux 中以 chmod 工具來修改檔案權限。但是使用 chmod 時需要一套簡單的表示法來描述檔案權限,而能表示檔案權限的表示法有兩種,分別為位元模式與存取模式。
-rw-r--r-- 用後九個符號來表示檔案存取,而事實上位元模式的位元有 12 個(其中 3個為特殊權限),若直接用二進位來表達過於冗長且容易搞錯。最理想的方式為八進位,因為每三個八位元的數字剛好能表示 12-bits 位元模式分成 4 組不同意義的組合,而下表即各個進位轉換的對照表:

符號 二進位 八進位
--- 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-r--r--
110100100
644

rwxrwxr-x
111111101
775
字串模式

以八進位表示雖然簡潔,但不容易解讀。因此許多工具會以字串模式來表事檔案權限,如之前常提的 ls -l 的輸出訊息,但 ls -l 只顯示 r、w、x 、特殊權限等符號,不包括身分 (u、g、o) 與操作 (-、+,=) 符號,下表即說明字串模式的各個符號:


符號 說明
身分 u
擁有者 (user)

g 群組

o 其他人

a
所有人
操作
-
移除
r-x
+
添加
rw-
=
設定
權限
r
讀取

w
寫入

x
執行

s
SUID 或 SGID (s 代表同擁有 x 權限,S 則無)

t
Sticky 權限 (t 代表同擁有 x 權限,T 則無)

範例
u+x 讓使用者有執行權限
go-w 移除群組與其他人的寫入權限
o+t 將其他人設定 Sticky 權限
a=rw 所有人都為讀取與寫入權限
我們會用 chmod 來調整檔案或目錄的存取模式,就會大量的用到字串模式的表示法,以下為範例:
範例一:用字串模式將檔案存取權限設定為 rw-r--r--,並顯示操作結果。
bang@linuxdiary:~$ chmod -v u=rw,go=r chmod_test1
mode of `chmod_test1' retained as 0644 (rw-r--r--)
範例二:讓其它使用者無法存取整個 Desktop 目錄,並顯示操作結果。
bang@linuxdiary:~$ chmod -vR o-rwx Desktop
mode of `Desktop' retained as 0750 (rwxr-x---)
mode of `Desktop/abc.txt' changed to 0640 (rw-r-----)
範例三:將 Desktop 目錄設定 SGID,並顯示操作結果。
bang@linuxdiary:~$ chmod -v g+s Desktop
mode of `Desktop' changed to 2750 (rwxr-s---)
範例四:將 Desktop 目錄設定 Stickey 權限,並顯示操作結果。
bang@linuxdiary:~$ chmod -v +t Desktop
mode of `Desktop' changed to 3750 (rwxr-s--T)

預設存取模式

當使用者新增一個檔案或目錄時,系統會根據 umask 設定值,來決定這個檔案或目錄的存取權限,而甚麼是 umask 設定值呢?這是一個設定預設存取權限的命令 umask ,以下為範例

查詢目前的
bang@linuxdiary:~$ umask
0022
新增一個檔案,並檢查預設存取權限
bang@linuxdiary:~$ touch umask_test1
bang@linuxdiary:~$ ls -l umask_test1
-rw-r--r-- 1 bang bang 0 Dec 24 00:18 umask_test1
更改目前的預設權限
bang@linuxdiary:~$ umask 002
bang@linuxdiary:~$ touch umask_test2
bang@linuxdiary:~$ ls -l umask_test
-rw-r--r-- 1 bang bang 0 Dec 24 00:18 umask_test1
-rw-rw-r-- 1 bang bang 0 Dec 24 23:46 umask_test2
我們可以發現 umask 前後,新增檔案的存取權限是相異的。
注意
  • 通常系統預設的 umask 設定,會在 /etc 目錄下的 profile (debian)或 bashrc (red hat)中。這點好像不太重要,因為可以放的地方還蠻多的,FHS 也沒硬性規定一定要放哪,只是喚起對這兩個 shell 設定檔的記憶。
  • 在 red hat 中,一般用戶的 umask 為 0002,而 root 為 0022;debian 皆為 0022,故這邊的範例是以 debian 為例喔,我是用一般用戶 touch 一個檔案。

沒有留言: