Linux私房菜——第六章笔记

来源:互联网 发布:知乎删除回答 编辑:程序博客网 时间:2024/04/27 23:21

原文

一:

相對路徑與絕對路徑

在開始目錄的切換之前,你必須要先瞭解一下所謂的『路徑(PATH)』, 有趣的是:什麼是『相對路徑』與『絕對路徑』? 雖然前一章已經稍微針對這個議題提過一次,不過,這裡不厭其煩的再次的強調一下!

  • 絕對路徑:路徑的寫法『一定由根目錄 / 寫起』,例如: /usr/share/doc 這個目錄。
  • 相對路徑:路徑的寫法『不是由 / 寫起』,例如由 /usr/share/doc 要到 /usr/share/man 底下時,可以寫成: 『cd ../man』這就是相對路徑的寫法啦!相對路徑意指『相對於目前工作目錄的路徑!』
二:目录相关的操作
.         代表此層目錄..        代表上一層目錄-         代表前一個工作目錄~         代表『目前使用者身份』所在的家目錄~account  代表 account 這個使用者的家目錄(account是個帳號名稱)

處理目錄的指令:

  • cd:變換目錄
  • pwd:顯示目前的目錄
  • mkdir:建立一個新的目錄
  • rmdir:刪除一個空的目錄
Tips鳥哥的圖示還是要一再地提醒,我們的 Linux 的預設指令列模式 (bash shell) 具有檔案補齊功能, 你要常常利用 [tab] 按鍵來達成你的目錄完整性啊!這可是個好習慣啊~可以避免你按錯鍵盤輸入錯字說~ ^_^






  • mkdir (建立新目錄)
[root@study ~]# mkdir [-mp] 目錄名稱選項與參數:-m :設定檔案的權限喔!直接設定,不需要看預設權限 (umask) 的臉色~-p :幫助你直接將所需要的目錄(包含上層目錄)遞迴建立起來!範例:請到/tmp底下嘗試建立數個新目錄看看:[root@study ~]# cd /tmp[root@study tmp]# mkdir test    <==建立一名為 test 的新目錄[root@study tmp]# mkdir test1/test2/test3/test4mkdir: cannot create directory ‘test1/test2/test3/test4’: No such file or directory# 話說,系統告訴我們,沒可能建立這個目錄啊!就是沒有目錄才要建立的!見鬼嘛?[root@study tmp]# mkdir -p test1/test2/test3/test4# 原來是要建 test4 上層沒先建 test3 之故!加了這個 -p 的選項,可以自行幫你建立多層目錄!範例:建立權限為rwx--x--x的目錄[root@study tmp]# mkdir -m 711 test2[root@study tmp]# ls -ld test*drwxr-xr-x. 2 root   root  6 Jun  4 19:03 testdrwxr-xr-x. 3 root   root 18 Jun  4 19:04 test1drwx--x--x. 2 root   root  6 Jun  4 19:05 test2# 仔細看上面的權限部分,如果沒有加上 -m 來強制設定屬性,系統會使用預設屬性。# 那麼你的預設屬性為何?這要透過底下介紹的 umask 才能瞭解喔! ^_^

如果想要建立新的目錄的話,那麼就使用mkdir (make directory)吧! 不過,在預設的情況下, 你所需要的目錄得一層一層的建立才行!例如:假如你要建立一個目錄為 /home/bird/testing/test1,那麼首先必須要有 /home 然後 /home/bird ,再來 /home/bird/testing 都必須要存在,才可以建立 /home/bird/testing/test1 這個目錄!假如沒有 /home/bird/testing 時,就沒有辦法建立 test1 的目錄囉!

不過,現在有個更簡單有效的方法啦!那就是加上 -p 這個選項喔!你可以直接下達:『 mkdir -p /home/bird/testing/test1 』 則系統會自動的幫你將 /home, /home/bird, /home/bird/testing 依序的建立起目錄!並且, 如果該目錄本來就已經存在時,系統也不會顯示錯誤訊息喔!挺快樂的吧! ^_^。 不過鳥哥不建議常用-p這個選項,因為擔心如果妳打錯字,那麼目錄名稱就會變的亂七八糟的!

另外,有個地方你必須要先有概念,那就是『預設權限』的地方。我們可以利用 -m 來強制給予一個新的目錄相關的權限, 例如上表當中,我們給予 -m 711 來給予新的目錄 drwx--x--x 的權限。


  • rmdir (刪除『空』的目錄)
[root@study ~]# rmdir [-p] 目錄名稱選項與參數:-p :連同『上層』『空的』目錄也一起刪除範例:將於mkdir範例中建立的目錄(/tmp底下)刪除掉![root@study tmp]# ls -ld test*   <==看看有多少目錄存在?drwxr-xr-x. 2 root   root  6 Jun  4 19:03 testdrwxr-xr-x. 3 root   root 18 Jun  4 19:04 test1drwx--x--x. 2 root   root  6 Jun  4 19:05 test2[root@study tmp]# rmdir test   <==可直接刪除掉,沒問題[root@study tmp]# rmdir test1  <==因為尚有內容,所以無法刪除!rmdir: failed to remove ‘test1’: Directory not empty[root@study tmp]# rmdir -p test1/test2/test3/test4[root@study tmp]# ls -ld test*    <==您看看,底下的輸出中test與test1不見了!drwx--x--x. 2 root   root  6 Jun  4 19:05 test2# 瞧!利用 -p 這個選項,立刻就可以將 test1/test2/test3/test4 一次刪除~# 不過要注意的是,這個 rmdir 僅能『刪除空的目錄』喔!

如果想要刪除舊有的目錄時,就使用rmdir吧!例如將剛剛建立的test殺掉,使用『 rmdir test 』即可!請注意呦!目錄需要一層一層的刪除才行!而且被刪除的目錄裡面必定不能存在其他的目錄或檔案! 這也是所謂的空的目錄(empty directory)的意思啊!那如果要將所有目錄下的東西都殺掉呢?! 這個時候就必須使用『 rm -r test 』囉!不過,還是使用 rmdir 比較不危險!你也可以嘗試以 -p 的選項加入,來刪除上層的目錄喔!


