教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Linux培訓(xùn):讀寫執(zhí)行權(quán)限(-r、-w、-x)完全攻略

更新時間:2019年04月03日09時01分 來源:linux培訓(xùn)機(jī)構(gòu) 瀏覽次數(shù):

    我們已經(jīng)知道了權(quán)限的賦予方式,但是這些讀、寫、執(zhí)行權(quán)限到底是什么含義呢?有些人可能會說:"你也太小瞧我們了,讀、寫、執(zhí)行的含義這么明顯,我們還能不知道嗎?"其實,這些權(quán)限的含義不像表面上這么明顯,下面我們就來講講這些權(quán)限到底是什么含義。
    首先,讀、寫、執(zhí)行權(quán)限對文件和目錄的作用是不同的。
linux培訓(xùn)

    權(quán)限對文件的作用。

    -讀(r):對文件有讀(r)權(quán)限,代表可以讀取文件中的數(shù)據(jù)。如果把權(quán)限對應(yīng)到命令上,那么一旦對文件有讀(r)權(quán)限,就可以對文件執(zhí)行 cat、more、less、head、tail 等文件查看命令。
    -寫(w):對文件有寫(w)權(quán)限,代表可以修改文件中的數(shù)據(jù)。如果把權(quán)限對應(yīng)到命令上,那么一旦對文件有寫(w)權(quán)限,就可以對文件執(zhí)行 vim、echo 等修改文件數(shù)據(jù)的命令。注意,對文件有寫權(quán)限,是不能刪除文件本身的,只能修改文件中的數(shù)據(jù)。如果要想刪除文件,則需要對文件的上級目錄擁有寫權(quán)限。
    -執(zhí)行(x):對文件有執(zhí)行(x)權(quán)限,代表文件擁有了執(zhí)行權(quán)限,可以運(yùn)行。在 Linux 中,只要文件有執(zhí)行(x)權(quán)限,這個文件就是執(zhí)行文件了。只是這個文件到底能不能正確執(zhí)行,不僅需要執(zhí)行(x)權(quán)限,還要看文件中的代碼是不是正確的語言代碼。對文件來說,執(zhí)行(x)權(quán)限是最高權(quán)限。

    權(quán)限對目錄的作用

    -讀(r):對目錄有讀 (r)權(quán)限,代表可以查看目錄下的內(nèi)容,也就是可以查看目錄下有哪些子文件和子目錄。如果把權(quán)限對應(yīng)到命令上,那么一旦對目錄擁有了讀(r)權(quán)限,就可以在目錄下執(zhí)行 ls 命令,查看目錄下的內(nèi)容了。
    -寫(w):對目錄有寫(r)權(quán)限,代表可以修改目錄下的數(shù)據(jù),也就是可以在目錄中新建、刪除、復(fù)制、剪切子文件或子目錄。如果把權(quán)限對應(yīng)到命令上,那么一旦對目錄擁有了寫(w)權(quán)限,就可以在目錄下執(zhí)行 touch、rm、cp、mv 命令。對目錄來說,寫(w)權(quán)限是最高權(quán)限。
    -執(zhí)行(x):目錄是不能運(yùn)行的,那么對目錄擁有執(zhí)行(x)權(quán)限,代表可以進(jìn)入目錄。如果把權(quán)限對應(yīng)到命令上,那么一旦對目錄擁有了執(zhí)行(x)權(quán)限,就可以對目錄執(zhí)行 cd 命令,進(jìn)入目錄。

    注意事項

    初學(xué)權(quán)限的時候,可能對兩種情況最不能理解,我們一個一個來看。
    1) 為什么對文件有寫權(quán)限,卻不能刪除文件?
    這需要通過分區(qū)的格式化來講解。我們之前講過,分區(qū)的格式化可以理解為給分區(qū)打入隔斷,這樣才可以存儲數(shù)據(jù)。
    在 Linux 的 ext 文件系統(tǒng)中,格式化可以理解為把分區(qū)分成兩大部分:
    一部分占用空間較小,用于保存 inode(i 節(jié)點(diǎn))信息;絕大部分格式化為 block(數(shù)據(jù)塊),用于保存文件中的實際數(shù)據(jù)。
    在 Linux 中,默認(rèn) inode 的大小為 128 Byte,用于記錄文件的權(quán)限(r、w、x)、文件的所有者和屬組、文件的大小、文件的狀態(tài)改變時間(ctime)、文件的最近一次讀取時間(atime)、文件的最近一次修改時間(mtime)、文件中的數(shù)據(jù)真正保存的 block 編號。每個文件需要占用一個 inode。
    仔細(xì)觀察,在 inode 中并沒有記錄文件的文件名。那是因為文件名是記錄在文件上級目錄的 block 中的。我們畫一張示意圖看看,假設(shè)有這樣一個文件 /test/cangls,如圖 1 所示。
