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