三:

檔案與目錄的檢視: ls

[root@study ~]# ls [-aAdfFhilnrRSt] 檔名或目錄名稱..[root@study ~]# ls [--color={never,auto,always}] 檔名或目錄名稱..[root@study ~]# ls [--full-time] 檔名或目錄名稱..選項與參數:-a  :全部的檔案,連同隱藏檔( 開頭為 . 的檔案) 一起列出來(常用)-A  :全部的檔案,連同隱藏檔,但不包括 . 與 .. 這兩個目錄-d  :僅列出目錄本身,而不是列出目錄內的檔案資料(常用)-f  :直接列出結果,而不進行排序 (ls 預設會以檔名排序!)-F  :根據檔案、目錄等資訊,給予附加資料結構,例如:      *:代表可執行檔; /:代表目錄; =:代表 socket 檔案; |:代表 FIFO 檔案;-h  :將檔案容量以人類較易讀的方式(例如 GB, KB 等等)列出來;-i  :列出 inode 號碼,inode 的意義下一章將會介紹;-l  :長資料串列出,包含檔案的屬性與權限等等資料;(常用)-n  :列出 UID 與 GID 而非使用者與群組的名稱 (UID與GID會在帳號管理提到!)-r  :將排序結果反向輸出,例如:原本檔名由小到大,反向則為由大到小;-R  :連同子目錄內容一起列出來,等於該目錄下的所有檔案都會顯示出來;-S  :以檔案容量大小排序,而不是用檔名排序;-t  :依時間排序,而不是用檔名。--color=never  :不要依據檔案特性給予顏色顯示;--color=always :顯示顏色--color=auto   :讓系統自行依據設定來判斷是否給予顏色--full-time    :以完整時間模式 (包含年、月、日、時、分) 輸出--time={atime,ctime} :輸出 access 時間或改變權限屬性時間 (ctime)                        而非內容變更時間 (modification time)

  • rm (移除檔案或目錄)
[root@study ~]# rm [-fir] 檔案或目錄選項與參數:-f  :就是 force 的意思,忽略不存在的檔案,不會出現警告訊息;-i  :互動模式,在刪除前會詢問使用者是否動作-r  :遞迴刪除啊!最常用在目錄的刪除了!這是非常危險的選項!!!範例一:將剛剛在 cp 的範例中建立的 bashrc 刪除掉![root@study ~]# cd /tmp[root@study tmp]# rm -i bashrcrm: remove regular file `bashrc'? y# 如果加上 -i 的選項就會主動詢問喔,避免你刪除到錯誤的檔名!範例二:透過萬用字元*的幫忙,將/tmp底下開頭為bashrc的檔名通通刪除:[root@study tmp]# rm -i bashrc*# 注意那個星號,代表的是 0 到無窮多個任意字元喔!很好用的東西!範例三:將 cp 範例中所建立的 /tmp/etc/ 這個目錄刪除掉![root@study tmp]# rmdir /tmp/etcrmdir: failed to remove '/tmp/etc': Directory not empty   <== 刪不掉啊!因為這不是空的目錄![root@study tmp]# rm -r /tmp/etcrm: descend into directory `/tmp/etc'? yrm: remove regular file `/tmp/etc/fstab'? yrm: remove regular empty file `/tmp/etc/crypttab'? ^C  <== 按下 [ctrl]+c 中斷.....(中間省略).....# 因為身份是 root ,預設已經加入了 -i 的選項,所以你要一直按 y 才會刪除!# 如果不想要繼續按 y ,可以按下『 [ctrl]-c 』來結束 rm 的工作。# 這是一種保護的動作,如果確定要刪除掉此目錄而不要詢問,可以這樣做:[root@study tmp]# \rm -r /tmp/etc# 在指令前加上反斜線,可以忽略掉 alias 的指定選項喔!至於 alias 我們在bash再談!# 拜託!這個範例很可怕!你不要刪錯了!刪除 /etc 系統是會掛掉的!範例四:刪除一個帶有 - 開頭的檔案[root@study tmp]# touch ./-aaa-  <==touch這個指令可以建立空檔案![root@study tmp]# ls -l -rw-r--r--. 1 root   root       0 Jun 11 19:22 -aaa-  <==檔案大小為0,所以是空檔案[root@study tmp]# rm -aaa-rm: invalid option -- 'a'                    <== 因為 "-" 是選項嘛!所以系統誤判了!Try 'rm ./-aaa-' to remove the file `-aaa-'. <== 新的 bash 有給建議的Try 'rm --help' for more information.[root@study tmp]# rm ./-aaa-

這是移除的指令(remove),要注意的是,通常在Linux系統下,為了怕檔案被 root 誤殺,所以很多 distributions 都已經預設加入 -i 這個選項了!而如果要連目錄下的東西都一起殺掉的話, 例如子目錄裡面還有子目錄時,那就要使用 -r 這個選項了!不過,使用『 rm -r 』這個指令之前,請千萬注意了,因為該目錄或檔案『肯定』會被 root 殺掉!因為系統不會再次詢問你是否要砍掉呦!所以那是個超級嚴重的指令下達呦! 得特別注意!不過,如果你確定該目錄不要了,那麼使用 rm -r 來循環殺掉是不錯的方式!

另外,範例四也是很有趣的例子,我們在之前就談過,檔名最好不要使用 "-" 號開頭, 因為 "-" 後面接的是選項,因此,單純的使用『 rm -aaa- 』系統的指令就會誤判啦! 那如果使用後面會談到的正規表示法時,還是會出問題的!所以,只能用避過首位字元是 "-" 的方法啦! 就是加上本目錄『 ./ 』即可!如果 man rm 的話,其實還有一種方法,那就是『 rm -- -aaa- 』也可以啊!


  • mv (移動檔案與目錄,或更名)
