鳥哥linux私房菜 基礎篇 筆記3

絕對路徑與相對路徑:

  • 絕對路徑:路徑的寫法『一定由根目錄 / 寫起』,例如: /usr/share/doc 這個目錄。
  • 相對路徑:路徑的寫法『不是由 / 寫起』,例如由 /usr/share/doc 要到 /usr/share/man 底下時,可以寫成: 『cd ../man』這就是相對路徑的寫法啦!
常用的目錄『符號』代表的意義:  
.     代表此層目錄 
..    代表上層目錄 
~     代表自己的家目錄 
~user 代表到 user 這個人的家目錄
  

目錄與路徑的幾個常用的指令:
    • cd     變換目錄
    • pwd    顯示目前的目錄
    • mkdir 建立一個新目錄
    • rmdir 刪除一個裏面是空的空目錄

  • mkdir
    語法
    [root @test /root ]# mkdir [-mp] [目錄名稱] 
    參數說明: 
    -m :設定檔案的權限喔!直接設定,不需要看 umask 這個內容的臉色! 
    -p :幫助你直接將上面的目錄遞歸建立起來! 
    範例: 
    [root @test /root]# cd tmp 
    [root @test /tmp]# mkdir test<==建立名稱爲 test 的目錄 
    [root @test /tmp]# mkdir -p test1/test2/test3/test4 <==直接建立 test2...等上層目錄 
    [root @test /tmp]# mkdir -m 711 testqq  <==建立權限爲 711 的目錄! 
    [root @test /tmp]# ll test* 
    drwxrwxr-x    2 test    test        4096 Feb  6 20:47 test/ 
    drwxrwxr-x    3 test    test        4096 Feb  6 20:48 test1/ 
    drwx--x--x    2 test    test        4096 Feb  6 20:48 testqq/

  • rmdir
    語法
    [root @test /root ]# rmdir [-p] [目錄名稱] 
    參數說明: 
    -p :將上層的目錄也刪除吧! 
    範例: 
    [root @test /root]# rmdir test<==刪除名稱爲 test 的目錄 
    [root @test tmp]# ll 
    drwxrwxr-x    3 test    test        4096 Feb  6 20:48 test1/ 
    [root @test tmp]# rmdir test1 
    rmdir: `test1': Directory not empty 
    [root @test tmp]# rmdir -p test1/test2/test3/test4 
    [root @test tmp]$ ll
    說明 
    如果想要建立刪除舊有的目錄時,就使用 rmdir 吧!例如將剛剛建立的 test 殺掉,使用 rmdir test 即可!請注意呦!目錄需要一層一層的刪除纔行!而且被刪除的目錄裏面必定不能還有其它的目錄或檔案!那如果要將所有目錄下的東西都殺掉呢?!這個時候就必須使用 rm -rf test 囉!不過,還是使用 rmdir 比較不危險!不過,你也可以嘗試以 -p 的參數加入,來刪除上層的目錄喔! 

  • 環境變量 PATH
  • 下達 echo $PATH , echo 有『顯示、印出』的意思,而 PATH 前面加的 $ 表示後面接的是變量,所以即會顯示出目前的 PATH 了! 
     
[root@test root]# echo $PATH 
/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin

增加環境變量:

PATH=”$PATH”:/root



檔案與目錄管理:

檔案與目錄的管理上,不外乎『顯示屬性』、『拷貝』、『刪除檔案』及『移動檔案或目錄』等等


ls 顯示文件名稱、屬性等 
cp 拷貝檔案或目錄 
rm 刪除檔案或目錄 
mv 移動檔案或目錄 


cp
語法
[root @test /root ]# cp [-drsu] [來源檔] [目的檔] 
參數說明: 
-d     :在進行 copy 的時候,如果是 copy 到 link 檔案,若不加任何參數,則預設情況中會將 link 到的源文件 
       copy 到目的地,若加 -d 時,則 link 檔案可原封不動的將 link 這個快捷方式其拷貝到目的地! 
-r     :可以進行目錄的 copy 呦! 
-s          :做成連結檔,而不 copy 之意!與 ln 指令相同功能! 
-u, --update:如果來源檔比較新,或者是沒有目的檔,那麼纔會進行 copy 的動作!可用於備份的動作中! 
範例: 
[root @test /root]# cp    .bashrc bashrc      <==將 .bashrc 拷貝成 bashrc 這個檔案! 
[root @test /root]# cp -r /bin /tmp/bin        <==這個功能就好玩啦!這是用來 copy 整個目錄的參數! 
[root @test /root]# cp -s .bashrc bashrc         <==將 .bashrc 建立一個連結檔,檔名爲 bashrc 
[root @test /root]# cp -u /home/.bashrc .bashrc  <==先檢查 /home/.bashrc 是否與 .bashrc 不同,如果不同的話就開始 copy 一份!如果相同則不做任何動作!
說明 
這個指令會常用到的呦!因爲我們得常常需要 copy 資料呀!所以需要了解一下喔!如果你有些很大檔案的需要備份,偏偏這個檔案的更新率很低,那麼每次備份都需要在 copy 一份嗎?看來是不需要了!你可以使用『cp -u 來源檔 目的檔』來備份呦!如此一來,當檔案被改變過後,纔會進行 copy 的動作! 
  

rm
語法
[root @test /root ]# rm [-fir] [檔名] 
參數說明: 
-i     :提供使用者確認(這是默認值) 
-r     :循環,就是一直殺掉,直到沒有東西爲止的意思 
-f     :force ,就是強力殺掉啦! 
範例: 
[root @test /root]# cp .bashrc bashrc<==建立一個新檔案, bashrc 
[root @test /root]# rm bashrc           <==會顯示如下的提示: 
rm: remove `bashrc'? 
[root @test /root]# mkdir testing 
[root @test /root]# cp .bashrc testing 
[root @test /root]# rmdir testing 
rmdir: `testing': Directory not empty   <==由於 testing 裏面有 .bashrc ,所以砍不掉! 
[root @test /root]# rm -rf testing      <==持續刪除該目錄下的所有檔案與目錄
說明 
這是移除的指令,相當於 dos 下的 del 指令!這裏要注意的是,通常在 Linux 系統下,爲了怕檔案被誤殺,所以都已經有 -i 這個參數, -i 是指每個檔案被殺掉之前都會讓使用者確認一次,以預防誤殺檔案!而如果要連目錄下的東西都一起殺掉的話,例如子目錄裏面還有子目錄時,那就要使用 -rf 這個參數了!不過,使用『 rm -rf 』這個指令之前,請千萬注意了,因爲,該目錄或檔案『肯定』會被 root 殺掉!因爲系統不會再次詢問你是否要砍掉呦! 所以那是個超級嚴重的指令下達呦!得特別注意!不過,如果你確定該目錄不要了,那麼使用 rm -rf 來循環殺掉是不錯的方式! 


mv
語法
[root @test /root ]# mv [-u] [來源檔] [目的檔] 
參數說明: 
-u   :同樣的,爲 update 的簡寫,當來源檔比目的檔還新的時後纔會動作! 
範例: 
[root @test /root]# cp .bashrc bashrc 
[root @test /root]# mv bashrc bashrc.old 
[root @test /root]# mv bashrc bashrc2 /tmp<==將 bashrc 與 bashrc2 移動到 /tmp 這個目錄下!請注意,最後一個纔是最終的目標,其它的都是 SOURCE
說明 
這是搬移的意思!當你要移動檔案或目錄的時後,呵呵!這個指令就很重要啦!同樣的,你也可以使用 -u ( update )才測試新舊檔案,看看是否需要搬移囉!另外一個用途就是『變更檔名!』,我們可以很輕易的使用 mv 來變更一的檔案的檔名呢! 
  

basename    就是取最後一個文件名或者目錄名
語法
[root @test /root ]# basename [目錄] 
參數說明: 
範例: 
[root @test /root]# basename /usr/local/etc 
etc 
這個指令會將後面的[目錄]僅擷取出最後面的那個目錄或檔案, 
以上面的例子來看, /usr/local/etc 不論 etc 是目錄或檔案, 
他都會被擷取出來,因爲他是最後一個出現的咚咚!
說明 
這個指令頗有點意思~他可以將一個目錄或檔案的最後一個咚咚秀出來!所以,未來如果你有要使用變量,並且取出最後一個數據(不論是檔案還是目錄),那麼使用這個玩意兒就對啦! ^_^ 


dirname    與basename相反,取最後一個文件名或者目錄名的前面部分
語法
[root @test /root ]# dirname [目錄] 
參數說明: 
範例: 
[root @test /root]# dirname /usr/local/etc 
/usr/local 
恰恰與 basename 相反,他僅是秀出來前面的『目錄』部分喔!
說明 
這個指令恰恰與 basename 相反的啦!呵呵!很好玩吧!這部份也最常用在我們第三部分要講的 Shell 的學習中喔!用最多的地方應該是 scripts 啦!用這兩個寶貝蛋來擷取部分數據的內容!有用的很!
  




觀看檔案內容:cat, tac, more, less, head, tail, nl

最常使用的顯示檔案內容的指令可以說是 cat 與 more 及 less 了

如果我們要查看一個很大型的檔案(好幾百MB時),但是我們只需要後端的幾行字而已,那麼該如何是好?呵呵!用 tail 呀,此外, tac 這個指令也可以達到!


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


more
語法
[root @test /root ]# more [檔名] 
參數說明: 
範例: 
[root @test /root]# more ~/.bashrc  <==一頁一頁的顯示檔案內容 
[root @test /]# ls -al | more  <==一頁一頁的將 ls 的內容顯示出來
說明 
more 真是個很有用的指令!我好喜歡呦!當你的檔案太大的時後,那麼使用 cat 將沒有辦法看清楚!這個時候你可以使用 more 來做動作!more 也可以用來做爲管線的同時執行之用!例如你在執行 find 這個尋找的指令時,可以同時使用 |more ,則搜尋結果可以一頁一頁的列出呦!關於管線( pipe )的用法我們在 bash shell 的地方再來談!


less
語法
[root @test /root ]# less [檔名]  
參數說明:  
範例:  
[root @test /root]# less ~/.bashrc 
說明 
less 的用法比起 more 又更加的有彈性,怎麼說呢?在 more 的時候,我們並沒有辦法向前面翻,只能往後面看,但若使用了 less 時,呵呵!就可以使用 [pageup] [pagedown] 等按鍵的功能來往前往後翻看文件,您瞧,是不是更容易使用來觀看一個檔案的內容了呢!? 
  
more 與 less 的用途與用法真的是很廣啦!首先,你可以在 more 與 less 的畫面中進行『搜尋』的工作!如何進行呢?我們以 less 來說明好了,如果你想要知道 /etc/man.config 這個檔案裏面有沒有一個叫做 GER 的大寫字眼,那麼可以: 








連結檔的介紹

ln命令

如果直接用ln passwd passwd-hard 是硬鏈接

如果使用ln -s passwd passwd-hard 是符號鏈接


硬鏈接不能跨分區 符號鏈接可以




檔案與目錄權限

由於 Linux 還可以設定其它的系統安全屬性,使用 chattr 來設定,而以 lsattr 來查看,最重要的屬性就是可以設定其不可修改的特性!讓連檔案的擁有者都不能進行修改!這個屬性可是相當重要的,尤其是在安全機制上面( security )!

chown 改變檔案的擁有人 
chgrp 改變檔案的所屬羣組 
chmod 改變檔案的可寫、可讀、可執行等屬性 
umask 改變預設的建立檔案或目錄時的屬性 
chattr 改變檔案的特殊屬性 
lsattr 顯示檔案的特殊屬性!


  • chown
    語法
    [root @test /root ]# chown [-R] user:group [目錄名稱] 
    參數說明: 
    -R    :循環的將該目錄下的所有檔案都改成 user 與 group 的名稱! 
    範例: 
    [root @test /root]# mkdir /home/test/testing  <==在 /home/test 這個家目錄中建立一個名爲 testint 的子目錄 
    [root @test /root]# cp * /home/test/testing 
    [root @test /root]# chown test /home/test/testing 
    [root @test /root]# chown -R test:test /home/test/testing<==將該目錄下的所有目錄或檔案均變爲 test 擁有

說明 
前一個章節纔剛講完,應該不會就這樣忘記了吧?!由於 chown 的使用範圍較廣,所以這裏再次的給他複習一下 chown 就好, chgrp 請回前一章內容觀看呦! 
  
記得檔案有『擁有人』及『擁有羣組』吧,這個 chown 就是在改變擁有者的指令。剛接觸 Linux 的朋友最容易犯的一個錯誤在哪裏呢?就是以 root 的身份 copy 一個檔案(或路徑)給一般使用者(假設爲 test )時,忘記將該檔案的所有人改成 test 了!由於複製者是 root 所以該檔案也會是 root 所有!那麼 test 當然也就不能修改該檔案了! 
  
在上面的例子中,『 chown test /home/test/testing 』這個指令只會將該目錄變成 test 的,但是 group 仍然是 root 的呦!所以你可以使用『 chown test:test /home/test/testing 』,連使用者羣組都給他改變一下囉!不過需要注意的是,這兩個指令都只改變了『目錄』 的所有權而已!那麼在這個目錄下的東西也要改變的話,該如何?!呵呵,就使用 -R 這個參數即可! 
  • chmod
    語法
    [root @test /root ]# chmod [-R] [parameter] [目錄名稱] 
    參數說明: 
    -R   :循環的一直將該目錄的檔案均改變之! 
    範例: 
    [root @test /root]# chmod 777 .bashrc 

  • umask
    OK!那麼現在我們知道如何建立或者是改變一個目錄或檔案的屬性了,不過,您知道當你建立一個新的檔案或目錄時,他的預設屬性會是什麼嗎?呵呵!那就與 umask 有關了!那麼 umask 是在搞什麼呢?基本上, umask 就是指定『目前使用者在建立檔案或目錄時候的屬性默認值』,那麼如何得知或設定 umask 呢?他的指定條件以底下的方式來指定: 
    語法
    [root @test root]# umask 
    0022 
    [root@vbird test]# umask 002   <==後面接 3 個數字! 
    [root@vbird test]# umask 
    0002
    說明 
    查看 umask 數值爲直接輸入 umask 即可,而設定呢?沒錯!就是 umask 之後接三個數字!那麼如何來指定呢?主要還是跟 Linux 的檔案屬性(那九個屬性, r, w, x )有關的,而且是以分數的那一個關係爲例的,而有底下的規則爲輔: 
     
    • 若使用者建立爲『檔案』則預設『沒有可執行 ( x ) 項目』,亦即只有 rw 這兩個項目,也就是最大爲 666 分
      --rw-rw-rw-
    • 若使用者建立爲『目錄』,則由於 x 與是否可以進入此目錄有關,因此預設爲所有權限均開放,亦即爲 777 分
      drwxrwxrwx
      
    那麼 umask 指定的是『該默認值需要減掉的權限!』因爲 r、w、x 分別是 4、2、1 分,所以囉!也就是說,當要拿掉能寫的權限,就是輸入 2 分,而如果要拿掉能讀的權限,也就是 4 分,那麼要拿掉讀與寫的權限,也就是 6 分,而要拿掉執行與寫入的權限,也就是 3 分,這樣瞭解嗎?請問您, 5 分是什麼?呵呵!就是讀與執行的權限啦!如果以上面的例子來說明的話,因爲 umask 爲 002 ,所以 user, group 並沒有被拿掉屬性,不過 others 的屬性被拿掉了 2 ( 也就是 w 這個屬性 ),那麼由於當使用者: 
     
    • 建立檔案時:(-rw-rw-rw-) – (--------w-) ==> -rw-rw-r--
    • 建立目錄時:(drwxrwxrwx) – (--------w-) ==> drwxrwxr-x
      
    不相信嗎?你只要使用 touch test 然後看看這個 test 的檔案屬性,就可以知道了!那麼如何看你這個使用者目前的 umask 呢?直接下達 umask 即可!實作看看先: 
     
    [root@vbird test]# umask 
    0002 
    [root@vbird test]# touch test1 
    [root@vbird test]# mkdir test2 
    [root@vbird test]# ls -l 
    -rw-rw-r--    1 root     root            0 Oct 22 00:00 test1 
    drwxrwxr-x    2 root     root         4096 Oct 22 00:00 test2/ 
    發現了什麼?呵呵! Test1 的屬性爲 666-002 = 664 !正確嗎?是的!正確! 
    而 test2 這個目錄呢?就是 777-002 = 775 !也正確!

    [root@vbird test]# umask 003 
    [root@vbird test]# touch test3 
    [root@vbird test]# mkdir test4 
    [root@vbird test]# ll 
    -rw-rw-r--    1 root     root            0 Oct 22 00:03 test3 
    drwxrwxr--    2 root     root         4096 Oct 22 00:03 test4/ 
    嘿!屬性又跟剛剛的不一樣囉!仔細推敲一下爲什麼呦!test3 666-003 =663,這是怎麼一回事?! 663 應該是 -rw-rw--wx 纔對啊!怎麼會是上面的屬性!呵呵!這裏就要特別的給他強調了!『儘量不要以數字相加減啦!』容易造成類似上面的問題!你應該要這樣想(-rw-rw-rw-) - (--------wx)=-rw-rw-r--這樣就對啦!瞭解了嗎?不要用十進制的數字喔!夠能力的話,用二進制來算,不曉得的話,用 rwx 來算喔! ^_^

      
    由上面的例子您應該很輕易的就可以發現 umask 的用途!而這個 umask 可以在 /etc/bashrc 裏面進行修改喔!預設的情況之下, root 的 umask 爲 022 而一般使用者則爲 002 ,因爲可寫的權限蠻嚴重的,因此預設都會拿掉這個權限!此外,因爲 root 比較重要!所以爲了安全的需求,其同羣組的寫入屬性就被拿掉了!這東西對於安全性也有一定程度的貢獻呦! 
  • chattr
    語法
    [root @test /root ]# chattr [+-=][ASacdistu] [檔案或目錄名稱] 
    參數說明: 
    +-= :分別爲 [+ 增加] [- 減少] [= 設定] 屬性的意思 
    A  :當設定了 A 這個屬性時,這個檔案(或目錄)的存取時間 atime (access) 將不可被修改, 
        可避免例如手提式計算機容易有磁盤 I/O 錯誤的情況發生! 
    S  :這個功能有點類似 sync 的功能!就是會將數據同步寫入磁盤當中!可以有效的避免數據流失! 
    a  :當設定 a 之後,這個檔案將只能增加數據,而不能刪除,只有 root 才能設定這個屬性。 
    c  :這個屬性設定之後,將會自動的將此檔案『壓縮』,在讀取的時候將會自動解壓縮出來! 
        但是在儲存的時候,將會先進行壓縮之後再儲存(看來對於大檔案似乎蠻有用的!) 
    d  :當 dump (備份)程序被執行的時候,設定 d 屬性將可使該檔案(或目錄)具有 dump 功效! 
    i  :這個 i 可就很厲害了!他可以讓一個檔案『不能被刪除、改名、設定連結也無法寫入或新增數據!』 
        對於系統安全性有相當大的幫助! 
    j  :當使用 ext3 這個檔案系統格式時,設定 j 屬性將會使檔案在寫入時先記錄在 journal 中! 
        但是當 filesystem 設定參數爲 data=journalled 時,由於已經設定了日誌了,所以這個屬性無效! 
    s  :當檔案設定了 s 參數時,他將會被完全的移除出這個硬盤空間。 
    u  :與 s 相反的,當使用 u 來設定檔案時,則數據內容其實還存在磁盤中,可以使用來 undeletion. 
    範例: 
    [root @test /root]# chattr +i /etc/shadow<==呵呵!如此則無法更動這個檔案囉! 
    [root @test /root]# chattr -i /etc/shadow <==解除該屬性!
    說明 
    這這個指令是重要的,尤其是在系統的安全性上面!由於這些屬性是隱藏的性質,所以需要以 lsattr 才能看到該屬性呦!其中,個人認爲最重要的當屬 +i 這個屬性了,因爲他可以讓一個檔案無法被更動,對於需要強烈的系統安全的人來說,真是相當的重要的!裏頭還有相當多的屬性是需要 root 才能設定的呢!此外,如果是 log file 這種的登錄檔,就更需要 +a 這個可以增加,但不會被殺掉的參數了!怎樣?很棒吧!未來提到登錄檔的認知時,我們再來聊一聊如何設定他吧!
  • lsattr
    語法
    [root @test /root ]# lsattr [-aR] 
    參數說明: 
    -a :將隱藏文件的屬性也秀出來; 
    -R :連同子目錄的數據也一併列出來! 
    範例: 
    [root @test /root]# chattr +i .bash_logout 
    [root @test /root]# lsattr -a  
    -------------- ./. 
    -------------- ./.. 
    ---i---------- ./.bash_logout 
    -------------- ./.bash_profile 
    -------------- ./.bashrc 
    -------------- ./.emacs 
    -------------- ./.screenrc
    說明 
    這兩個指令在使用上必須要特別小心,例如:某天你心情好,突然將 /etc/shadow 這個重要的密碼記錄檔案給他設定成爲具有 i 的屬性,那麼過了若干天之後,你突然要新增使用者,卻一直無法新增!別懷疑,趕快去將 i 的屬性拿掉吧!


搜尋檔案或目錄

檔案的搜尋可就厲害了!因爲我們常常需要知道那個檔案放在哪裏,所以來談一談怎麼搜尋吧!在 Linux 底下也有相當優異的搜尋系統呦!通常 find 不很常用的!因爲速度慢之外,也很操硬盤!通常我們都是先使用 whereis 或者是 locate 來檢查,如果真的找不到了,才以 find 來搜尋呦!爲什麼呢?因爲 whereis 與 locate 是利用數據庫來搜尋數據,所以相當的快速,而且並沒有實際的搜尋硬盤,比較省時間啦!

which   查看可執行檔案的位置 
whereis 查看檔案的位置 
locate  配合數據庫查看檔案位置 
find    實際搜尋硬盤去查詢文件名稱

which
語法
[root @test /root ]# which  [文件名稱] 
參數說明: 
範例: 
[root @test /root]# which passwd 
/usr/bin/passwd
說明 
which 的基本功能是『藉由 PATH 這個環境變量的內容,去該路徑內尋找可執行文件』,所以基本的功能在於『尋找執行檔』囉! 
  

whereis
語法
[root @test /root ]# whereis [-bmsu] [目錄名稱] 
參數說明: 
-b    :只找 binary 的檔案 
-m    :只找在說明文件 manual 路徑下的檔案 
-s    :只找 source 來源檔案 
-u    :沒有說明檔的檔案! 
範例: 
[root @test /root]# whereis passwd 
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.bz2 
將 passwd 相關字眼的檔案或目錄都列出來!

[root @test /root]# whereis -b passwd 
passwd: /usr/bin/passwd /etc/passwd 
僅列出binary 檔案!

[root @test /root]# whereis -m passwd 
passwd: /usr/share/man/man1/passwd.1.bz2 
僅搜尋 man page 所在的目錄!

說明 
如果使用 find 太麻煩,而且時間花用的很大!(因爲如果你的硬盤比較老舊的話,嘿嘿!有的等的!)這個時候 whereis 就相當的好用了!另外, whereis 可以加入參數來找尋相關的資料,例如如果你是要找可執行檔( binary )那麼加上 -b 就可以啦!例如上面的範例針對 passwd 這支程序來說明!如果不加任何參數的話,那麼就將所有的數據列出來囉!那麼 whereis 到底是使用什麼咚咚呢?爲何搜尋的速度會比 find 快這麼多?!其實那也沒有什麼!這是因爲 Linux 系統會將系統內的所有檔案都記錄在一個數據庫檔案裏面,而當使用 whereis 或者是底下要說的 locate 時,都會以此數據庫檔案的內容爲準,因此,有的時後你還會發現使用這兩個執行檔時,會找到已經被殺掉的檔案!這就是因爲他是一個『數據庫』檔案呀!另外,基本上 Linux 每天會針對 Linux 主機進行 updatedb (就是那一個數據庫檔案囉!)的動作,你可以在 /etc/cron.weekly/slocate.cron 這個檔案找到相關的機制呦!當然,也可以直接使用 /usr/bin/updatedb 來更新數據庫檔案呢! 
  

locate
語法
[root @test /root ]# locate [目錄名稱] 
參數說明: 
範例: 
[root @test /root]# locate root 
……一大堆跟 root 有關字眼的檔案都出來了 @_@

[root @test /root]# updatedb        <==立刻更新數據庫

說明 
locate 的使用方式就更簡單了!直接鍵入你要找的檔名即可!但是,這個東西還是有使用上的限制呦!爲什麼呢?您會發現使用 locate 來尋找數據的時候特別的快,這是因爲 locate 尋找的數據是由『已建立的數據庫 /var/lib/slocate』裏面的數據所搜尋到的,所以不用直接在去硬盤當中存取數據,呵呵!當然是很快速囉!那麼有什麼限制呢?就是因爲他是經由數據庫來搜尋的,而數據庫的建立預設是在每個禮拜執行一次,所以當您新建立起來的檔案,卻還在數據庫更新之前搜尋該檔案,那麼 locate 會告訴您『找不到!』呵呵!因爲必須要更新數據庫呀! 
  
那麼我到底要建立哪些數據庫呢?是否全部都要建立?似乎不需要,這個時候,你可以自己選擇需要建立檔案數據庫的目錄呢!在 /etc/updatedb.conf 這個內即可設定了! 
 
[root @test root]# more /etc/updatedb.conf 
## Linux-Mandrake configuration. 
# 由何處開始查詢數據,當然是由根目錄啦!所以填入 / 即可 
FROM="/"

# 哪些目錄不想要建立檔案搜尋數據,呵呵!就是那些不要的數據嘛! 
# 忘記的話,記得回上一章去看看內容,就知道爲何如此設定了! 
PRUNEPATHS="/proc,/tmp,/var/tmp,/usr/tmp,/net,/afs,/mnt"

# 安全等級 
#   0 代表關閉安全檢驗,速度上面較快速,但較不安全; 
#   1 啓動安全簡易,這是系統的默認值; 
SECURITY="1"

# 查詢的時候是否要由屏幕輸出?當然不要,否則多麻煩? 
VERBOSE="NO"

# 數據庫所在處!這是默認值,不要隨意移動,否則會找不到! 
DATABASE="/var/lib/slocate/slocate.db"

# 哪些檔案系統我們也不搜尋建立?就是光盤啦、非 Linux 的檔案格式啦, 
# 我們都不要進行搜尋信息的建立啦! 
PRUNEFS="nfs,smbfs,ncpfs,proc,devpts,supermount,vfat,iso9660,udf,usbdevfs,devfs"

  

find
語法
[root @test /root ]# find [路徑] [參數] 
參數說明: 
1. 時間: 
   -atime n    :在 n*24 小時內被 access 即存取過的檔案列出來! 
   -ctime n    :在 n*24 小時內被 changed 即改變、新增的檔案或目錄印出 
   -mtime n    :在 n*24 小時內被 modified 即修改過的檔案印出 
   -newer file :比 file 還要新的檔案就列出來! 
2. 使用名稱: 
   -gid n      :尋找 羣組 ID 爲 n 的檔案 
   -group name :尋找羣組名稱爲 name 的檔案 
   -uid n      :尋找擁有者 ID 爲 n 的檔案 
   -user name  :尋找使用者名稱爲 name 的檔案 
   -name file  :尋找檔名爲 file 的文件名稱(可以使用萬用字符) 
   -type type  :尋找檔案屬性爲 type 的檔案,type 包含了 b, c, d, p, l, s, 
                這些與前一章的屬性相同!例如 l 爲 Link 而 d 爲路徑之意! 
範例: 
[root @test /root]# find / -name testing            <==尋找檔名爲 testing  
[root @test /root]# find / -name 'test*'       <==尋找檔名包含 test 的! 
[root @test /root]# find . -ctime 1                 <==尋找目前目錄下一天內新增的目錄或檔案 
[root @test /root]# find /home/test -newer .bashrc  <==尋找 /home/test 目錄下比 .bashrc 還要新的檔案 
[root @test /root]# find /home -user test       <==尋找 /home 底下擁有者爲 test 的檔案 
[root @test /root]# find /dev -type b               <==尋找 /dev 這個目錄下,檔案屬性爲 b 的檔案
說明 
如果你要尋找一個檔案的話,那麼使用 find 會是一個不錯的主意!他可以根據不同的參數來給予檔案的搜尋功能!例如你要尋找一個檔名爲 httpd.conf 的檔案,你知道他應該是在 /etc 底下,那麼就可以使用『 find /etc -name httpd.conf 』嚕!那如果你記得有一個檔案檔名包含了 httpd ,但是不知道全名怎辦?!呵呵,就用萬用字符 * 吧,如上以:『 find /etc -name '*httpd*' 』就可將檔名含有 httpd 的檔案都列出來囉!不過,由於 find 在尋找數據的時後相當的耗硬盤!所以沒事情不要使用 find 啦!有更棒的指令可以取代呦!那就是 whereis 與 locate 囉!!




SetUID, SetGID, Sticky bit 與 file 指令


  • SUID 與 SGID:
    其實,說到這裏之前,應該先說明一下 UID (user ID)與 GID (Groupt ID)的!基本上, Linux 認得的賬號只是一堆數字而已!而由於我們每個檔案中同時含有『使用者』與『使用者羣組』的屬性,因此,就有所謂的 UID 與 GID 囉! UID 代表我們的使用者『代號』而 GID 則是羣組的『代號』。你可以使用『 more /etc/passwd 』這個指令來看一下你的系統當中的所有賬號,然後你會注意到每行的第三、四個字段(以 : 分隔)爲數字,那個就是 UID 與 GID 了,您更會注意到的是, root 的 UID 與 GID 都是 0 !因此,當你建立了一個賬號,而你將該賬號的 UID 與 GID 都改爲零,呵呵!那個賬號的使用者就具有 root 的身份囉! 
      
    那麼什麼是 SUID 與 SGID 呢?!在說明之前我們先來以一般身份使用者 ( 還記得安裝的時候曾經增加一個 test 賬號的一般身份使用者嗎?對啦!用他!然後呢?直接在鍵盤上按下 [Alt] + [Ctrl] + [F2] 到第二個終端機呀!) test 的身份登入,再來看一個檔案的內容: 
     
    [test@test test]$ ls -l /usr/bin/passwd  
    -r-s--x--x    1 root     root        13476 Aug  7  2001 /usr/bin/passwd 
      
    看到了 /usr/bin/passwd 檔案的前面屬性了嗎?怎麼會有 s 的屬性在原本的 x 呀!?那個就是所謂的 SUID 了!如果是『 -r-xr-s--x 』時,那麼 s 就成爲所謂的 SGID 了! 
      當一個檔案具有 SUID 的時候,同時 other 的羣組具有可執行的權限,那麼當 others 羣組執行該程序的時候, other 將擁有該檔案的 owner 的權限!』。
  
[test@test test]$ ls -l /usr/bin/passwd /etc/shadow  
-r-s--x--x    1 root     root        13476 Aug  7  2001 /usr/bin/passwd  
-rw-------    1 root     root         2423 Jun 25 14:29 /etc/shadow 
  
我們以賬號的密碼文件來說明好了!注意上面的範例囉!可以看到的是, /etc/shadow 的權限是『只有 root 才能存取』呦!那麼你會不會覺得很奇怪?明明我的一般使用者可以自己修改密碼呀!對不對?那麼修改密碼一定跟 /etc/shadow 這個檔案有關,那麼怎麼回事呀!?使用者是如何修改 /etc/shadow 這個檔案的呢?嗯!沒錯!就是使用 SUID 的功能啦!上面的例子說明了, /usr/bin/passwd 這個檔案具有 SUID 的屬性,那麼當使用者使用 /usr/bin/passwd 這個執行檔時,在執行 pass word 修改的期間就具有 /usr/bin/passwd 這個檔案的擁有者 root 的所屬權限囉!所以,所以當一般使用者執行 passwd 的時候,將具有 root 的權限,所以他們也可以更改 /etc/shadow 的內容囉!那麼由此也可以知道,由於這個 Set UID ( SUID ) 的主要功能是在『某個檔案執行的期間具有檔案擁有者的權限』,因此, s 就是替代上面提到的 x 這個可執行的位置囉!那萬一該檔案並沒有 x 的屬性呢?哈哈!問的好!那麼該檔案的屬性就會將小寫的 s 變成大寫的 S 啦! ( 這裏即使暫時不瞭解也沒有關係,等到過一陣子再回來看一看,你就會了解啦! ) 
  
不過,由此也知道 SUID 與 SGID 的問題所在,沒錯!就是太不安全了!如果你有一個檔案具有 root 的權限,那麼當開啓了 SUID 的時候,嘿嘿!夠你瞧的了!!因此上,在變更一個檔案成爲具有 SUID 或 SGID 的情況時,必須要特別小心呢!知道乎!? 
 Sticky bit:
OK!接着下來,我們要來看一下,既然有 SUID 與 SGID ,那麼爲什麼沒有在最末位出現 s 取代 x 呢?呵呵!這當然沒有必要啦!因爲那是屬於 others 的權限,你的檔案如果是任何人皆可執行的話,那麼本來他們就具有權限啦!幹嘛還要設定 s 的屬性!?不過,這裏卻真的有另一個屬性出現了,那就是 Sticky bit 的屬性 ( t ) !這個屬性的最大用處在於『具有 sticky bit 屬性的該”目錄”下的檔案,其檔案或目錄只有檔案擁有者及 root 纔有權力刪除!』這樣是否可以瞭解了呢?嘿嘿!沒錯!在我們系統裏面本來就預設有一個啦!那就是 /tmp 這個目錄! 
  
[test@test test]$ ls -l /  
drwxrwxrwt    2 root     root         4096 Jul 18 13:08 tmp 
  
如何,發現了吧!雖然該目錄具有所有人皆可擦寫的權限,但是確有一個 t 出現了,那就是所謂的 sticky bit 囉!在該目錄裏面雖然你可以建立與修改任何檔案,但是卻僅能刪除自己建立的檔案呢!除非你是 root !你可以這樣試試看囉: 
  1. 以 root 登入系統,並且進入 /tmp 當中; 
2. touch test,並且更改 test 權限成爲 777 ; 
3. 以一般使用者登入,並進入 /tmp; 
4. 嘗試刪除 test 這個檔案!  
如何!?發現了吧!! 
 SUID, SGID, Sticky bit 的設定方法:
前面介紹過 SUID 與 SGID 的功能,那麼如何開啓檔案使成爲具有 SUID 與 SGID 的權限呢?!這就需要剛剛的數字更改權限的方法了!現在你應該已經知道數字型態個更改權限方式爲『三個數字』的組合,那麼如果在這三個數字之前再加上一個數字的話,那最前的面數字就代表這幾個屬性了! ( 注:通常我們使用 chmod xyz filename 的方式來設定 filename 的屬性時,則是假設沒有 SUID, SGID 及 Sticky bit 啦! ) 
 
  • 4 爲 SUID
  • 2 爲 SGID
  • 1 爲 Sticky bit
  
假設要將一個檔案屬性改爲『-rwsr-xr-x』時,由於 s 在使用者權限中,所以是 SUID ,因此,在原先的 755 之前還要加上 4 ,也就是:『 chmod 4755 filename 』來設定!此外,還有大 S 與大 T 的產生喔!參考底下的範例啦! 
 
[root@test tmp]# touch test 
[root@test tmp]# ll 
total 0 
-rw-r--r--    1 root     root            0 Feb  6 23:08 test 
[root@test tmp]# chmod 4755 test 
[root@vbird tmp]# ll 
total 0 
-rwsr-xr-x    1 root     root            0 Feb  6 23:08 test* 
[root@test tmp]# chmod 6755 test 
[root@test tmp]# ll 
total 0 
-rwsr-sr-x    1 root     root            0 Feb  6 23:08 test* 
[root@test tmp]# chmod 1755 test 
[root@test tmp]# ll 
total 0 
-rwxr-xr-t    1 root     root            0 Feb  6 23:08 test* 
上面的三個例子應該都很好說明啊!就是直接將 x 以 s 或者是 t 來取代就是了!也就是分別爲 SUID, SGID 及 sticky bit 的設定方法啦!

[root@test tmp]# chmod 7666 test 
[root@test tmp]# ll 
total 0 
-rwSrwSrwT    1 root     root            0 Feb  6 23:08 test 
這個例子就要特別小心啦!怎麼會出現大寫的 S 與 T 呢?不都是小寫的嗎?因爲 s 與 t 都是取代 x 這個參數的,但是你有沒有發現阿,我們是下達 7666 喔!也就是說, user, group 以及 others 都沒有 x 這個可執行的標誌 ( 因爲 666 嘛! ),所以,這個 S, T 代表的就是『空的』啦!怎麼說? SUID 是表示『該檔案在執行的時候,具有檔案擁有者的權限』,但是檔案擁有者都無法執行了,哪裏來的權限給其它人使用?當然就是空的啦! ^_^

 file
語法
[root @test /root ]# file [檔名]  
參數說明:  
範例:  
[root @test /root]# file ~/.bashrc  
/root/.bashrc: ASCII text  <==表示這個檔案是 ASCII 純文字文件 

[root @test /root]# file /usr/bin/passwd 
/usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped 
嘿!還可以看到是否具有 SUID 的權限呢!

說明 
file 這個指令也蠻好用的,可以用來查看這個檔案的類型,例如 ASCII 格式檔,或者是 binary 的檔案等等,還可以用來觀看檔案是否被加入 SUID 等等的信息!並且,也同時提供了是否有使用動態函式庫的信息!相當的好用!












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章