linux培訓(xùn)

    圖 1 inode示意圖

    我們可以看到,在 /test/ 目錄的 block 中會記錄這個目錄下所有的一級子文件或一級子目錄的文件名及其對應(yīng)的 inode 好。也就是說,系統(tǒng)讀取 cangls 文件的過程是這樣的:
    通過 /test/ 目錄的 inode 信息,找到 /test/ 目錄的 block。
    在 /test/ 目錄的 block 中,查看到 cangls 文件的 inode 號。
    通過 cangls 文件的 inode 號,找到了 cangls 文件的 inode 信息。
    確定是否有權(quán)限訪問 cangls 文件的內(nèi)容。
    通過 inode 信息中 block 的位置,找到 cangls 文件實際的 block。
    讀取 block 數(shù)據(jù),從而讀取出 cangls 文件的內(nèi)容。
    既然如此,那么 /test/ 目錄的文件名放在哪里呢?當(dāng)然放在 / 目錄的 block 中了,而/目錄的 inode 號(/ 目錄的 inode 號是 2)是系統(tǒng)已知的。也就是說,在系統(tǒng)中讀取任意一個文件,都要先通過 / 目錄的 inode 信息找到 / 目錄的 block,再查看 / 目錄的 block,從而可以確定一級目錄的 inode 信息。然后一級一級地查找到最終文件的 block 信息,從而讀取數(shù)據(jù)。
    總結(jié):因為文件名保留在上級目錄的 block 中,所以對文件擁有寫權(quán)限,是不能刪除文件本身的,只能刪除文件中的數(shù)據(jù)(也就是文件 block 中的內(nèi)容)。要想刪除文件名,需要對文件所在目錄擁有寫權(quán)限。
    2) 目錄的可用權(quán)限。
    對目錄來講,如果只賦予只讀(r)權(quán)限,則是不可以使用的。大家想想,要想讀取目錄下的文件,你怎么也要進(jìn)入目錄才可以吧?而進(jìn)入目錄,對目錄來講,需要執(zhí)行(x)權(quán)限的支持。
    目錄的可用權(quán)限其實只有以下幾個。
    0:任何權(quán)都不賦予。
    5:基本的目錄瀏覽和進(jìn)入權(quán)限。
    7:完全權(quán)限。

    示例

    我們做權(quán)限的實驗,是不能使用 root 用戶測試的。由于 root 用戶是超級用戶,就算沒有任何權(quán)限,root 用戶依然可執(zhí)行全部操作。
    所以我們只能使用普通用戶來驗證權(quán)限,而目前普通用戶又不能修改文件權(quán)限(不是普通用戶不能修改文件權(quán)限,而是只有文件的所有者才能修改文件權(quán)限,我們當(dāng)前沒有講修改所有者的命令,從而導(dǎo)致普通用戶不能修改文件權(quán)限)。在實驗中,筆者會用 root 用戶來修改文件權(quán)限,而用普通用戶 user 來驗證權(quán)限,請大家注意用戶身份的變化。
    實驗思路:由 root 用戶把測試目錄和測試文件的權(quán)限改為最?。?),然后逐步放大權(quán)限,用普通用戶來驗證每個權(quán)限可以執(zhí)行那些命令。
    創(chuàng)建普通用戶 user 的簡單步驟:第一步,添加用戶執(zhí)行命令"useradd user";第二步,設(shè)置用戶密碼 "passwd user",輸入兩次密碼確認(rèn)。
    #步驟一:由root身份建立測試文件
    [root@localhost ~]# cd /home/user/
    #進(jìn)入普通用戶的家目錄中建立測試目錄和文件,因為普通用戶無法進(jìn)入root的家目錄中[root@localhost user]# mkdir test
    [root@localhost user]# touch test/cangls
    #建立測試目錄和文件
    [root@localhost user]# chmod 750 test/
    #修改test目錄的權(quán)限為750
    #由于沒有修改所有者和所屬組,所以user用戶會匹配其他人權(quán)限#為了實驗效果,只把他人的權(quán)限改為0,而所有者和所屬組權(quán)限不修改[root@localhost user]# chmod 640 test/cangls#修改cangls文件的權(quán)限為640
    #步驟二:由user用戶測試權(quán)限(執(zhí)行命令"su-user"切換用戶)[user@localhost ~]$ ll
    總用量 4
    drwxr-x—-- 2 root root 4096 6月 15 13:19 test#思考:為什么user對test目錄沒有權(quán)限,卻能看到 test目錄?
    [user@localhost ~]$ ls test/
    ls:無法打開目錄test/:權(quán)限不夠
    [user@localhost ~]$ cd test/
    -bash: cd: test/:權(quán)限不夠
    #由于user用戶對test目錄沒有權(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#注意,這是測試實驗,只讀(r)權(quán)限對目錄無法正常使用#步驟四:由user用戶測試,讀(r)權(quán)限雖然可以看到目錄下的內(nèi)容,但是不能正常使用[user@localhost ~]$ ls test/
    ls:無法訪問test/cangls:權(quán)限不夠
    cangls
    #ls查看目錄下的內(nèi)容,雖然看到了文件名,但依然報錯"權(quán)限不夠"[user@localhost ~]$ ll test/
    ls:無法訪問test/cangls:權(quán)限不夠
    總用量0
    -????????? ???? ? cangls
    #ll查看目錄下的內(nèi)容,會發(fā)現(xiàn)由于權(quán)限不足,所以只能看到文件名,其他信息都是"?",代表不能正常查看[user@localhost ~]$ cd test/
    -bash: cd: test/:權(quán)限不夠
    #當(dāng)然也不能進(jìn)入目錄
    #所以,只讀(r)權(quán)限對目錄來說是無法正常使用的權(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)限對目錄來說才是可以正常使用的權(quán)限#步驟六:由user用戶測試
    [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)入目錄了
    #步驟七:我們開始測試文件權(quán)限,由user用戶測試[user@localhost test]$ cat cangls
    cat: cangls:權(quán)限不夠
    #user用戶沒有讀(r)權(quán)限,所以不能查看文件的內(nèi)容[user@localhost test]$ echo 22222 >> cangls-bash: cangls:權(quán)限不夠
    #user用戶沒有寫(w)權(quán)限,所以不能寫入數(shù)據(jù)
    #步驟八:由root用戶給cangls文件賦予讀(r)權(quán)限[root@localhost user]# chmod 644 test/cangls#步驟九:由user用戶測試,可以讀取cangls文件的內(nèi)容[user@localhost test]$ cat cangls
    [user@localhost test]$
    #雖然文件為空,但是不再報錯
    [user@localhost test]$ echo 22222 >> cangls-bash: cangls:權(quán)限不夠
    #由于沒有寫權(quán)限,所以依然不能向文件中寫入數(shù)據(jù)#步驟十:由root用戶給cangls文件賦予寫(w)權(quán)限[root@localhost user]# chmod 646 test/cangls#這只是實驗,才會出現(xiàn)其他人權(quán)限高于所屬組權(quán)限的情況,實際情境不會這樣#步驟十一:由user用戶測試,可以對cangls文件寫入數(shù)據(jù)[user@localhost test]$ echo 22222 >> cangls[user@localhost test]$ rm -rf cangls
    rm:無法刪除"cangls":權(quán)限不夠
    #可以對cangls文件寫入數(shù)據(jù),但是不能刪除這個文件本身#步驟十二:由root用戶給test目錄賦予寫(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用戶測試,可以刪除cangls文件,并且可以新建、復(fù)制和剪切[user@localhost test]$ rm -rf cangls
    #可以刪除
    [user@localhost test]$ touch bols
    #可以新建bols文件
    [user@localhost test]$ mv bols Imls
    #可以把bols文件改名為lmls
    這個實驗并不復(fù)雜,但是由于需要在兩個用戶身份之間切換,所以代碼確實比較長。這個實驗可以充分說明每個權(quán)限可以執(zhí)行哪些命令,可以幫助我們更好地理解權(quán)限的含義。
    》》》更多的關(guān)于linux培訓(xùn)知識,歡迎隨時咨詢傳智播客網(wǎng)站右下側(cè)咨詢窗口《《《
傳智播客linux培訓(xùn)

0 分享到:
和我們在線交談!