[root@study ~]# mv [-fiu] source destination[root@study ~]# mv [options] source1 source2 source3 .... directory選項與參數:-f  :force 強制的意思,如果目標檔案已經存在,不會詢問而直接覆蓋;-i  :若目標檔案 (destination) 已經存在時,就會詢問是否覆蓋!-u  :若目標檔案已經存在,且 source 比較新,才會更新 (update)範例一:複製一檔案,建立一目錄,將檔案移動到目錄中[root@study ~]# cd /tmp[root@study tmp]# cp ~/.bashrc bashrc[root@study tmp]# mkdir mvtest[root@study tmp]# mv bashrc mvtest# 將某個檔案移動到某個目錄去,就是這樣做!範例二:將剛剛的目錄名稱更名為 mvtest2[root@study tmp]# mv mvtest mvtest2 <== 這樣就更名了!簡單~# 其實在 Linux 底下還有個有趣的指令,名稱為 rename ,# 該指令專職進行多個檔名的同時更名,並非針對單一檔名變更,與mv不同。請man rename。範例三:再建立兩個檔案,再全部移動到 /tmp/mvtest2 當中[root@study tmp]# cp ~/.bashrc bashrc1[root@study tmp]# cp ~/.bashrc bashrc2[root@study tmp]# mv bashrc1 bashrc2 mvtest2# 注意到這邊,如果有多個來源檔案或目錄,則最後一個目標檔一定是『目錄!』# 意思是說,將所有的資料移動到該目錄的意思!

這是搬移 (move) 的意思!當你要移動檔案或目錄的時後,呵呵!這個指令就很重要啦! 同樣的,你也可以使用 -u ( update )來測試新舊檔案,看看是否需要搬移囉! 另外一個用途就是『變更檔名!』,我們可以很輕易的使用 mv 來變更一個檔案的檔名呢!不過,在 Linux 才有的指令當中,有個 rename , 可以用來更改大量檔案的檔名,你可以利用 man rename 來查閱一下,也是挺有趣的指令喔!


四:

檔案內容查閱

如果我們要查閱一個檔案的內容時,該如何是好呢?這裡有相當多有趣的指令可以來分享一下: 最常使用的顯示檔案內容的指令可以說是 cat 與 more 及 less 了!此外,如果我們要查看一個很大型的檔案 (好幾百MB時),但是我們只需要後端的幾行字而已,那麼該如何是好?呵呵!用 tail 呀,此外, tac 這個指令也可以達到這個目的喔!好了,說說各個指令的用途吧!

  • cat  由第一行開始顯示檔案內容
  • tac  從最後一行開始顯示,可以看出 tac 是 cat 的倒著寫!
  • nl   顯示的時候,順道輸出行號!
  • more 一頁一頁的顯示檔案內容
  • less 與 more 類似,但是比 more 更好的是,他可以往前翻頁!
  • head 只看頭幾行
  • tail 只看尾巴幾行
  • od   以二進位的方式讀取檔案內容!

  • cat (concatenate)
[root@study ~]# cat [-AbEnTv]選項與參數:-A  :相當於 -vET 的整合選項,可列出一些特殊字符而不是空白而已;-b  :列出行號,僅針對非空白行做行號顯示,空白行不標行號!-E  :將結尾的斷行字元 $ 顯示出來;-n  :列印出行號,連同空白行也會有行號,與 -b 的選項不同;-T  :將 [tab] 按鍵以 ^I 顯示出來;-v  :列出一些看不出來的特殊字符範例一:檢閱 /etc/issue 這個檔案的內容[root@study ~]# cat /etc/issue\SKernel \r on an \m範例二:承上題,如果還要加印行號呢?[root@study ~]# cat -n /etc/issue     1  \S     2  Kernel \r on an \m     3# 所以這個檔案有三行!看到了吧!可以印出行號呢!這對於大檔案要找某個特定的行時,有點用處!# 如果不想要編排空白行的行號,可以使用『cat -b /etc/issue』,自己測試看看:範例三:將 /etc/man_db.conf 的內容完整的顯示出來(包含特殊字元)[root@study ~]# cat -A /etc/man_db.conf# $....(中間省略)....MANPATH_MAP^I/bin^I^I^I/usr/share/man$MANPATH_MAP^I/usr/bin^I^I/usr/share/man$MANPATH_MAP^I/sbin^I^I^I/usr/share/man$MANPATH_MAP^I/usr/sbin^I^I/usr/share/man$.....(底下省略).....# 上面的結果限於篇幅,鳥哥刪除掉很多資料了。另外,輸出的結果並不會有特殊字體,# 鳥哥上面的特殊字體是要讓您發現差異點在哪裡就是了。基本上,在一般的環境中,# 使用 [tab] 與空白鍵的效果差不多,都是一堆空白啊!我們無法知道兩者的差別。# 此時使用 cat -A 就能夠發現那些空白的地方是啥鬼東西了![tab]會以 ^I 表示,# 斷行字元則是以 $ 表示,所以你可以發現每一行後面都是 $ 啊!不過斷行字元# 在Windows/Linux則不太相同,Windows的斷行字元是 ^M$ 囉。# 這部分我們會在第九章 vim 軟體的介紹時,再次的說明到喔!

嘿嘿!Linux 裡面有『貓』指令?喔!不是的, cat 是 Concatenate (連續) 的簡寫, 主要的功能是將一個檔案的內容連續的印出在螢幕上面!例如上面的例子中,我們將 /etc/issue 印出來!如果加上 -n 或 -b 的話,則每一行前面還會加上行號呦!

鳥哥個人是比較少用 cat 啦!畢竟當你的檔案內容的行數超過 40 行以上,嘿嘿!根本來不及在螢幕上看到結果! 所以,配合等一下要介紹的 more 或者是 less 來執行比較好!此外,如果是一般的 DOS 檔案時,就需要特別留意一些奇奇怪怪的符號了, 例如斷行與 [tab] 等,要顯示出來,就得加入 -A 之類的選項了!



  • nl (添加行號列印)
