文件模式位
文件權限是通過文件模式位( file mode bits )表達的,它有兩部分組成
- 文件權限位( file permission bits),它由讀,寫,執行權限組成。
- 特殊模式位( special mode bits ),它由設置用戶ID,設置組ID,粘着位(也叫做限制刪除位)組成。
chmod 命令的描述是 change file mode bits。
文件權限位
對於普通文件來說,讀、寫、執行權限很好理解。讀權限意味着可以讀取文件的內容;寫權限意味着可以向文件寫內容;執行權限意味着文件可以被執行,例如用戶對 shell 腳本擁有執行權限就可以執行這個腳本。
目錄的文件權限位
但是對於一個目錄來說,讀、寫、執行權限意味着什麼呢?很多文檔只是做了一個概要的總結,這裏通過一個例子來測試,看看實際效果。
目錄的讀權限
首先來測試目錄的讀權限
$ ls permission_test_dir/
dir1 file1
$
$ chmod u-r permission_test_dir/
$
$ ls -ld permission_test_dir/
d-wxrwxr-x 3 david david 4096 1月 2 14:41 permission_test_dir/
$
$ ls permission_test_dir/
ls: cannot open directory 'permission_test_dir/': Permission denied
在去掉目錄的讀權限之前,可以通過 ls
命令讀取目錄項( 子文件和子目錄 )的名字。一旦去掉目錄的讀權限後,就無法獲取目錄項的名字,提示無法打開目錄( 這和 ls
命令的實現有關 )。
雖然當前用戶對目錄沒有了讀權限,但是還是可以通過
ls -ld
命令查看目錄的信息,這是因爲當前用戶對這個目錄的父目錄,有讀、執行/搜索權限。
那麼,目錄的讀權限其實就是指打開目錄的權限,只有打開了目錄才能讀取目錄項的名字,但是不包括目錄項的信息(例如大小,權限等信息),目錄項的信息的讀取是由父目錄的讀權限和執行權限控制的。
目錄的寫權限
接下來測試目錄的寫權限
$ chmod u+r-w permission_test_dir/
$ ls -ld permission_test_dir/
dr-xrwxr-x 3 david david 4096 1月 2 14:41 permission_test_dir/
$
$ ls -l permission_test_dir/
total 4
drwxrwxr-x 2 david david 4096 1月 2 14:41 dir1
-rw-rw-r-- 1 david david 0 1月 2 14:41 file1
$
$ touch permission_test_dir/file2
touch: cannot touch 'permission_test_dir/file2': Permission denied
$
$ mkdir permission_test_dir/dir2
mkdir: cannot create directory ‘permission_test_dir/dir2’: Permission denied
$
$ mv permission_test_dir/file1 permission_test_dir/renamed_file1
mv: cannot move 'permission_test_dir/file1' to 'permission_test_dir/renamed_file1': Permission denied
去掉了目錄的寫權限後,ls -l
可以成功獲取目錄項的名字和信息,而 touch
命令無法在目錄下創建文件,mkdir
命令無法在目錄下創建目錄,mv
命令無法重命名目錄下的文件。
目錄的寫權限,指的是在目錄下創建和刪除文件的權限。重命名功能是由創建和刪除功能實現的,因此如果用戶對一個目錄沒有寫權限,也就無法重命名目錄下的目錄項的名字。
目錄的執行權限
最後來測試目錄的執行權限。
$ ls -l permission_test_dir/
total 4
drwxrwxr-x 2 david david 4096 1月 2 14:41 dir1
-rw-rw-r-- 1 david david 0 1月 2 14:41 file1
$
$ chmod u+w-x permission_test_dir/
$ ls -ld permission_test_dir/
drw-rwxr-x 3 david david 4096 1月 2 14:41 permission_test_dir/
$
$ ls -l permission_test_dir/
ls: cannot access 'permission_test_dir/file1': Permission denied
ls: cannot access 'permission_test_dir/dir1': Permission denied
total 0
d????????? ? ? ? ? ? dir1
-????????? ? ? ? ? ? file1
dir1 file1
$
$ cd permission_test_dir/
bash: cd: permission_test_dir/: Permission denied
沒有去掉目錄的執行權限前,可以通過 ls -l
命令讀取到目錄項的名字和信息。然而在去掉目錄的執行權限後,只能通過 ls -l
命令讀取到目錄項的名字,而不能讀取到目錄項的信息(權限,文件大小等信息)。
最後,還測試了一個 cd
命令,可以發現,沒有執行權限的目錄,是無法通過 cd
命令進入了,這就從側面證明了爲何目錄的執行權限叫搜索權限。
目錄的執行權限/搜索權限,指的就是對目錄項的訪問權限(獲取文件信息)。
特殊模式位
現在來看下特殊模式位,由設置用戶ID位( set-user-ID bit )、設置組ID位( set-group-ID bit )位、粘着位( sticky bit )/限制刪除位( restricted deletion flag )組成。在 Linux 系統中,這些位隻影響可執行文件和目錄。
如果一個程序(一個可執行文件)設置了 設置用戶ID位,那麼運行此程序時,進程的有效用戶ID爲文件屬主的用戶ID,而不是當前用戶ID。那麼這樣有什麼好處呢?例如,對於超級用戶擁有的程序,並且設置了 設置用戶ID位,當其他用戶運行此程序(擁有執行權限),這個程序進程的有效用戶ID爲超級用戶ID,而不是當前用戶的ID,因此這個進程擁有了超級用戶權限,而不僅僅是當前用戶的權限。
如果一個程序(一個可執行文件)設置了 設置組ID位,那麼運行此程序時,進程的有效組ID爲文件屬組的組ID,而不是當前用戶的組ID。
在 Linux 中,如果一個目錄設置了 設置組ID位,那麼目錄下創建的目錄項的屬組與目錄的屬組一樣,並且子目錄的設置組ID位也會被設置。這個特性往往被用在共享目錄上,如果一個共享目錄被一個用戶組所擁有,並且設置了 設置組ID位,那麼在這個目錄下創建的所有目錄項都被這個用戶組所擁有,從而就實現了目錄共享。
粘着位其實 Unix 文化中的一個概念,在現代的 Linux 系統中,它隻影響目錄。如果對目錄設置了粘着位,並且用戶想要刪除該目錄下的子文件或子目錄,需要滿足如下其中一個條件
- 用戶擁有目錄項。
- 用戶擁有這個設置了粘着位的目錄。
- 用戶爲超級用戶。
其實前兩個條件還包含滿足一個隱藏條件,那就是用戶對設置了粘着位的目錄有寫權限。
因此,粘着位也被稱爲限制刪除位。例如,被 root 用戶擁有的 /tmp
目錄就設置了粘着位,並且對其他用戶開放了寫權限,因此其他用戶可以在這個目錄下創建目錄項,但是隻能刪除自己創建的目錄項。當然,root 用戶可以刪除這個目錄下的任意目錄項,因爲它擁有這個目錄,並且具有寫權限,還有最根本的一個原因,它是超級用戶。
設置特殊模式位
特殊模式位的設置與文件權限位的設置方式是一致的,也分爲字符模式和數字模式,這裏只演示字符模式。
設置用戶ID位,設置組ID位,粘着位分別在文件屬主的執行權限位,文件屬組的執行權限位,文件的其他用戶執行權限位顯示,顯示的字母爲大寫或者小寫的字母s( 設置用戶ID位和設置組ID位 )和字母t( 粘着位 )。
顯示的字母是大寫還是小寫,取決於該位置是否設置了執行權限。如果該位置設置了執行權限,那麼顯示小寫字母,否則爲大寫字母。
根據顯示的位置,我們可以猜測設置的方式, u+s
, g+s
, o+t
( 字母o可以省略 )分爲對應設置用戶ID,設置組ID,粘着位的設置。