我們已經(jīng)知道了權限的賦予方式,但是這些讀、寫、執(zhí)行權限到底是什么含義呢?有些人可能會說:"你也太小瞧我們了,讀、寫、執(zhí)行的含義這么明顯,我們還能不知道嗎?"其實,這些權限的含義不像表面上這么明顯,下面我們就來講講這些權限到底是什么含義。
首先,讀、寫、執(zhí)行權限對文件和目錄的作用是不同的。
權限對文件的作用。
-讀(r):對文件有讀(r)權限,代表可以讀取文件中的數(shù)據(jù)。如果把權限對應到命令上,那么一旦對文件有讀(r)權限,就可以對文件執(zhí)行 cat、more、less、head、tail 等文件查看命令。
-寫(w):對文件有寫(w)權限,代表可以修改文件中的數(shù)據(jù)。如果把權限對應到命令上,那么一旦對文件有寫(w)權限,就可以對文件執(zhí)行 vim、echo 等修改文件數(shù)據(jù)的命令。注意,對文件有寫權限,是不能刪除文件本身的,只能修改文件中的數(shù)據(jù)。如果要想刪除文件,則需要對文件的上級目錄擁有寫權限。
-執(zhí)行(x):對文件有執(zhí)行(x)權限,代表文件擁有了執(zhí)行權限,可以運行。在 Linux 中,只要文件有執(zhí)行(x)權限,這個文件就是執(zhí)行文件了。只是這個文件到底能不能正確執(zhí)行,不僅需要執(zhí)行(x)權限,還要看文件中的代碼是不是正確的語言代碼。對文件來說,執(zhí)行(x)權限是最高權限。
權限對目錄的作用
-讀(r):對目錄有讀 (r)權限,代表可以查看目錄下的內容,也就是可以查看目錄下有哪些子文件和子目錄。如果把權限對應到命令上,那么一旦對目錄擁有了讀(r)權限,就可以在目錄下執(zhí)行 ls 命令,查看目錄下的內容了。
-寫(w):對目錄有寫(r)權限,代表可以修改目錄下的數(shù)據(jù),也就是可以在目錄中新建、刪除、復制、剪切子文件或子目錄。如果把權限對應到命令上,那么一旦對目錄擁有了寫(w)權限,就可以在目錄下執(zhí)行 touch、rm、cp、mv 命令。對目錄來說,寫(w)權限是最高權限。
-執(zhí)行(x):目錄是不能運行的,那么對目錄擁有執(zhí)行(x)權限,代表可以進入目錄。如果把權限對應到命令上,那么一旦對目錄擁有了執(zhí)行(x)權限,就可以對目錄執(zhí)行 cd 命令,進入目錄。
注意事項
初學權限的時候,可能對兩種情況最不能理解,我們一個一個來看。
1) 為什么對文件有寫權限,卻不能刪除文件?
這需要通過分區(qū)的格式化來講解。我們之前講過,分區(qū)的格式化可以理解為給分區(qū)打入隔斷,這樣才可以存儲數(shù)據(jù)。
在 Linux 的 ext 文件系統(tǒng)中,格式化可以理解為把分區(qū)分成兩大部分:
一部分占用空間較小,用于保存 inode(i 節(jié)點)信息;絕大部分格式化為 block(數(shù)據(jù)塊),用于保存文件中的實際數(shù)據(jù)。
在 Linux 中,默認 inode 的大小為 128 Byte,用于記錄文件的權限(r、w、x)、文件的所有者和屬組、文件的大小、文件的狀態(tài)改變時間(ctime)、文件的最近一次讀取時間(atime)、文件的最近一次修改時間(mtime)、文件中的數(shù)據(jù)真正保存的 block 編號。每個文件需要占用一個 inode。
仔細觀察,在 inode 中并沒有記錄文件的文件名。那是因為文件名是記錄在文件上級目錄的 block 中的。我們畫一張示意圖看看,假設有這樣一個文件 /test/cangls,如圖 1 所示。
圖 1 inode示意圖
我們可以看到,在 /test/ 目錄的 block 中會記錄這個目錄下所有的一級子文件或一級子目錄的文件名及其對應的 inode 好。也就是說,系統(tǒng)讀取 cangls 文件的過程是這樣的:
通過 /test/ 目錄的 inode 信息,找到 /test/ 目錄的 block。
在 /test/ 目錄的 block 中,查看到 cangls 文件的 inode 號。
通過 cangls 文件的 inode 號,找到了 cangls 文件的 inode 信息。
確定是否有權限訪問 cangls 文件的內容。
通過 inode 信息中 block 的位置,找到 cangls 文件實際的 block。
讀取 block 數(shù)據(jù),從而讀取出 cangls 文件的內容。
既然如此,那么 /test/ 目錄的文件名放在哪里呢?當然放在 / 目錄的 block 中了,而/目錄的 inode 號(/ 目錄的 inode 號是 2)是系統(tǒng)已知的。也就是說,在系統(tǒng)中讀取任意一個文件,都要先通過 / 目錄的 inode 信息找到 / 目錄的 block,再查看 / 目錄的 block,從而可以確定一級目錄的 inode 信息。然后一級一級地查找到最終文件的 block 信息,從而讀取數(shù)據(jù)。
總結:因為文件名保留在上級目錄的 block 中,所以對文件擁有寫權限,是不能刪除文件本身的,只能刪除文件中的數(shù)據(jù)(也就是文件 block 中的內容)。要想刪除文件名,需要對文件所在目錄擁有寫權限。
2) 目錄的可用權限。
對目錄來講,如果只賦予只讀(r)權限,則是不可以使用的。大家想想,要想讀取目錄下的文件,你怎么也要進入目錄才可以吧?而進入目錄,對目錄來講,需要執(zhí)行(x)權限的支持。
目錄的可用權限其實只有以下幾個。
0:任何權都不賦予。
5:基本的目錄瀏覽和進入權限。
7:完全權限。
示例
我們做權限的實驗,是不能使用 root 用戶測試的。由于 root 用戶是超級用戶,就算沒有任何權限,root 用戶依然可執(zhí)行全部操作。
所以我們只能使用普通用戶來驗證權限,而目前普通用戶又不能修改文件權限(不是普通用戶不能修改文件權限,而是只有文件的所有者才能修改文件權限,我們當前沒有講修改所有者的命令,從而導致普通用戶不能修改文件權限)。在實驗中,筆者會用 root 用戶來修改文件權限,而用普通用戶 user 來驗證權限,請大家注意用戶身份的變化。
實驗思路:由 root 用戶把測試目錄和測試文件的權限改為最小(0),然后逐步放大權限,用普通用戶來驗證每個權限可以執(zhí)行那些命令。
創(chuàng)建普通用戶 user 的簡單步驟:第一步,添加用戶執(zhí)行命令"useradd user";第二步,設置用戶密碼 "passwd user",輸入兩次密碼確認。
#步驟一:由root身份建立測試文件
[root@localhost ~]# cd /home/user/
#進入普通用戶的家目錄中建立測試目錄和文件,因為普通用戶無法進入root的家目錄中[root@localhost user]# mkdir test
[root@localhost user]# touch test/cangls
#建立測試目錄和文件
[root@localhost user]# chmod 750 test/
#修改test目錄的權限為750
#由于沒有修改所有者和所屬組,所以user用戶會匹配其他人權限#為了實驗效果,只把他人的權限改為0,而所有者和所屬組權限不修改[root@localhost user]# chmod 640 test/cangls#修改cangls文件的權限為640
#步驟二:由user用戶測試權限(執(zhí)行命令"su-user"切換用戶)[user@localhost ~]$ ll
總用量 4
drwxr-x—-- 2 root root 4096 6月 15 13:19 test#思考:為什么user對test目錄沒有權限,卻能看到 test目錄?
[user@localhost ~]$ ls test/
ls:無法打開目錄test/:權限不夠
[user@localhost ~]$ cd test/
-bash: cd: test/:權限不夠
#由于user用戶對test目錄沒有權限(0),所以既不能查看目錄下的內容,也不能進入目錄#步驟三:由root用戶給test目錄賦予讀(r)權限[root@localhost user]# chmod 754 test
[root@localhost user]# ll test/
總用量0
-rw-r----- 1 root root 0 6月 15 13:19 cangls#注意,這是測試實驗,只讀(r)權限對目錄無法正常使用#步驟四:由user用戶測試,讀(r)權限雖然可以看到目錄下的內容,但是不能正常使用[user@localhost ~]$ ls test/
ls:無法訪問test/cangls:權限不夠
cangls
#ls查看目錄下的內容,雖然看到了文件名,但依然報錯"權限不夠"[user@localhost ~]$ ll test/
ls:無法訪問test/cangls:權限不夠
總用量0
-????????? ???? ? cangls
#ll查看目錄下的內容,會發(fā)現(xiàn)由于權限不足,所以只能看到文件名,其他信息都是"?",代表不能正常查看[user@localhost ~]$ cd test/
-bash: cd: test/:權限不夠
#當然也不能進入目錄
#所以,只讀(r)權限對目錄來說是無法正常使用的權限#步驟五:由root用戶給test目錄賦予讀(r)和執(zhí)行(x)權限[root@localhost user]# chmod 755 test
[root@localhost user]# ll test/
總用量0
-rw-r—---- 1 root root 0 6月 15 13:19 cangls#讀(r)和執(zhí)行(x)權限對目錄來說才是可以正常使用的權限#步驟六:由user用戶測試
[user@localhost ~]$ ll test/
總用量0
-rw-r—---- 1 root root 0 6月 15 13:19 cangls#可以正常查看目錄下的內容
[user@localhost ~]$ cd test/
[user@localhost test]$
#可以進入目錄了
#步驟七:我們開始測試文件權限,由user用戶測試[user@localhost test]$ cat cangls
cat: cangls:權限不夠
#user用戶沒有讀(r)權限,所以不能查看文件的內容[user@localhost test]$ echo 22222 >> cangls-bash: cangls:權限不夠
#user用戶沒有寫(w)權限,所以不能寫入數(shù)據(jù)
#步驟八:由root用戶給cangls文件賦予讀(r)權限[root@localhost user]# chmod 644 test/cangls#步驟九:由user用戶測試,可以讀取cangls文件的內容[user@localhost test]$ cat cangls
[user@localhost test]$
#雖然文件為空,但是不再報錯
[user@localhost test]$ echo 22222 >> cangls-bash: cangls:權限不夠
#由于沒有寫權限,所以依然不能向文件中寫入數(shù)據(jù)#步驟十:由root用戶給cangls文件賦予寫(w)權限[root@localhost user]# chmod 646 test/cangls#這只是實驗,才會出現(xiàn)其他人權限高于所屬組權限的情況,實際情境不會這樣#步驟十一:由user用戶測試,可以對cangls文件寫入數(shù)據(jù)[user@localhost test]$ echo 22222 >> cangls[user@localhost test]$ rm -rf cangls
rm:無法刪除"cangls":權限不夠
#可以對cangls文件寫入數(shù)據(jù),但是不能刪除這個文件本身#步驟十二:由root用戶給test目錄賦予寫(w)權限[root@localhost user]# chmod 757 test/
[root@localhost user]# ll
總用量4
drwxr-xrwx 2 root root 4096 6月 15 13:19 test#其他用戶賦予7權限,非常不安全,在生產(chǎn)環(huán)境下嚴格禁用#步驟十三:由user用戶測試,可以刪除cangls文件,并且可以新建、復制和剪切[user@localhost test]$ rm -rf cangls
#可以刪除
[user@localhost test]$ touch bols
#可以新建bols文件
[user@localhost test]$ mv bols Imls
#可以把bols文件改名為lmls
這個實驗并不復雜,但是由于需要在兩個用戶身份之間切換,所以代碼確實比較長。這個實驗可以充分說明每個權限可以執(zhí)行哪些命令,可以幫助我們更好地理解權限的含義。
》》》更多的關于linux培訓知識,歡迎隨時咨詢傳智播客網(wǎng)站右下側咨詢窗口《《《