[root@study ~]# nl [-bnw] 檔案選項與參數:-b  :指定行號指定的方式,主要有兩種:      -b a :表示不論是否為空行,也同樣列出行號(類似 cat -n);      -b t :如果有空行,空的那一行不要列出行號(預設值);-n  :列出行號表示的方法,主要有三種:      -n ln :行號在螢幕的最左方顯示;      -n rn :行號在自己欄位的最右方顯示,且不加 0 ;      -n rz :行號在自己欄位的最右方顯示,且加 0 ;-w  :行號欄位的佔用的字元數。範例一:用 nl 列出 /etc/issue 的內容[root@study ~]# nl /etc/issue     1  \S     2  Kernel \r on an \m# 注意看,這個檔案其實有三行,第三行為空白(沒有任何字元),# 因為他是空白行,所以 nl 不會加上行號喔!如果確定要加上行號,可以這樣做:[root@study ~]# nl -b a /etc/issue     1  \S     2  Kernel \r on an \m     3# 呵呵!行號加上來囉~那麼如果要讓行號前面自動補上 0 呢?可這樣[root@study ~]# nl -b a -n rz /etc/issue000001  \S000002  Kernel \r on an \m000003# 嘿嘿!自動在自己欄位的地方補上 0 了~預設欄位是六位數,如果想要改成 3 位數?[root@study ~]# nl -b a -n rz -w 3 /etc/issue001     \S002     Kernel \r on an \m003# 變成僅有 3 位數囉~

nl 可以將輸出的檔案內容自動的加上行號!其預設的結果與 cat -n 有點不太一樣, nl 可以將行號做比較多的顯示設計,包括位數與是否自動補齊 0 等等的功能呢。


五:

檔案預設權限:umask

OK!那麼現在我們知道如何建立或者是改變一個目錄或檔案的屬性了,不過, 你知道當你建立一個新的檔案或目錄時,他的預設權限會是什麼嗎?呵呵!那就與 umask 這個玩意兒有關了!那麼 umask 是在搞什麼呢?基本上, umask 就是指定 『目前使用者在建立檔案或目錄時候的權限預設值』, 那麼如何得知或設定 umask 呢?他的指定條件以底下的方式來指定:

[root@study ~]# umask0022             <==與一般權限有關的是後面三個數字![root@study ~]# umask -Su=rwx,g=rx,o=rx

查閱的方式有兩種,一種可以直接輸入 umask ,就可以看到數字型態的權限設定分數, 一種則是加入 -S (Symbolic) 這個選項,就會以符號類型的方式來顯示出權限了! 奇怪的是,怎麼 umask 會有四組數字啊?不是只有三組嗎?是沒錯啦。 第一組是特殊權限用的,我們先不要理他,所以先看後面三組即可。

在預設權限的屬性上,目錄與檔案是不一樣的。從第五章我們知道 x 權限對於目錄是非常重要的! 但是一般檔案的建立則不應該有執行的權限,因為一般檔案通常是用在於資料的記錄嘛!當然不需要執行的權限了。 因此,預設的情況如下:

  • 若使用者建立為『檔案』則預設『沒有可執行( x )權限』,亦即只有 rw 這兩個項目,也就是最大為 666 分,預設權限如下:
    -rw-rw-rw-

  • 若使用者建立為『目錄』,則由於 x 與是否可以進入此目錄有關,因此預設為所有權限均開放,亦即為 777 分,預設權限如下:
    drwxrwxrwx

要注意的是,umask 的分數指的是『該預設值需要減掉的權限!』因為 r、w、x 分別是 4、2、1 分,所以囉!也就是說,當要拿掉能寫的權限,就是輸入 2 分,而如果要拿掉能讀的權限,也就是 4 分,那麼要拿掉讀與寫的權限,也就是 6 分,而要拿掉執行與寫入的權限,也就是 3 分,這樣瞭解嗎?請問你, 5 分是什麼?呵呵! 就是讀與執行的權限啦!

如果以上面的例子來說明的話,因為 umask 為 022 ,所以 user 並沒有被拿掉任何權限,不過 group 與 others 的權限被拿掉了 2 (也就是 w 這個權限),那麼當使用者:

  • 建立檔案時:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
  • 建立目錄時:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
不相信嗎?我們就來測試看看吧!
[root@study ~]# umask0022[root@study ~]# touch test1[root@study ~]# mkdir test2[root@study ~]# ll -d test*-rw-r--r--. 1 root root 0  6月 16 01:11 test1drwxr-xr-x. 2 root root 6  6月 16 01:11 test2

呵呵!瞧見了吧!確定新建檔案的權限是沒有錯的。


  • chattr (設定檔案隱藏屬性)
[root@study ~]# chattr [+-=][ASacdistu] 檔案或目錄名稱選項與參數:+   :增加某一個特殊參數,其他原本存在參數則不動。-   :移除某一個特殊參數,其他原本存在參數則不動。=   :設定一定,且僅有後面接的參數A  :當設定了 A 這個屬性時,若你有存取此檔案(或目錄)時,他的存取時間 atime 將不會被修改,     可避免 I/O 較慢的機器過度的存取磁碟。(目前建議使用檔案系統掛載參數處理這個項目)S  :一般檔案是非同步寫入磁碟的(原理請參考前一章sync的說明),如果加上 S 這個屬性時,     當你進行任何檔案的修改,該更動會『同步』寫入磁碟中。a  :當設定 a 之後,這個檔案將只能增加資料,而不能刪除也不能修改資料,只有root 才能設定這屬性c  :這個屬性設定之後,將會自動的將此檔案『壓縮』,在讀取的時候將會自動解壓縮,     但是在儲存的時候,將會先進行壓縮後再儲存(看來對於大檔案似乎蠻有用的!)d  :當 dump 程序被執行的時候,設定 d 屬性將可使該檔案(或目錄)不會被 dump 備份i  :這個 i 可就很厲害了!他可以讓一個檔案『不能被刪除、改名、設定連結也無法寫入或新增資料!』     對於系統安全性有相當大的助益!只有 root 能設定此屬性s  :當檔案設定了 s 屬性時,如果這個檔案被刪除,他將會被完全的移除出這個硬碟空間,     所以如果誤刪了,完全無法救回來了喔!u  :與 s 相反的,當使用 u 來設定檔案時,如果該檔案被刪除了,則資料內容其實還存在磁碟中,     可以使用來救援該檔案喔!注意1:屬性設定常見的是 a 與 i 的設定值,而且很多設定值必須要身為 root 才能設定注意2:xfs 檔案系統僅支援 AadiS 而已範例:請嘗試到/tmp底下建立檔案,並加入 i 的參數,嘗試刪除看看。[root@study ~]# cd /tmp[root@study tmp]# touch attrtest     <==建立一個空檔案[root@study tmp]# chattr +i attrtest <==給予 i 的屬性[root@study tmp]# rm attrtest        <==嘗試刪除看看rm: remove regular empty file `attrtest'? yrm: cannot remove `attrtest': Operation not permitted# 看到了嗎?呼呼!連 root 也沒有辦法將這個檔案刪除呢!趕緊解除設定!範例:請將該檔案的 i 屬性取消![root@study tmp]# chattr -i attrtest

