<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 5.2 Linux 文件權限概念 大致了解了Linux的使用者與群組之后,接著下來,我們要來談一談,這個文件的權限要如何針對這些所謂的“使用者”與“群組”來設置呢? 這個部分是相當重要的,尤其對于初學者來說,因為文件的權限與屬性是學習Linux的一個相當重要的關卡, 如果沒有這部份的概念,那么你將老是聽不懂別人在講什么呢!尤其是當你在你的屏幕前面出現了“Permission deny”的時候,不要擔心,“肯定是權限設置錯誤”啦!呵呵!好了,閑話不多聊,趕快來瞧一瞧先。 ### 5.2.1 Linux文件屬性 嗯!既然要讓你了解Linux的文件屬性,那么有個重要的也是常用的指令就必須要先跟你說啰!那一個?就是“ ls ”這一個察看文件的指令啰!在你以dmtsai登陸系統,然后使用 su - 切換身份成為root后, 下達“ ls -al ”看看,會看到下面的幾個咚咚: ``` [dmtsai@study ~]$ su - # 先來切換一下身份看看 Password: Last login: Tue Jun 2 19:32:31 CST 2015 on tty2 [root@study ~]# ls -al total 48 dr-xr-x---. 5 root root 4096 May 29 16:08 . dr-xr-xr-x. 17 root root 4096 May 4 17:56 .. -rw-------. 1 root root 1816 May 4 17:57 anaconda-ks.cfg -rw-------. 1 root root 927 Jun 2 11:27 .bash_history -rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout -rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile -rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc drwxr-xr-x. 3 root root 17 May 6 00:14 .config &lt;=范例說明處 drwx------. 3 root root 24 May 4 17:59 .dbus -rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg &lt;=范例說明處 [ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ] [ 7 ] [ 權限 ][鏈接][擁有者][群組][文件大小][ 修改日期 ] [ 文件名 ] ``` ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 由于本章后續的chgrp, chown等指令可能都需要使用root的身份才能夠處理,所以這里建議您以root的身份來學習!要注意的是, 我們還是不建議你直接使用 root 登陸系統,建議使用 su - 這個指令來切換身份喔!離開 su - 則使用 exit 回到 dmtsai 的身份即可! ls是“list”的意思,重點在顯示文件的文件名與相關屬性。而選項“-al”則表示列出所有的文件詳細的權限與屬性 (包含隱藏文件,就是文件名第一個字符為“ . ”的文件)。如上所示,在你第一次以root身份登陸Linux時, 如果你輸入上述指令后,應該有上列的幾個東西,先解釋一下上面七個字段個別的意思: ![文件屬性的示意圖](https://box.kancloud.cn/2016-05-13_5735737241461.gif)圖5.2.1、文件屬性的示意圖 * 第一欄代表這個文件的類型與權限(permission): 這個地方最需要注意了!仔細看的話,你應該可以發現這一欄其實共有十個字符:(圖5.2.1及圖5.2.2內的權限并無關系) ![文件的類型與權限之內容](https://box.kancloud.cn/2016-05-13_5735737254195.gif)圖5.2.2、文件的類型與權限之內容 * 第一個字符代表這個文件是“目錄、文件或鏈接文件等等”: * 當為[ d ]則是目錄,例如[上表](../Text/index.html#table2.1.1)文件名為“.config”的那一行; * 當為[ - ]則是文件,例如[上表](../Text/index.html#table2.1.1)文件名為“initial-setup-ks.cfg”那一行; * 若是[ l ]則表示為鏈接文件(link file); * 若是[ b ]則表示為設備文件里面的可供儲存的周邊設備(可隨機存取設備); * 若是[ c ]則表示為設備文件里面的序列埠設備,例如鍵盤、鼠標(一次性讀取設備)。 * 接下來的字符中,以三個為一組,且均為“rwx” 的三個參數的組合。其中,[ r ]代表可讀(read)、[ w ]代表可寫(write)、[ x ]代表可執行(execute)。 要注意的是,這三個權限的位置不會改變,如果沒有權限,就會出現減號[ - ]而已。 * 第一組為“文件擁有者可具備的權限”,以“initial-setup-ks.cfg”那個文件為例, 該文件的擁有者可以讀寫,但不可執行; * 第二組為“加入此群組之帳號的權限”; * 第三組為“非本人且沒有加入本群組之其他帳號的權限”。 ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 請你特別注意喔!不論是那一組權限,基本上,都是“針對某些帳號來設計的權限”喔!以群組來說,他規范的是“加入這個群組的帳號具有什么樣的權限”之意, 以學校社團為例,假設學校有個童軍社的社團辦公室,“加入童軍社的同學就可以進出社辦”,主角是“學生(帳號)”而不是童軍社本身喔!這樣可以理解嗎? 例題:若有一個文件的類型與權限數據為“-rwxr-xr--”,請說明其意義為何?答:先將整個類型與權限數據分開查閱,并將十個字符整理成為如下所示: &gt; [-][rwx][r-x][r--] &gt; ?1??234??567??890 ?1 為:代表這個文件名為目錄或文件,本例中為文件(-); 234為:擁有者的權限,本例中為可讀、可寫、可執行(rwx); 567為:同群組使用者權限,本例中為可讀可執行(rx); 890為:其他使用者權限,本例中為可讀(r),就是只讀之意 同時注意到,rwx所在的位置是不會改變的,有該權限就會顯示字符,沒有該權限就變成減號(-)就是了。 另外,目錄與文件的權限意義并不相同,這是因為目錄與文件所記錄的數據內容不相同所致。 由于目錄與文件的權限意義非常的重要,所以鳥哥將他獨立到[5.2.3節中的目錄與文件之權限意義](../Text/index.html#filepermission_dir)中再來談。 * 第二欄表示有多少文件名鏈接到此節點(i-node): 每個文件都會將他的權限與屬性記錄到文件系統的i-node中,不過,我們使用的目錄樹卻是使用文件名來記錄, 因此每個文件名就會鏈接到一個i-node啰!這個屬性記錄的,就是有多少不同的文件名鏈接到相同的一個i-node號碼去就是了。 關于i-node的相關數據我們會在[第七章](../Text/index.html)談到文件系統時再加強介紹的。 * 第三欄表示這個文件(或目錄)的“擁有者帳號” * 第四欄表示這個文件的所屬群組 在Linux系統下,你的帳號會加入于一個或多個的群組中。舉剛剛我們提到的例子,class1, class2, class3均屬于projecta這個群組,假設某個文件所屬的群組為projecta,且該文件的權限如[圖5.2.2](../Text/index.html#fig5.2.2)所示(-rwxrwx---), 則class1, class2, class3三人對于該文件都具有可讀、可寫、可執行的權限(看群組權限)。 但如果是不屬于projecta的其他帳號,對于此文件就不具有任何權限了。 * 第五欄為這個文件的容量大小,默認單位為Bytes; * 第六欄為這個文件的創建日期或者是最近的修改日期: 這一欄的內容分別為日期(月/日)及時間。如果這個文件被修改的時間距離現在太久了,那么時間部分會僅顯示年份而已。 如下所示: ``` [root@study ~]# ll /etc/services /root/initial-setup-ks.cfg -rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services -rw-r--r--. 1 root root 1864 May 4 18:01 /root/initial-setup-ks.cfg # 如上所示,/etc/services 為 2013 年所修改過的文件,離現在太遠之故,所以只顯示年份; # 至于 /root/initial-setup-ks.cfg 是今年 (2015) 所創建的,所以就顯示完整的時間了。 ``` 如果想要顯示完整的時間格式,可以利用ls的選項,亦即:“ls -l --full-time”就能夠顯示出完整的時間格式了!包括年、月、日、時間喔。 另外,如果你當初是以繁體中文安裝你的Linux系統,那么日期字段將會以中文來顯示。 可惜的是,中文并沒有辦法在純文本的終端機模式中正確的顯示,所以此欄會變成亂碼。 那你就得要使用“export LC_ALL=en_US.utf8”來修改語系喔! 如果想要讓系統默認的語系變成英文的話,那么你可以修改系統配置文件“/etc/locale.conf”,利用第四章談到的[nano](../Text/index.html#nano)來修改該文件的內容,使LANG這個變量成為上述的內容即可。 * 第七欄為這個文件的文件名 這個字段就是文件名了。比較特殊的是:如果文件名之前多一個“ . ”,則代表這個文件為“隱藏文件”,例如[上表中的.config那一行](../Text/index.html#table2.1.1),該文件就是隱藏文件。 你可以使用“ls”及“ls -a”這兩個指令去感受一下什么是隱藏文件啰! ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 對于更詳細的 ls 用法,還記得怎么查詢嗎?對啦!使用 ls --help 或 man ls 或 info ls 去看看他的基礎用法去!自我進修是很重要的, 因為“師傅帶進門,修行看個人!”,自古只有天才學生,沒有明星老師呦!加油吧!^_^ 這七個字段的意義是很重要的!務必清楚的知道各個字段代表的意義!尤其是第一個字段的九個權限, 那是整個Linux文件權限的重點之一。下面我們來做幾個簡單的練習,你就會比較清楚啰! 例題:假設test1, test2, test3同屬于testgroup這個群組,如果有下面的兩個文件,請說明兩個文件的擁有者與其相關的權限為何? ``` -rw-r--r-- 1 root root 238 Jun 18 17:22 test.txt -rwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 ping_tsai ``` 答: * 文件test.txt的擁有者為root,所屬群組為root。至于權限方面則只有root這個帳號可以存取此文件,其他人則僅能讀此文件; * 另一個文件ping_tsai的擁有者為test1,而所屬群組為testgroup。其中: * test1 可以針對此文件具有可讀可寫可執行的權力; * 而同群組的test2, test3兩個人與test1同樣是testgroup的群組帳號,則僅可讀可執行但不能寫(亦即不能修改); * 至于沒有加入testgroup這一個群組的其他人則僅可以讀,不能寫也不能執行! 例題:承上一題如果我的目錄為下面的樣式,請問testgroup這個群組的成員與其他人(others)是否可以進入本目錄? ``` drwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 groups/ ``` 答: * 文件擁有者test1[rwx]可以在本目錄中進行任何工作; * 而testgroup這個群組[r-x]的帳號,例如test2, test3亦可以進入本目錄進行工作,但是不能在本目錄下進行寫入的動作; * 至于other的權限中[r--]雖然有r ,但是由于沒有x的權限,因此others的使用者,并不能進入此目錄! * Linux文件權限的重要性: 與Windows系統不一樣的是,在Linux系統當中,每一個文件都多加了很多的屬性進來,尤其是群組的概念,這樣有什么用途呢? 其實,最大的用途是在“數據安全性”上面的。 * 系統保護的功能: 舉個簡單的例子,在你的系統中,關于系統服務的文件通常只有root才能讀寫或者是執行,例如/etc/shadow這一個帳號管理的文件,由于該文件記錄了你系統中所有帳號的數據, 因此是很重要的一個配置文件,當然不能讓任何人讀取(否則密碼會被竊取啊),只有root才能夠來讀取啰!所以該文件的權限就會成為[ ---------- ]啰!咦!所有人都不能使用?沒關系,root基本上是不受系統的權限所限制的, 所以無論文件權限為何,默認root都可以存取喔! * 團隊開發軟件或數據共享的功能: 此外,如果你有一個軟件開發團隊,在你的團隊中,你希望每個人都可以使用某一些目錄下的文件, 而非你的團隊的其他人則不予以開放呢?以上面的例子來說,testgroup的團隊共有三個人,分別是test1, test2, test3,那么我就可以將團隊所需的文件權限訂為[ -rwxrws--- ]來提供給testgroup的工作團隊使用啰!(怎么會有 s 呢?沒關系,這個我們在后續章節再講給你聽!) * 未將權限設置妥當的危害: 再舉個例子來說,如果你的目錄權限沒有作好的話,可能造成其他人都可以在你的系統上面亂搞啰! 例如本來只有root才能做的開關機、ADSL的撥接程序、新增或刪除使用者等等的指令,若被你改成任何人都可以執行的話, 那么如果使用者不小心給你重新開機啦!重新撥接啦!等等的!那么你的系統不就會常常莫名其妙的掛掉啰! 而且萬一你的使用者的密碼被其他不明人士取得的話,只要他登陸你的系統就可以輕而易舉的執行一些root的工作! 可怕吧!因此,在你修改你的linux文件與目錄的屬性之前,一定要先搞清楚, 什么數據是可變的,什么是不可變的!千萬注意啰!接下來我們來處理一下文件屬性與權限的變更吧! ### 5.2.2 如何改變文件屬性與權限 我們現在知道文件權限對于一個系統的安全重要性了,也知道文件的權限對于使用者與群組的相關性, 那么如何修改一個文件的屬性與權限呢?又!有多少文件的權限我們可以修改呢? 其實一個文件的屬性與權限有很多!我們先介紹幾個常用于群組、擁有者、各種身份的權限之修改的指令,如下所示: * chgrp :改變文件所屬群組 * chown :改變文件擁有者 * chmod :改變文件的權限, SUID, SGID, SBIT等等的特性 * 改變所屬群組, chgrp 改變一個文件的群組真是很簡單的,直接以chgrp來改變即可,咦!這個指令就是change group的縮寫嘛!這樣就很好記了吧! ^_^。不過,請記得,要被改變的群組名稱必須要在/etc/group文件內存在才行,否則就會顯示錯誤! 假設你已經是root的身份了,那么在你的主文件夾內有一個名為 initial-setup-ks.cfg 的文件, 如何將該文件的群組改變一下呢?假設你已經知道在/etc/group里面已經存在一個名為users的群組, 但是testing這個群組名字就不存在/etc/group當中了,此時改變群組成為users與testing分別會有什么現象發生呢? ``` [root@study ~]# chgrp [-R] dirname/filename ... 選項與參數: -R : 進行遞回(recursive)的持續變更,亦即連同次目錄下的所有文件、目錄 都更新成為這個群組之意。常常用在變更某一目錄內所有的文件之情況。 范例: [root@study ~]# chgrp users initial-setup-ks.cfg [root@study ~]# ls -l -rw-r--r--. 1 root users 1864 May 4 18:01 initial-setup-ks.cfg [root@study ~]# chgrp testing initial-setup-ks.cfg chgrp: invalid group: `testing' &lt;== 發生錯誤訊息啰~找不到這個群組名~ ``` 發現了嗎?文件的群組被改成users了,但是要改成testing的時候, 就會發生錯誤~注意喔!發生錯誤訊息還是要努力的查一查錯誤訊息的內容才好! 將他英文翻譯成為中文,就知道問題出在哪里了。 * 改變文件擁有者, chown 如何改變一個文件的擁有者呢?很簡單呀!既然改變群組是change group,那么改變擁有者就是change owner啰!BINGO!那就是chown這個指令的用途,要注意的是, 使用者必須是已經存在系統中的帳號,也就是在/etc/passwd 這個文件中有紀錄的使用者名稱才能改變。 chown的用途還滿多的,他還可以順便直接修改群組的名稱呢!此外,如果要連目錄下的所有次目錄或文件同時更改文件擁有者的話,直接加上 -R 的選項即可!我們來看看語法與范例: ``` [root@study ~]# chown [-R] 帳號名稱 文件或目錄 [root@study ~]# chown [-R] 帳號名稱:群組名稱 文件或目錄 選項與參數: -R : 進行遞回(recursive)的持續變更,亦即連同次目錄下的所有文件都變更 范例:將 initial-setup-ks.cfg 的擁有者改為bin這個帳號: [root@study ~]# chown bin initial-setup-ks.cfg [root@study ~]# ls -l -rw-r--r--. 1 bin users 1864 May 4 18:01 initial-setup-ks.cfg 范例:將 initial-setup-ks.cfg 的擁有者與群組改回為root: [root@study ~]# chown root:root initial-setup-ks.cfg [root@study ~]# ls -l -rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg ``` ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 事實上,chown也可以使用“**chown user.group file**”,亦即在擁有者與群組間加上小數點“ . ”也行! 不過很多朋友設置帳號時,喜歡在帳號當中加入小數點(例如vbird.tsai這樣的帳號格式),這就會造成系統的誤判了! 所以我們比較建議使用冒號“:”來隔開擁有者與群組啦!此外,chown也能單純的修改所屬群組呢! 例如“**chown .sshd initial-setup-ks.cfg**”就是修改群組~看到了嗎?就是那個小數點的用途! 知道如何改變文件的群組與擁有者了,那么什么時候要使用chown或chgrp呢?或許你會覺得奇怪吧? 是的,確實有時候需要變更文件的擁有者的,最常見的例子就是在復制文件給你之外的其他人時, 我們使用最簡單的cp指令來說明好了: ``` [root@study ~]# cp 來源文件 目的文件 ``` 假設你今天要將.bashrc這個文件拷貝成為.bashrc_test文件名,且是要給bin這個人,你可以這樣做: ``` [root@study ~]# cp .bashrc .bashrc_test [root@study ~]# ls -al .bashrc* -rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc -rw-r--r--. 1 root root 176 Jun 3 00:04 .bashrc_test &lt;==新文件的屬性沒變 ``` 由于復制行為(cp)會復制執行者的屬性與權限,所以!怎么辦?.bashrc_test還是屬于root所擁有, 如此一來,即使你將文件拿給bin這個使用者了,那他仍然無法修改的(看屬性/權限就知道了吧), 所以你就必須要將這個文件的擁有者與群組修改一下啰!知道如何修改了吧? * 改變權限, chmod 文件權限的改變使用的是chmod這個指令,但是,權限的設置方法有兩種, 分別可以使用數字或者是符號來進行權限的變更。我們就來談一談: * 數字類型改變文件權限 Linux文件的基本權限就有九個,分別是owner/group/others三種身份各有自己的read/write/execute權限, 先復習一下剛剛上面提到的數據:文件的權限字符為:“-rwxrwxrwx”, 這九個權限是三個三個一組的!其中,我們可以使用數字來代表各個權限,各權限的分數對照表如下: &gt; r:4 &gt; w:2 &gt; x:1 每種身份(owner/group/others)各自的三個權限(r/w/x)分數是需要累加的,例如當權限為: [-rwxrwx---] 分數則是: &gt; owner = rwx = 4+2+1 = 7 &gt; group = rwx = 4+2+1 = 7 &gt; others= --- = 0+0+0 = 0 所以等一下我們設置權限的變更時,該文件的權限數字就是770啦!變更權限的指令chmod的語法是這樣的: ``` [root@study ~]# chmod [-R] xyz 文件或目錄 選項與參數: xyz : 就是剛剛提到的數字類型的權限屬性,為 rwx 屬性數值的相加。 -R : 進行遞回(recursive)的持續變更,亦即連同次目錄下的所有文件都會變更 ``` 舉例來說,如果要將.bashrc這個文件所有的權限都設置啟用,那么就下達: ``` [root@study ~]# ls -al .bashrc -rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc [root@study ~]# chmod 777 .bashrc [root@study ~]# ls -al .bashrc -rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc ``` 那如果要將權限變成“ -rwxr-xr-- ”呢?那么權限的分數就成為 [4+2+1][4+0+1][4+0+0]=754 啰!所以你需要下達“ chmod 754 filename”。 另外,在實際的系統運行中最常發生的一個問題就是,常常我們以[vim](../Text/index.html)編輯一個shell的文字批處理文件后,他的權限通常是 -rw-rw-r-- 也就是664, 如果要將該文件變成可可執行文件,并且不要讓其他人修改此一文件的話, 那么就需要-rwxr-xr-x這樣的權限,此時就得要下達:“ chmod 755 test.sh ”的指令啰! 另外,如果有些文件你不希望被其他人看到,那么應該將文件的權限設置為例如:“-rwxr-----”,那就下達“ chmod 740 filename ”吧! 例題:將剛剛你的.bashrc這個文件的權限修改回-rw-r--r--的情況吧!答:-rw-r--r--的分數是644,所以指令為:`chmod 644 .bashrc` * 符號類型改變文件權限 還有一個改變權限的方法呦!從之前的介紹中我們可以發現,基本上就九個權限分別是(1)user (2)group (3)others三種身份啦!那么我們就可以借由u, g, o來代表三種身份的權限!此外, a 則代表 all 亦即全部的身份!那么讀寫的權限就可以寫成r, w, x啰!也就是可以使用下面的方式來看: ``` | chmod | u g o a | +(加入) -(除去) =(設置) | r w x | 文件或目錄 | ``` 來實作一下吧!假如我們要“設置”一個文件的權限成為“-rwxr-xr-x”時,基本上就是: * user (u):具有可讀、可寫、可執行的權限; * group 與 others (g/o):具有可讀與執行的權限。 所以就是: ``` [root@study ~]# chmod u=rwx,go=rx .bashrc # 注意喔!那個 u=rwx,go=rx 是連在一起的,中間并沒有任何空白字符! [root@study ~]# ls -al .bashrc -rwxr-xr-x. 1 root root 176 Dec 29 2013 .bashrc ``` 那么假如是“ -rwxr-xr-- ”這樣的權限呢?可以使用“ chmod u=rwx,g=rx,o=r filename ”來設置。此外,如果我不知道原先的文件屬性,而我只想要增加.bashrc這個文件的每個人均可寫入的權限, 那么我就可以使用: ``` [root@study ~]# ls -al .bashrc -rwxr-xr-x. 1 root root 176 Dec 29 2013 .bashrc [root@study ~]# chmod a+w .bashrc [root@study ~]# ls -al .bashrc -rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc ``` 而如果是要將權限去掉而不更動其他已存在的權限呢?例如要拿掉全部人的可執行權限,則:s ``` [root@study ~]# chmod a-x .bashrc [root@study ~]# ls -al .bashrc -rw-rw-rw-. 1 root root 176 Dec 29 2013 .bashrc [root@study ~]# chmod 644 .bashrc # 測試完畢得要改回來喔! ``` 知道 +, -, = 的不同點了嗎?對啦! + 與 – 的狀態下,只要是沒有指定到的項目,則該權限“不會被變動”, 例如上面的例子中,由于僅以 – 拿掉 x 則其他兩個保持當時的值不變!多多實作一下,你就會知道如何改變權限啰! 這在某些情況下面很好用的~舉例來說,你想要教一個朋友如何讓一個程序可以擁有執行的權限, 但你又不知道該文件原本的權限為何,此時,利用“chmod a+x filename” ,就可以讓該程序擁有執行的權限了。是否很方便? ### 5.2.3 目錄與文件之權限意義: 現在我們知道了Linux系統內文件的三種身份(擁有者、群組與其他人),知道每種身份都有三種權限(rwx), 已知道能夠使用chown, chgrp, chmod去修改這些權限與屬性,當然,利用ls -l去觀察文件也沒問題。 前兩小節也談到了這些文件權限對于數據安全的重要性。那么,這些文件權限對于一般文件與目錄文件有何不同呢? 有大大的不同啊!下面就讓鳥哥來說清楚,講明白! * 權限對文件的重要性 文件是實際含有數據的地方,包括一般文本文件、數據庫內容檔、二進制可可執行文件(binary program)等等。 因此,權限對于文件來說,他的意義是這樣的: * r (read):可讀取此一文件的實際內容,如讀取文本文件的文字內容等; * w (write):可以編輯、新增或者是修改該文件的內容(但不含刪除該文件); * x (eXecute):該文件具有可以被系統執行的權限。 那個可讀(r)代表讀取文件內容是還好了解,那么可執行(x)呢?這里你就必須要小心啦! 因為在Windows下面一個文件是否具有執行的能力是借由“ 擴展名 ”來判斷的, 例如:.exe, .bat, .com 等等,但是在Linux下面,我們的文件是否能被執行,則是借由是否具有“x”這個權限來決定的!跟文件名是沒有絕對的關系的! 至于最后一個w這個權限呢?當你對一個文件具有w權限時,你可以具有寫入/編輯/新增/修改文件的內容的權限, 但并不具備有刪除該文件本身的權限!對于文件的rwx來說, 主要都是針對“文件的內容”而言,與文件文件名的存在與否沒有關系喔!因為文件記錄的是實際的數據嘛! * 權限對目錄的重要性 文件是存放實際數據的所在,那么目錄主要是儲存啥玩意啊?目錄主要的內容在記錄文件名清單,文件名與目錄有強烈的關連啦! 所以如果是針對目錄時,那個 r, w, x 對目錄是什么意義呢? * r (read contents in directory): 表示具有讀取目錄結構清單的權限,所以當你具有讀取(r)一個目錄的權限時,表示你可以查詢該目錄下的文件名數據。 所以你就可以利用 ls 這個指令將該目錄的內容列表顯示出來! * w (modify contents of directory): 這個可寫入的權限對目錄來說,是很了不起的! 因為他表示你具有異動該目錄結構清單的權限,也就是下面這些權限: * 創建新的文件與目錄; * 刪除已經存在的文件與目錄(不論該文件的權限為何!) * 將已存在的文件或目錄進行更名; * 搬移該目錄內的文件、目錄位置。 總之,目錄的w權限就與該目錄下面的文件名異動有關就對了啦! * x (access directory): 咦!目錄的執行權限有啥用途啊?目錄只是記錄文件名而已,總不能拿來執行吧?沒錯!目錄不可以被執行,目錄的x代表的是使用者能否進入該目錄成為工作目錄的用途! 所謂的工作目錄(work directory)就是你目前所在的目錄啦!舉例來說,當你登陸Linux時, 你所在的主文件夾就是你當下的工作目錄。而變換目錄的指令是“cd”(change directory)啰! 上面的東西這么說,也太條列式~太教條了~有沒有清晰一點的說明啊?好~讓我們來思考一下人類社會使用的東西好了! 現在假設“文件是一堆文件數據夾”,所以你可能可以在上面寫/改一些數據。而“目錄是一堆抽屜”,因此你可以將數據夾分類放置到不同的抽屜去。 因此抽屜最大的目的是拿出/放入數據夾喔!現在讓我們匯整一下數據: | 元件 | 內容 | 疊代物件 | r | w | x | | --- | --- | --- | | 文件 | 詳細數據data | 文件數據夾 | 讀到文件內容 | 修改文件內容 | 執行文件內容 | | 目錄 | 文件名 | 可分類抽屜 | 讀到文件名 | 修改文件名 | 進入該目錄的權限(key) | 根據上述的分析,你可以看到,對一般文件來說,rwx 主要是針對“文件的內容”來設計權限,對目錄來說,rwx則是針對“目錄內的文件名列表”來設計權限。 其中最有趣的大概就屬目錄的 x 權限了!“文件名怎么執行”?沒道理嘛!其實,這個 x 權限設計,就相當于“該目錄,也就是該抽屜的 "鑰匙" ”啦! 沒有鑰匙你怎么能夠打開抽屜呢?對吧! 大致的目錄權限概念是這樣,下面我們來看幾個范例,讓你了解一下啥是目錄的權限啰! 例題:有個目錄的權限如下所示: ``` drwxr--r-- 3 root root 4096 Jun 25 08:35 .ssh ``` 系統有個帳號名稱為vbird,這個帳號并沒有支持root群組,請問vbird對這個目錄有何權限?是否可切換到此目錄中?答:vbird對此目錄僅具有r的權限,因此vbird可以查詢此目錄下的文件名列表。因為vbird不具有x的權限,亦即 vbird 沒有這個抽屜的鑰匙啦! 因此vbird并不能切換到此目錄內!(相當重要的概念!) | 上面這個例題中因為vbird具有r的權限,因為是r乍看之下好像就具有可以進入此目錄的權限,其實那是錯的。 能不能進入某一個目錄,只與該目錄的x權限有關啦!此外, 工作目錄對于指令的執行是非常重要的,如果你在某目錄下不具有x的權限, 那么你就無法切換到該目錄下,也就無法執行該目錄下的任何指令,即使你具有該目錄的r或w的權限。 很多朋友在架設網站的時候都會卡在一些權限的設置上,他們開放目錄數據給網際網絡的任何人來瀏覽, 卻只開放r的權限,如上面的范例所示那樣,那樣的結果就是導致網站服務器軟件無法到該目錄下讀取文件(最多只能看到文件名), 最終用戶總是無法正確的查閱到文件的內容(顯示權限不足啊!)。要注意:要開放目錄給任何人瀏覽時,應該至少也要給予r及x的權限,但w權限不可隨便給! 為什么w不能隨便給,我們來看下一個例子: 例題:假設有個帳號名稱為dmtsai,他的主文件夾在/home/dmtsai/,dmtsai對此目錄具有[rwx]的權限。 若在此目錄下有個名為the_root.data的文件,該文件的權限如下: ``` -rwx------ 1 root root 4365 Sep 19 23:20 the_root.data ``` 請問dmtsai對此文件的權限為何?可否刪除此文件?答:如上所示,由于dmtsai對此文件來說是“others”的身份,因此這個文件他無法讀、無法編輯也無法執行, 也就是說,他無法變動這個文件的內容就是了。 但是由于這個文件在他的主文件夾下, 他在此目錄下具有rwx的完整權限,因此對于the_root.data這個“文件名”來說,他是能夠“刪除”的! 結論就是,dmtsai這個用戶能夠刪除the_root.data這個文件! | ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 上述的例子解釋是這樣的,假設有個莫名其妙的人,拿著一個完全密封的數據夾放到你的辦公室抽屜中,因為完全密封你也打不開、看不到這個數據夾的內部數據(對文件來說,你沒有權限)。 但是因為這個數據夾是放在你的抽屜中,你當然可以拿出/放入任何數據在這個抽屜中(對目錄來說,你具有所有權限)。 所以,情況就是:你打開抽屜、拿出這個沒辦法看到的數據夾、將他丟到走廊上的垃圾桶!搞定了 (順利刪除!)! 還是看不太懂?有聽沒有懂喔!沒關系~我們下面就來設計一個練習, 讓你實際玩玩看,應該就能夠比較近入狀況啦!不過,由于很多指令我們還沒有教, 所以下面的指令有的先了解即可,詳細的指令用法我們會在后面繼續介紹的。 * 先用root的身份創建所需要的文件與目錄環境 我們用root的身份在所有人都可以工作的/tmp目錄中創建一個名為testing的目錄, 該目錄的權限為744且目錄擁有者為root。另外,在testing目錄下在創建一個空的文件, 文件名亦為testing。創建目錄可用mkdir(make directory),創建空文件可用[touch(下一章會說明)](../Text/index.html#touch)來處理。 所以過程如下所示: ``` [root@study ~]# cd /tmp &lt;==切換工作目錄到/tmp [root@study tmp]# mkdir testing &lt;==創建新目錄 [root@study tmp]# chmod 744 testing &lt;==變更權限 [root@study tmp]# touch testing/testing &lt;==創建空的文件 [root@study tmp]# chmod 600 testing/testing &lt;==變更權限 [root@study tmp]# ls -ald testing testing/testing drwxr--r--. 2 root root 20 Jun 3 01:00 testing -rw-------. 1 root root 0 Jun 3 01:00 testing/testing # 仔細看一下,目錄的權限是 744 ,且所屬群組與使用者均是 root 喔! # 那么在這樣的情況下面,一般身份使用者對這個目錄/文件的權限為何? ``` * 一般用戶的讀寫權限為何?觀察中 在上面的例子中,雖然目錄是744的權限設置,一般用戶應該能有 r 的權限, 但這樣的權限使用者能做啥事呢?由于鳥哥的系統中含有一個帳號名為 dmtsai 的,請再開另外一個終端機,使用 dmtsai 登陸來操作下面的任務! ``` [dmtsai@study ~]$ cd /tmp [dmtsai@study tmp]$ ls -l testing/ ls: cannot access testing/testing: Permission denied total 0 ?????????? ? ? ? ? ? testing # 雖然有告知權限不足,但因為具有 r 的權限可以查詢文件名。由于權限不足(沒有x),所以會有一堆問號。 [dmtsai@study tmp]$ cd testing/ -bash: cd: testing/: Permission denied # 因為不具有 x ,所以當然沒有進入的權限啦!有沒有呼應前面的權限說明啊! ``` * 如果該目錄屬于用戶本身,會有什么狀況? 上面的練習我們知道了只有r確實可以讓使用者讀取目錄的文件名列表,不過詳細的信息卻還是讀不到的, 同時也不能將該目錄變成工作目錄(用 cd 進入該目錄之意)。那如果我們讓該目錄變成使用者的, 那么使用者在這個目錄下面是否能夠刪除文件呢?下面的練習做看看: ``` # 1\. 先用 root 的身份來搞定 /tmp/testing 的屬性、權限設置: [root@study tmp]# chown dmtsai /tmp/testing [root@study tmp]# ls -ld /tmp/testing drwxr--r--. 2 dmtsai root 20 6月 3 01:00 /tmp/testing # dmtsai 是具有全部權限的! # 2\. 再用 dmtsai 的帳號來處理一下 /tmp/testing/testing 這個文件看看: [dmtsai@study tmp]$ cd /tmp/testing [dmtsai@study testing]$ ls -l &lt;==確實是可以進入目錄 -rw-------. 1 root root 0 Jun 3 01:00 testing &lt;==文件不是vbird的! [dmtsai@study testing]$ rm testing &lt;==嘗試殺掉這個文件看看! rm: remove write-protected regular empty file `testing'? y # 竟然可以刪除!這樣理解了嗎?! ``` 通過上面這個簡單的步驟,你就可以清楚的知道, x 在目錄當中是與“能否進入該目錄”有關, 至于那個 w 則具有相當重要的權限,因為他可以讓使用者刪除、更新、新建文件或目錄, 是個很重要的參數啊!這樣可以理解了嗎?! ^_^! * 使用者操作功能與權限 剛剛講這樣如果你還是搞不懂~沒關系,我們來處理個特殊的案例!假設兩個文件名,分別是下面這樣: * /dir1/file1 * /dir2 假設你現在在系統使用 dmtsai 這個帳號,那么這個帳號針對 /dir1, /dir1/file1, /dir2 這三個文件名來說,分別需要“哪些最小的權限”才能達成各項任務? 鳥哥匯整如下,如果你看得懂,恭喜你,如果你看不懂~沒關系~未來再來繼續學! | 操作動作 | /dir1 | /dir1/file1 | /dir2 | 重點 | | --- | --- | --- | | 讀取 file1 內容 | x | r | - | 要能夠進入 /dir1 才能讀到里面的文件數據! | | 修改 file1 內容 | x | rw | - | 能夠進入 /dir1 且修改 file1 才行! | | 執行 file1 內容 | x | rx | - | 能夠進入 /dir1 且 file1 能運行才行! | | 刪除 file1 文件 | wx | - | - | 能夠進入 /dir1 具有目錄修改的權限即可! | | 將 file1 復制到 /dir2 | x | r | wx | 要能夠讀 file1 且能夠修改 /dir2 內的數據 | 你可能會問,上面的表格當中,很多時候 /dir1 都不必有 r 耶!為啥?我們知道 /dir1 是個目錄,也是個抽屜!那個抽屜的 r 代表“這個抽屜里面有燈光”, 所以你能看到的抽屜內的所有數據夾名稱 (非內容)。但你已經知道里面的數據夾放在哪個地方,那,有沒有燈光有差嘛?你還是可以摸黑拿到該數據夾的!對吧! 因此,上面很多動作中,你只要具有 x 即可!r 是非必備的!只是,沒有 r 的話,使用 [tab] 時,他就無法自動幫你補齊文件名了!這樣理解乎? ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 看了上面這個表格,你應該會覺得很可怕喔!因為,要讀一個文件時,你得要具有“這個文件所在目錄的 x 權限”才行!所以,通常要開放的目錄, 至少會具備 rx 這兩個權限!現在你知道為啥了吧? ### 5.2.4 Linux文件種類與擴展名 我們在基礎篇一直強調一個概念,那就是:任何設備在Linux下面都是文件, 不僅如此,連數據溝通的接口也有專屬的文件在負責~所以,你會了解到,Linux的文件種類真的很多~ 除了前面提到的一般文件(-)與目錄文件(d)之外,還有哪些種類的文件呢? * 文件種類: 我們在剛剛提到使用“ls -l”觀察到第一欄那十個字符中,第一個字符為文件的類型。 除了常見的一般文件(-)與目錄文件(d)之外,還有哪些種類的文件類型呢? * 正規文件(regular file ): 就是一般我們在進行存取的類型的文件,在由 ls -al 所顯示出來的屬性方面,第一個字符為 [ - ],例如 [-rwxrwxrwx ]。另外,依照文件的內容,又大略可以分為: * 純文本文件(ASCII):這是Linux系統中最多的一種文件類型啰, 稱為純文本文件是因為內容為我們人類可以直接讀到的數據,例如數字、字母等等。 幾乎只要我們可以用來做為設置的文件都屬于這一種文件類型。 舉例來說,你可以下達“ cat ~/.bashrc ”就可以看到該文件的內容。 (cat 是將一個文件內容讀出來的指令) * 二進制檔(binary):還記得我們在“ [第零章、計算機概論](../Text/index.html) ”里面的[軟件程序的運行](../Text/index.html#program)中提過, 我們的系統其實僅認識且可以執行二進制文件(binary file)吧?沒錯~ 你的Linux當中的可可執行文件(scripts, 文字體批處理文件不算)就是這種格式的啦~ 舉例來說,剛剛下達的指令cat就是一個binary file。 * 數據格式文件(data): 有些程序在運行的過程當中會讀取某些特定格式的文件,那些特定格式的文件可以被稱為數據文件 (data file)。舉例來說,我們的Linux在使用者登陸時,都會將登錄的數據記錄在 /var/log/wtmp那個文件內,該文件是一個data file,他能夠通過last這個指令讀出來! 但是使用cat時,會讀出亂碼~因為他是屬于一種特殊格式的文件。瞭乎? * 目錄(directory): 就是目錄啰~第一個屬性為 [ d ],例如 [drwxrwxrwx]。 * 鏈接文件(link): 就是類似Windows系統下面的捷徑啦! 第一個屬性為 [ l ](英文L的小寫),例如 [lrwxrwxrwx] ; * 設備與設備文件(device): 與系統周邊及儲存等相關的一些文件, 通常都集中在/dev這個目錄之下!通常又分為兩種: * 區塊(block)設備文件 :就是一些儲存數據, 以提供系統隨機存取的周邊設備,舉例來說,硬盤與軟盤等就是啦! 你可以隨機的在硬盤的不同區塊讀寫,這種設備就是區塊設備啰!你可以自行查一下/dev/sda看看, 會發現第一個屬性為[ b ]喔! * 字符(character)設備文件:亦即是一些序列埠的周邊設備, 例如鍵盤、鼠標等等!這些設備的特色就是“一次性讀取”的,不能夠截斷輸出。 舉例來說,你不可能讓鼠標“跳到”另一個畫面,而是“連續性滑動”到另一個地方啊!第一個屬性為 [ c ]。 * 數據接口文件(sockets): 既然被稱為數據接口文件, 想當然爾,這種類型的文件通常被用在網絡上的數據承接了。我們可以啟動一個程序來監聽用戶端的要求, 而用戶端就可以通過這個socket來進行數據的溝通了。第一個屬性為 [ s ], 最常在/run或/tmp這些個目錄中看到這種文件類型了。 * 數據輸送檔(FIFO, pipe): FIFO也是一種特殊的文件類型,他主要的目的在解決多個程序同時存取一個文件所造成的錯誤問題。 FIFO是first-in-first-out的縮寫。第一個屬性為[p] 。 除了設備文件是我們系統中很重要的文件,最好不要隨意修改之外(通常他也不會讓你修改的啦!), 另一個比較有趣的文件就是鏈接文件。如果你常常將應用程序捉到桌面來的話,你就應該知道在 Windows下面有所謂的“捷徑”。同樣的,你可以將 linux下的鏈接文件簡單的視為一個文件或目錄的捷徑。 至于socket與FIFO文件比較難理解,因為這兩個咚咚與程序(process)比較有關系, 這個等到未來你了解process之后,再回來查閱吧!此外, 你也可以通過man fifo及man socket來查閱系統上的說明! * Linux文件擴展名: 基本上,Linux的文件是沒有所謂的“擴展名”的,我們剛剛就談過,一個Linux文件能不能被執行,與他的第一欄的十個屬性有關, 與文件名根本一點關系也沒有。這個觀念跟Windows的情況不相同喔!在Windows下面, 能被執行的文件擴展名通常是 .com .exe .bat等等,而在Linux下面,只要你的權限當中具有x的話,例如[ -rwxr-xr-x ] 即代表這個文件具有可以被執行的能力喔! ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 具有“可執行的權限”以及“具有可執行的程序碼”是兩回事!在 Linux 下面,你可以讓一個文本文件,例如我們之前寫的 text.txt 具有“可執行的權限” (加入 x 權限即可), 但是這個文件明顯的無法執行,因為他不具備可執行的程序碼!而如果你將上面提到的 cat 這個可以執行的指令,將他的 x 拿掉,那么 cat 將無法被你執行! 不過,可以被執行跟可以執行成功是不一樣的~舉例來說,在root主文件夾下的 initial-setup-ks.cfg 是一個純文本文件,如果經由修改權限成為 -rwxrwxrwx 后,這個文件能夠真的執行成功嗎? 當然不行~因為他的內容根本就沒有可以執行的數據。所以說,這個x代表這個文件具有可執行的能力, 但是能不能執行成功,當然就得要看該文件的內容啰~ 雖然如此,不過我們仍然希望可以借由擴展名來了解該文件是什么東西,所以, 通常我們還是會以適當的擴展名來表示該文件是什么種類的。下面有數種常用的擴展名: * *.sh : 腳本或批處理文件 (scripts),因為批處理文件為使用shell寫成的,所以擴展名就編成 .sh 啰; * *Z, *.tar, *.tar.gz, *.zip, *.tgz: 經過打包的壓縮文件。這是因為壓縮軟件分別為 gunzip, tar 等等的,由于不同的壓縮軟件,而取其相關的擴展名啰! * *.html, *.php:網頁相關文件,分別代表 HTML 語法與 PHP 語法的網頁文件啰! .html 的文件可使用網頁瀏覽器來直接打開,至于 .php 的文件, 則可以通過 client 端的瀏覽器來 server 端瀏覽,以得到運算后的網頁結果呢! 基本上,Linux系統上的文件名真的只是讓你了解該文件可能的用途而已, 真正的執行與否仍然需要權限的規范才行!例如雖然有一個文件為可可執行文件, 如常見的/bin/ls這個顯示文件屬性的指令,不過,如果這個文件的權限被修改成無法執行時, 那么ls就變成不能執行啰! 上述的這種問題最常發生在文件傳送的過程中。例如你在網絡上下載一個可可執行文件,但是偏偏在你的 Linux系統中就是無法執行!呵呵!那么就是可能文件的屬性被改變了!不要懷疑,從網絡上傳送到你的 Linux系統中,文件的屬性與權限確實是會被改變的喔! * Linux文件長度限制[[1]](#ps1): 在Linux下面,使用傳統的Ext2/Ext3/Ext4文件系統以及近來被 CentOS 7 當作默認文件系統的 xfs 而言,針對文件的文件名長度限制為: * 單一文件或目錄的最大容許文件名為 255Bytes,以一個 ASCII 英文占用一個 Bytes 來說,則大約可達 255 個字符長度。若是以每個中文字占用 2Bytes 來說, 最大文件名就是大約在 128 個中文字之譜! 是相當長的文件名喔!我們希望Linux的文件名稱可以一看就知道該文件在干嘛的, 所以文件名通常是很長很長!而用慣了Windows的人可能會受不了,因為文件名稱通常真的都很長, 對于用慣Windows而導致打字速度不快的朋友來說,嗯!真的是很困擾.....不過,只得勸你好好的加強打字的訓練啰! * Linux文件名稱的限制: 由于Linux在命令行下的一些指令操作關系,一般來說,你在設置Linux下面的文件名稱時, 最好可以避免一些特殊字符比較好!例如下面這些: > * ? &gt; &lt; ; & ! [ ] | \ ' " ` ( ) { } 因為這些符號在命令行下,是有特殊意義的!另外,文件名稱的開頭為小數點“.”時, 代表這個文件為“隱藏文件”喔!同時,由于指令下達當中,常常會使用到 -option 之類的選項, 所以你最好也避免將文件文件名的開頭以 - 或 + 來命名啊!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看