位元模式
在 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 則無) |
範例我們會用 chmod 來調整檔案或目錄的存取模式,就會大量的用到字串模式的表示法,以下為範例:
u+x 讓使用者有執行權限
go-w 移除群組與其他人的寫入權限
o+t 將其他人設定 Sticky 權限
a=rw 所有人都為讀取與寫入權限
範例一:用字串模式將檔案存取權限設定為 rw-r--r--,並顯示操作結果。
bang@linuxdiary:~$ chmod -v u=rw,go=r chmod_test1範例二:讓其它使用者無法存取整個 Desktop 目錄,並顯示操作結果。
mode of `chmod_test1' retained as 0644 (rw-r--r--)
bang@linuxdiary:~$ chmod -vR o-rwx Desktop範例三:將 Desktop 目錄設定 SGID,並顯示操作結果。
mode of `Desktop' retained as 0750 (rwxr-x---)
mode of `Desktop/abc.txt' changed to 0640 (rw-r-----)
bang@linuxdiary:~$ chmod -v g+s Desktop範例四:將 Desktop 目錄設定 Stickey 權限,並顯示操作結果。
mode of `Desktop' changed to 2750 (rwxr-s---)
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我們可以發現 umask 前後,新增檔案的存取權限是相異的。
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 設定,會在 /etc 目錄下的 profile (debian)或 bashrc (red hat)中。這點好像不太重要,因為可以放的地方還蠻多的,FHS 也沒硬性規定一定要放哪,只是喚起對這兩個 shell 設定檔的記憶。
- 在 red hat 中,一般用戶的 umask 為 0002,而 root 為 0022;debian 皆為 0022,故這邊的範例是以 debian 為例喔,我是用一般用戶 touch 一個檔案。
沒有留言:
張貼留言