這個指令是很重要的,尤其是在系統的資料安全上面!由於這些屬性是隱藏的性質,所以需要以 lsattr 才能看到該屬性呦!其中,個人認為最重要的當屬 +i 與 +a 這個屬性了。+i 可以讓一個檔案無法被更動,對於需要強烈的系統安全的人來說, 真是相當的重要的!裡頭還有相當多的屬性是需要 root 才能設定的呢!


觀察檔案類型:file

如果你想要知道某個檔案的基本資料,例如是屬於 ASCII 或者是 data 檔案,或者是 binary , 且其中有沒有使用到動態函式庫 (share library) 等等的資訊,就可以利用 file 這個指令來檢閱喔!舉例來說:

[root@study ~]# file ~/.bashrc/root/.bashrc: ASCII text  <==告訴我們是 ASCII 的純文字檔啊![root@study ~]# file /usr/bin/passwd/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xbf35571e607e317bf107b9bcf65199988d0ed5ab, stripped# 執行檔的資料可就多的不得了!包括這個檔案的 suid 權限、相容於 Intel x86-64 等級的硬體平台# 使用的是 Linux 核心 2.6.32 的動態函式庫連結等等。[root@study ~]# file /var/lib/mlocate/mlocate.db/var/lib/mlocate/mlocate.db: data  <== 這是 data 檔案!

透過這個指令,我們可以簡單的先判斷這個檔案的格式為何喔!包括未來你也可以用來判斷使用 tar 包裹時,該 tarball 檔案是使用哪一種壓縮功能哩!


六:

檔案檔名的搜尋

再來談一談怎麼搜尋檔案吧!在 Linux 底下也有相當優異的搜尋指令呦!通常 find 不很常用的!因為速度慢之外, 也很操硬碟!一般我們都是先使用 whereis 或者是 locate 來檢查,如果真的找不到了,才以 find 來搜尋呦! 為什麼呢?因為 whereis 只找系統中某些特定目錄底下的檔案而已,locate 則是利用資料庫來搜尋檔名,當然兩者就相當的快速, 並且沒有實際的搜尋硬碟內的檔案系統狀態,比較省時間啦!

  • whereis (由一些特定的目錄中尋找檔案檔名)
[root@study ~]# whereis [-bmsu] 檔案或目錄名選項與參數:-l    :可以列出 whereis 會去查詢的幾個主要目錄而已-b    :只找 binary 格式的檔案-m    :只找在說明檔 manual 路徑下的檔案-s    :只找 source 來源檔案-u    :搜尋不在上述三個項目當中的其他特殊檔案範例一:請找出 ifconfig 這個檔名[root@study ~]# whereis ifconfig ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz範例二:只找出跟 passwd 有關的『說明文件』檔名(man page)[root@study ~]# whereis passwd     # 全部的檔名通通列出來!passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz[root@study ~]# whereis -m passwd  # 只有在 man 裡面的檔名才抓出來!passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

等一下我們會提到 find 這個搜尋指令, find 是很強大的搜尋指令,但時間花用的很大!(因為 find 是直接搜尋硬碟,為如果你的硬碟比較老舊的話,嘿嘿!有的等!) 這個時候 whereis 就相當的好用了!另外, whereis 可以加入選項來找尋相關的資料,例如,如果你是要找可執行檔 (binary) 那麼加上 -b 就可以啦! 如果不加任何選項的話,那麼就將所有的資料列出來囉!

那麼 whereis 到底是使用什麼咚咚呢?為何搜尋的速度會比 find 快這麼多? 其實那也沒有什麼,只是因為 whereis 只找幾個特定的目錄而已~並沒有全系統去查詢之故。所以說,whereis 主要是針對 /bin /sbin 底下的執行檔, 以及 /usr/share/man 底下的 man page 檔案,跟幾個比較特定的目錄來處理而已。所以速度當然快的多!不過,就有某些檔案是你找不到的啦! 想要知道 whereis 到底查了多少目錄?可以使用 whereis -l 來確認一下即可!

  • locate / updatedb
[root@study ~]# locate [-ir] keyword選項與參數:-i  :忽略大小寫的差異;-c  :不輸出檔名,僅計算找到的檔案數量-l  :僅輸出幾行的意思,例如輸出五行則是 -l 5-S  :輸出 locate 所使用的資料庫檔案的相關資訊,包括該資料庫紀錄的檔案/目錄數量等-r  :後面可接正規表示法的顯示方式範例一:找出系統中所有與 passwd 相關的檔名,且只列出 5 個[root@study ~]# locate -l 5 passwd/etc/passwd/etc/passwd-/etc/pam.d/passwd/etc/security/opasswd/usr/bin/gpasswd範例二:列出 locate 查詢所使用的資料庫檔案之檔名與各資料數量[root@study ~]# locate -SDatabase /var/lib/mlocate/mlocate.db:        8,086 directories     # 總紀錄目錄數        109,605 files         # 總紀錄檔案數        5,190,295 bytes in file names        2,349,150 bytes used to store database

