Linux 文件權限

文件模式位

文件權限是通過文件模式位( file mode bits )表達的,它有兩部分組成

  1. 文件權限位( file permission bits),它由讀,寫,執行權限組成。
  2. 特殊模式位( 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 系統中,它隻影響目錄。如果對目錄設置了粘着位,並且用戶想要刪除該目錄下的子文件或子目錄,需要滿足如下其中一個條件

  1. 用戶擁有目錄項。
  2. 用戶擁有這個設置了粘着位的目錄。
  3. 用戶爲超級用戶。

其實前兩個條件還包含滿足一個隱藏條件,那就是用戶對設置了粘着位的目錄有寫權限。

因此,粘着位也被稱爲限制刪除位。例如,被 root 用戶擁有的 /tmp 目錄就設置了粘着位,並且對其他用戶開放了寫權限,因此其他用戶可以在這個目錄下創建目錄項,但是隻能刪除自己創建的目錄項。當然,root 用戶可以刪除這個目錄下的任意目錄項,因爲它擁有這個目錄,並且具有寫權限,還有最根本的一個原因,它是超級用戶。

設置特殊模式位

特殊模式位的設置與文件權限位的設置方式是一致的,也分爲字符模式和數字模式,這裏只演示字符模式。

設置用戶ID位,設置組ID位,粘着位分別在文件屬主的執行權限位,文件屬組的執行權限位,文件的其他用戶執行權限位顯示,顯示的字母爲大寫或者小寫的字母s( 設置用戶ID位和設置組ID位 )和字母t( 粘着位 )。

顯示的字母是大寫還是小寫,取決於該位置是否設置了執行權限。如果該位置設置了執行權限,那麼顯示小寫字母,否則爲大寫字母。

根據顯示的位置,我們可以猜測設置的方式, u+s, g+s, o+t( 字母o可以省略 )分爲對應設置用戶ID,設置組ID,粘着位的設置。

發佈了50 篇原創文章 · 獲贊 31 · 訪問量 400萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章