這個 locate 的使用更簡單,直接在後面輸入『檔案的部分名稱』後,就能夠得到結果。 舉上面的例子來說,我輸入 locate passwd ,那麼在完整檔名 (包含路徑名稱) 當中,只要有 passwd 在其中, 就會被顯示出來的!這也是個很方便好用的指令,如果你忘記某個檔案的完整檔名時~~

但是,這個東西還是有使用上的限制呦!為什麼呢?你會發現使用 locate 來尋找資料的時候特別的快, 這是因為 locate 尋找的資料是由『已建立的資料庫 /var/lib/mlocate/』 裡面的資料所搜尋到的,所以不用直接在去硬碟當中存取資料,呵呵!當然是很快速囉!

那麼有什麼限制呢?就是因為他是經由資料庫來搜尋的,而資料庫的建立預設是在每天執行一次 (每個 distribution 都不同,CentOS 7.x 是每天更新資料庫一次!),所以當你新建立起來的檔案, 卻還在資料庫更新之前搜尋該檔案,那麼 locate 會告訴你『找不到!』呵呵!因為必須要更新資料庫呀!

那能否手動更新資料庫哪?當然可以啊!更新 locate 資料庫的方法非常簡單,直接輸入『 updatedb 』就可以了! updatedb 指令會去讀取 /etc/updatedb.conf 這個設定檔的設定,然後再去硬碟裡面進行搜尋檔名的動作, 最後就更新整個資料庫檔案囉!因為 updatedb 會去搜尋硬碟,所以當你執行 updatedb 時,可能會等待數分鐘的時間喔!

  • updatedb:根據 /etc/updatedb.conf 的設定去搜尋系統硬碟內的檔名,並更新 /var/lib/mlocate 內的資料庫檔案;
  • locate:依據 /var/lib/mlocate 內的資料庫記載,找出使用者輸入的關鍵字檔名。
  • find
[root@study ~]# find [PATH] [option] [action]選項與參數:1. 與時間有關的選項:共有 -atime, -ctime 與 -mtime ,以 -mtime 說明   -mtime  n :n 為數字,意義為在 n 天之前的『一天之內』被更動過內容的檔案;   -mtime +n :列出在 n 天之前(不含 n 天本身)被更動過內容的檔案檔名;   -mtime -n :列出在 n 天之內(含 n 天本身)被更動過內容的檔案檔名。   -newer file :file 為一個存在的檔案,列出比 file 還要新的檔案檔名範例一:將過去系統上面 24 小時內有更動過內容 (mtime) 的檔案列出[root@study ~]# find / -mtime 0# 那個 0 是重點!0 代表目前的時間,所以,從現在開始到 24 小時前,# 有變動過內容的檔案都會被列出來!那如果是三天前的 24 小時內?# find / -mtime 3 有變動過的檔案都被列出的意思!範例二:尋找 /etc 底下的檔案,如果檔案日期比 /etc/passwd 新就列出[root@study ~]# find /etc -newer /etc/passwd# -newer 用在分辨兩個檔案之間的新舊關係是很有用的!

時間參數真是挺有意思的!我們現在知道 atime, ctime 與 mtime 的意義,如果你想要找出一天內被更動過的檔案名稱, 可以使用上述範例一的作法。但如果我想要找出『4天內被更動過的檔案檔名』呢?那可以使用『 find /var -mtime -4 』。那如果是『4天前的那一天』就用『 find /var -mtime 4 』。有沒有加上『+, -』差別很大喔!我們可以用簡單的圖示來說明一下:

find 相關的時間參數意義
圖6.5.1、find 相關的時間參數意義

圖中最右邊為目前的時間,越往左邊則代表越早之前的時間軸啦。由圖 6.5.1 我們可以清楚的知道:

  • +4代表大於等於5天前的檔名:ex> find /var -mtime +4
  • -4代表小於等於4天內的檔案檔名:ex> find /var -mtime -4
  • 4則是代表4-5那一天的檔案檔名:ex> find /var -mtime 4

非常有趣吧!你可以在 /var/ 目錄下搜尋一下,感受一下輸出檔案的差異喔!再來看看其他 find 的用法吧!

選項與參數:2. 與使用者或群組名稱有關的參數:   -uid n :n 為數字,這個數字是使用者的帳號 ID,亦即 UID ,這個 UID 是記錄在            /etc/passwd 裡面與帳號名稱對應的數字。這方面我們會在第四篇介紹。   -gid n :n 為數字,這個數字是群組名稱的 ID,亦即 GID,這個 GID 記錄在            /etc/group,相關的介紹我們會第四篇說明~   -user name :name 為使用者帳號名稱喔!例如 dmtsai    -group name:name 為群組名稱喔,例如 users ;   -nouser    :尋找檔案的擁有者不存在 /etc/passwd 的人!   -nogroup   :尋找檔案的擁有群組不存在於 /etc/group 的檔案!                當你自行安裝軟體時,很可能該軟體的屬性當中並沒有檔案擁有者,                這是可能的!在這個時候,就可以使用 -nouser 與 -nogroup 搜尋。範例三:搜尋 /home 底下屬於 dmtsai 的檔案[root@study ~]# find /home -user dmtsai# 這個東西也很有用的~當我們要找出任何一個使用者在系統當中的所有檔案時,# 就可以利用這個指令將屬於某個使用者的所有檔案都找出來喔!範例四:搜尋系統中不屬於任何人的檔案[root@study ~]# find / -nouser# 透過這個指令,可以輕易的就找出那些不太正常的檔案。如果有找到不屬於系統任何人的檔案時,# 不要太緊張,那有時候是正常的~尤其是你曾經以原始碼自行編譯軟體時。

如果你想要找出某個使用者在系統底下建立了啥咚咚,使用上述的選項與參數,就能夠找出來啦! 至於那個 -nouser 或 -nogroup 的選項功能中,除了你自行由網路上面下載檔案時會發生之外, 如果你將系統裡面某個帳號刪除了,但是該帳號已經在系統內建立很多檔案時,就可能會發生無主孤魂的檔案存在! 此時你就得使用這個 -nouser 來找出該類型的檔案囉!

選項與參數:3. 與檔案權限及名稱有關的參數:   -name filename:搜尋檔案名稱為 filename 的檔案;   -size [+-]SIZE:搜尋比 SIZE 還要大(+)或小(-)的檔案。這個 SIZE 的規格有:                   c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB                   還要大的檔案,就是『 -size +50k 』   -type TYPE    :搜尋檔案的類型為 TYPE 的,類型主要有:一般正規檔案 (f), 裝置檔案 (b, c),                   目錄 (d), 連結檔 (l), socket (s), 及 FIFO (p) 等屬性。   -perm mode  :搜尋檔案權限『剛好等於』 mode 的檔案,這個 mode 為類似 chmod                 的屬性值,舉例來說, -rwsr-xr-x 的屬性為 4755 !   -perm -mode :搜尋檔案權限『必須要全部囊括 mode 的權限』的檔案,舉例來說,                 我們要搜尋 -rwxr--r-- ,亦即 0744 的檔案,使用 -perm -0744,                 當一個檔案的權限為 -rwsr-xr-x ,亦即 4755 時,也會被列出來,                 因為 -rwsr-xr-x 的屬性已經囊括了 -rwxr--r-- 的屬性了。   -perm /mode :搜尋檔案權限『包含任一 mode 的權限』的檔案,舉例來說,我們搜尋                 -rwxr-xr-x ,亦即 -perm /755 時,但一個檔案屬性為 -rw-------                 也會被列出來,因為他有 -rw.... 的屬性存在!範例五:找出檔名為 passwd 這個檔案[root@study ~]# find / -name passwd範例五-1:找出檔名包含了 passwd 這個關鍵字的檔案[root@study ~]# find / -name "*passwd*"# 利用這個 -name 可以搜尋檔名啊!預設是完整檔名,如果想要找關鍵字,# 可以使用類似 * 的任意字元來處理範例六:找出 /run 目錄下,檔案類型為 Socket 的檔名有哪些?[root@study ~]# find /run -type s# 這個 -type 的屬性也很有幫助喔!尤其是要找出那些怪異的檔案,# 例如 socket 與 FIFO 檔案,可以用 find /run -type p 或 -type s 來找!範例七:搜尋檔案當中含有 SGID 或 SUID 或 SBIT 的屬性[root@study ~]# find / -perm /7000 # 所謂的 7000 就是 ---s--s--t ,那麼只要含有 s 或 t 的就列出,所以當然要使用 /7000,# 使用 -7000 表示要同時含有 ---s--s--t 的所有三個權限。而只需要任意一個,就是 /7000 ~瞭乎?

上述範例中比較有趣的就屬 -perm 這個選項啦!他的重點在找出特殊權限的檔案囉! 我們知道 SUID 與 SGID 都可以設定在二進位程式上,假設我想要找出來 /usr/bin, /usr/sbin 這兩個目錄下, 只要具有 SUID 或 SGID 就列出來該檔案,你可以這樣做:

[root@study ~]# find /usr/bin /usr/sbin -perm /6000

因為 SUID 是 4 分,SGID 2 分,總共為 6 分,因此可用 /6000 來處理這個權限! 至於 find 後面可以接多個目錄來進行搜尋!另外, find 本來就會搜尋次目錄,這個特色也要特別注意喔! 最後,我們再來看一下 find 還有什麼特殊功能吧!

選項與參數:4. 額外可進行的動作:   -exec command :command 為其他指令,-exec 後面可再接額外的指令來處理搜尋到的結果。   -print        :將結果列印到螢幕上,這個動作是預設動作!範例八:將上個範例找到的檔案使用 ls -l 列出來~[root@study ~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;# 注意到,那個 -exec 後面的 ls -l 就是額外的指令,指令不支援命令別名,# 所以僅能使用 ls -l 不可以使用 ll 喔!注意注意!範例九:找出系統中,大於 1MB 的檔案[root@study ~]# find / -size +1M

find 的特殊功能就是能夠進行額外的動作(action)。我們將範例八的例子以圖解來說明如下:

find 相關的額外動作
圖6.5.2、find 相關的額外動作

該範例中特殊的地方有 {} 以及 \; 還有 -exec 這個關鍵字,這些東西的意義為:

  • {} 代表的是『由 find 找到的內容』,如上圖所示,find 的結果會被放置到 {} 位置中;
  • -exec 一直到 \; 是關鍵字,代表 find 額外動作的開始 (-exec) 到結束 (\;) ,在這中間的就是 find 指令內的額外動作。 在本例中就是『 ls -l {} 』囉!
  • 因為『 ; 』在 bash 環境下是有特殊意義的,因此利用反斜線來跳脫。

透過圖 6.5.2 你應該就比較容易瞭解 -exec 到 \; 之間的意義了吧!

如果你要找的檔案是具有特殊屬性的,例如 SUID 、檔案擁有者、檔案大小等等, 那麼利用 locate 是沒有辦法達成你的搜尋的!此時 find 就顯的很重要啦! 另外,find 還可以利用萬用字元來找尋檔名呢!舉例來說,你想要找出 /etc 底下檔名包含 httpd 的檔案, 那麼你就可以這樣做:

[root@study ~]# find /etc -name '*httpd*'

不但可以指定搜尋的目錄(連同次目錄),並且可以利用額外的選項與參數來找到最正確的檔名!真是好好用! 不過由於 find 在尋找資料的時後相當的操硬碟!所以沒事情不要使用 find 啦!有更棒的指令可以取代呦!那就是上面提到的 whereis 與 locate 囉!


七:小结

極重要的複習!權限與指令間的關係

我們知道權限對於使用者帳號來說是非常重要的,因為他可以限制使用者能不能讀取/建立/刪除/修改檔案或目錄! 在這一章我們介紹了很多檔案系統的管理指令,第五章則介紹了很多檔案權限的意義。在這個小節當中, 我們就將這兩者結合起來,說明一下什麼指令在什麼樣的權限下才能夠運作吧!^_^

一、讓使用者能進入某目錄成為『可工作目錄』的基本權限為何:

  • 可使用的指令:例如 cd 等變換工作目錄的指令;
  • 目錄所需權限:使用者對這個目錄至少需要具有 x 的權限
  • 額外需求:如果使用者想要在這個目錄內利用 ls 查閱檔名,則使用者對此目錄還需要 r 的權限。

二、使用者在某個目錄內讀取一個檔案的基本權限為何?

  • 可使用的指令:例如本章談到的 cat, more, less等等
  • 目錄所需權限:使用者對這個目錄至少需要具有 x 權限;
  • 檔案所需權限:使用者對檔案至少需要具有 r 的權限才行!

三、讓使用者可以修改一個檔案的基本權限為何?

  • 可使用的指令:例如 nano 或未來要介紹的 vi 編輯器等;
  • 目錄所需權限:使用者在該檔案所在的目錄至少要有 x 權限;
  • 檔案所需權限:使用者對該檔案至少要有 r, w 權限

四、讓一個使用者可以建立一個檔案的基本權限為何?

  • 目錄所需權限:使用者在該目錄要具有 w,x 的權限,重點在 w 啦!

五、讓使用者進入某目錄並執行該目錄下的某個指令之基本權限為何?

  • 目錄所需權限:使用者在該目錄至少要有 x 的權限;
  • 檔案所需權限:使用者在該檔案至少需要有 x 的權限
例題:
讓一個使用者 dmtsai 能夠進行『cp /dir1/file1 /dir2』的指令時,請說明 dir1, file1, dir2 的最小所需權限為何?
答:
執行 cp 時, dmtsai 要『能夠讀取來源檔,並且寫入目標檔!』所以應參考上述第二點與第四點的說明! 因此各檔案/目錄的最小權限應該是:
  • dir1 :至少需要有 x 權限;
  • file1:至少需要有 r 權限;
  • dir2 :至少需要有 w, x 權限。

例題:
有一個檔案全名為 /home/student/www/index.html ,各相關檔案/目錄的權限如下:
drwxr-xr-x 23 root    root    4096 Sep 22 12:09 /drwxr-xr-x  6 root    root    4096 Sep 29 02:21 /homedrwx------  6 student student 4096 Sep 29 02:23 /home/studentdrwxr-xr-x  6 student student 4096 Sep 29 02:24 /home/student/www-rwxr--r--  6 student student  369 Sep 29 02:27 /home/student/www/index.html
請問 vbird 這個帳號(不屬於student群組)能否讀取 index.html 這個檔案呢?
答:
雖然 www 與 index.html 是可以讓 vbird 讀取的權限,但是因為目錄結構是由根目錄一層一層讀取的, 因此 vbird 可進入 /home 但是卻不可進入 /home/student/ ,既然連進入 /home/student 都不許了, 當然就讀不到 index.html 了!所以答案是『vbird不會讀取到 index.html 的內容』喔!

那要如何修改權限呢?其實只要將 /home/student 的權限修改為最小 711 ,或者直接給予 755 就可以囉! 這可是很重要的概念喔!

6.7 重點回顧

  • 絕對路徑:『一定由根目錄 / 寫起』;相對路徑:『不由 / 寫起,而是由相對當前目錄寫起』
  • 特殊目錄有:., .., -, ~, ~account需要注意;
  • 與目錄相關的指令有:cd, mkdir, rmdir, pwd 等重要指令;
  • rmdir 僅能刪除空目錄,要刪除非空目錄需使用『 rm -r 』指令;
  • 使用者能使用的指令是依據 PATH 變數所規定的目錄去搜尋的;
  • ls 可以檢視檔案的屬性,尤其 -d, -a, -l 等選項特別重要!
  • 檔案的複製、刪除、移動可以分別使用:cp, rm , mv等指令來操作;
  • 檢查檔案的內容(讀檔)可使用的指令包括有:cat, tac, nl, more, less, head, tail, od 等
  • cat -n 與 nl 均可顯示行號,但預設的情況下,空白行會不會編號並不相同;
  • touch 的目的在修改檔案的時間參數,但亦可用來建立空檔案;
  • 一個檔案記錄的時間參數有三種,分別是 access time(atime), status time (ctime), modification time(mtime),ls 預設顯示的是 mtime。
  • 除了傳統的rwx權限之外,在Ext2/Ext3/Ext4/xfs檔案系統中,還可以使用chattr與lsattr設定及觀察隱藏屬性。 常見的包括只能新增資料的 +a 與完全不能更動檔案的 +i 屬性。
  • 新建檔案/目錄時,新檔案的預設權限使用 umask 來規範。預設目錄完全權限為drwxrwxrwx, 檔案則為-rw-rw-rw-。
  • 檔案具有SUID的特殊權限時,代表當使用者執行此一binary程式時,在執行過程中使用者會暫時具有程式擁有者的權限
  • 目錄具有SGID的特殊權限時,代表使用者在這個目錄底下新建的檔案之群組都會與該目錄的群組名稱相同。
  • 目錄具有SBIT的特殊權限時,代表在該目錄下使用者建立的檔案只有自己與root能夠刪除!
  • 觀察檔案的類型可以使用 file 指令來觀察;
  • 搜尋指令的完整檔名可用 which 或 type ,這兩個指令都是透過 PATH 變數來搜尋檔名;
  • 搜尋檔案的完整檔名可以使用 whereis 找特定目錄或 locate 到資料庫去搜尋,而不實際搜尋檔案系統;
  • 利用 find 可以加入許多選項來直接查詢檔案系統,以獲得自己想要知道的檔名。


0 0