目錄與路徑: 由前一章節 『Linux 的檔案權限與目錄配置』 中約略了解到 Linux 的『樹狀目錄』概念之後,接下來就得要實際的來搞定一些基本的路徑問題了!這些問題當中,最重要的莫過於『絕對路徑』與『相對路徑』的意義啦!趕緊來了解一下! 絕對路徑與相對路徑: 在開始目錄的切換之前,你必須要先了解一下所謂的『路徑, PATH』,有趣的是:什幺是『相對路徑』與『絕對路徑』?如果你還記得前一章的內容的話,那幺應該還記得 Linux 裡面的目錄是呈現『樹狀目錄』的情況,有就是有分支的啦!好了,假設你需要在任意一個目錄下變換到根目錄的 etc 底下,那幺你就應該要使用『 cd /etc 』這個情況,這也就是所謂的『絕對路徑』,他是從根目錄連續寫上來的一個情況,所以不論你在哪一個路徑現執行這一個指令,都會將你移動到該路徑下。那如果我是使用『 cd etc 』呢?那表示你要切換到『目前這個目錄下的 etc 目錄中』,情況可是不一樣的呦!通常第一次接觸 Linux 的使用者常會搞錯這一個路徑的觀念! 絕對路徑:路徑的寫法『一定由根目錄 / 寫起』,例如: /usr/share/doc 這個目錄。 相對路徑:路徑的寫法『不是由 / 寫起』,例如由 /usr/share/doc 要到 /usr/share/man 底下時,可以寫成:『cd ../man』這就是相對路徑的寫法啦! 那幺相對路徑與絕對路徑有什幺了不起呀!?喝!那可真的是了不起了!假設您寫了一個套件,這個套件共需要三個目錄,分別是 etc, bin, man 這三個目錄,然而由於不同的人喜歡安裝在不同的目錄之下,假設甲安裝的目錄是 /usr/local/packages/etc, /usr/local/packages/bin 及 /usr/local/packages/man ,不過乙卻喜歡安裝在 /home/packages/etc, /home/packages/bin, /home/packages/man 這三個目錄中,請問如果需要用到絕對路徑的話,那幺是否很麻煩呢?是的!如此一來每個目錄下的東西就很難對應的起來!這個時候相對路徑的寫法就顯的特別的重要了! 此外,如果您跟我一樣,喜歡將路徑的名字寫的很長,好讓自己知道那個目錄是在干什幺的,例如:/data4/staiwan19961109/models-3/smoke 這個目錄,而另一個目錄在 /data4/staiwan19961109/models-3/cctm ,那幺我從第一個要到第二個目錄去的話,怎幺寫比較方便?當然是『 cd ../cctm 』比較方便啰!對吧! 好了,既然要談到目錄這個東西,自然就需要了解一下有哪些常用的目錄『符號』代表的意義啦! . 代表此層目錄 .. 代表上層目錄 ~ 代表自己的家目錄 ~user 代表到 user 這個人的家目錄 底下我們要來談一談目錄與路徑的幾個常用的指令: cd 變換目錄 pwd 顯示目前的目錄 mkdir 建立一個新目錄 rmdir 刪除一個裡面是空的空目錄 cd 與 pwd 這兩個指令主要是在『變換目前目錄』與『顯示目前所在目錄』的工作,底下說一說他們的用途與語法吧! cd 語法: [root @test /root ]# cd [相對路徑或絕對路徑] 參數說明: 路徑有『相對路徑』與『絕對路徑』的分別,請千萬小心啰! 范例: [root @test /root]# cd .. <==回到上一層目錄 [root @test /root]# cd ../home <==相對路徑的寫法 [root @test /root]# cd /var/www/Html <==絕對路徑的寫法 [root @test /etc]# cd <==回到使用者的家目錄 [root @test /etc]# cd ~ <==回到使用者的家目錄! [root @test /etc]# cd ~test <==回到 test 這個使用者的家目錄 說明: cd 是 change Directory 的縮寫,這是用來變換工作路徑的指令。注意,路徑與 cd 指令之間存在一個空格!一登入 Linux 系統後,root 會在 root 的家目錄,亦即 /root 下,至於使用者會在預設的 /home/username 底下,例如鳥哥的 ID 為 vbird ,則以 vbird 的身份登入後,會到 /home/vbird 這個路徑下。OK!那回到上一層可以用『 cd .. 』而到相對路徑可到『 cd ../bird』,至於絕對路徑則是 cd /usr/sbin !注意喔,在前面的提示字元會改變路徑名稱!此外,家目錄還有一個代碼,那就是『 ~ 』符號!例如上面的例子可以發現,使用『 cd ~ 』可以回到個人的家目錄裡頭去呢!此外,如果你的 Linux 主機當中有個 testing 的帳號,你要到他的家目錄去,可以下達『 cd ~testing』立刻去到 testing 的家目錄啰! pwd 語法: [root @test /root ]# pwd 范例: [root @test root]# cd /home/test [root @test test]# pwd /home/test <==顯示目前你所在的目錄呦! 說明: pwd 是 print working directory 的縮寫,也就是顯示目前所在目錄的指令,例如在上個表格最後的目錄是 /home/test 這個目錄,但是提示字元僅顯示 test ,如果你想要知道目前所在的目錄,可以輸入 pwd 即可: 此外,由於很多的套件所使用的目錄名稱都相同,例如 /usr/local/etc 還有 /etc ,但是通常 Linux 僅列出最後面那一個目錄而已,這個時候你就可以使用 pwd 來知道你的所在目錄啰!免得搞錯目錄,結果…… mkdir 與 rmdir 管理目錄: 那幺要如何建立刪除目錄呢?很簡單呀!就用 mkdir 與 rmdir ,看出來了嗎?沒錯啦!就是 make/remove directory 的縮寫說!看要怎幺用吧! 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/ 說明: 如果想要建立新的目錄的話,那幺就使用 mkdir 吧! 不過,請注意呦!在預設的情況下,你所需要的目錄得一層一層的建立才行!例如:假如你要建立一個目錄為 /home/bird/testing/test1,那幺首先必須要有 /home 然後 /home/bird ,再來 /home/bird/testing 都必須要存在,才可以建立 test1 這個目錄!假如沒有 /home/bird/testing 時,就沒有辦法建立 test1 的目錄啰!不過,現在有個更簡單有效的方法啦!那就是加上 -p 這個參數喔!你可以直接下達:『 mkdir -p /home/bird/testing』則系統會自動的幫你將 /home, /home/bird, /home/bird/testing 依序的建立起目錄!並且,如果該目錄本來就已經存在時,系統也不會顯示錯誤訊息喔!挺快樂的吧! ^_^ 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 在提過了絕對路徑、相對路徑與指令的下達方式之後,您應該會稍微注意到一件事情,那就是:『為什幺我可以在 /root 底下執行 /bin/ls 這個檔案呢?』對呀!為什幺我可以直接執行 ls 就一定可以顯示出一些訊息而不會說找不到該檔案呢?這是因為環境變數 PATH 的幫助所致呀!當我們在執行一個指令的時候,系統會依照 PATH 的設定去每個 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 注意到了嗎?對啦! /bin 在 PATH 的設定之中,所以自然就可以找的到 ls 啦! 如果你將 ls 移動到 /root 底下的話,然後你自己本身也在 /root 底下,但是當你執行 ls 的時候,他就是不理你?怎幺辦?這是因為 PATH 沒有 /root 這個目錄,而你又將 ls 移動到 /root 底下了,自然系統就找不到可執行檔了,因此就會告訴你, command not found !那幺該怎幺克服這種問題呢?有兩個方法,其一:直接將 /root 的路徑加入 PATH 當中!如何增加?可以使用: PATH=”$PATH”:/root 這種方式來增加即可!另一種方式則是使用完整檔名,亦即直接使用相對或絕對路徑來執行,例如: /root/ls ./ls 因為在同一個目錄中,而我們又知道在同一個目錄中的目錄符號為『 . 』,因此,就以上面的 ./ls 來執行也可以!這種執行方式以後您應該會很常見到才對! 如果我有兩個 ls 檔案在不同的目錄中,例如 /usr/local/bin/ls 底下與 /bin/ls 那幺當我下達 ls 的時候,那個 ls 會被執行?那還用說,就找出 PATH 裡面那個目錄先被查詢,則那個目錄下的檔案就會被先執行了! 咦!既然如此的話,那幺為何不要在 PATH 裡面加入 . 這個目錄,如此一來的話,不就可以直接在所在目錄執行檔案了嗎?因為 . 代表所在目錄嘛!是這樣沒錯!但是有沒有想過,如果某天,某個怪怪的使用者在 /tmp 裡面寫了一個 ls 的檔案,偏偏他是有害的檔案,那幺當你在 /tmp 底下執行 ls 時,怎幺辦?!沒錯,可能會『中標』,所以啰,為了安全起見,不建議將『 . 』加入 PATH 的搜尋當中! 檔案與目錄管理: 談了談目錄與路徑之後,再來討論一下關於檔案的一些基本管理吧!檔案與目錄的管理上,不外乎『顯示屬性』、『拷貝』、『刪除檔案』及『移動檔案或目錄』等等,由於檔案與目錄的管理在 Linux 當中是很重要的!尤其是每個人自己家目錄的資料也都需要注意管理!由於我們在執行程式的時後,系統預設有一個搜尋的路徑順序,如果有兩個以上相同檔名的執行檔分別在不同的路徑時,呵呵,就需要特別留意啰!這裡我們來談一談有關檔案與目錄的一些基礎管理部分吧! ls 顯示檔案名稱、屬性等 cp 拷貝檔案或目錄 rm 刪除檔案或目錄 mv 移動檔案或目錄 ls 語法: [root @test /root ]# ls [-ailS] 參數說明: -a :全部的檔案都列出(連同隱藏檔) -i :印出 inode 的值 -l :長的列出,連同檔案大小的資料等等 -S :以檔案大小排序 --color=never :不要顯示顏色 --color=always :均顯示顏色 --color=auto :由系統自行判斷! 范例: [root @test /root]# ls -al total 48 drwxr-x--- 4 root root 4096 Mar 10 00:37 . drwxr-xr-x 21 root root 4096 Mar 10 20:16 .. -rw------- 1 root root 524 Mar 10 00:40 .bash_history -rw-r--r-- 1 root root 24 Jun 11 2000 .bash_logout -rw-r--r-- 1 root root 266 Jun 11 2000 .bash_profile -rw-r--r-- 1 root root 249 Mar 6 20:50 .bashrc -rw-r--r-- 1 root root 210 Jun 11 2000 .cshrc drwx------ 2 root root 4096 Mar 9 11:06 .gnupg -rw------- 1 root root 524 Jan 16 14:37 .mysql_history drwx------ 2 root root 4096 Mar 9 11:06 .ssh -rw-r--r-- 1 root root 196 Jul 11 2000 .tcshrc -rw-r--r-- 1 root root 1126 Aug 24 1995 .Xresources [root @test /]# ls bin dev etc lib misc opt root tFTPboot usr boot disk1 home lost+found mnt proc sbin tmp var [root @test /]# ls --color=never bin dev etc lib misc opt root tftpboot usr boot disk1 home lost+found mnt proc sbin tmp var [root @test /]# ls -almore 說明: 還記得我們在解釋檔案的一些屬性與目錄的結構的那一章嗎?!對啦!我們使用的第一支指令就是 ls 啦!通常我們都需要知道這個檔案名稱『目錄』還是『檔案』?所以,我都喜歡使用『 ll』這個指令,其實那就是ls -l 的意思啦!不論如何,你都可以嘗試著執行這之指令來視察你的檔案! 請注意呦!不要忘記你的資料的主要咚咚!尤其是前面幾個主要的屬性呦!另外,你有沒有發現如果在遠端以 telnet 或者是 putty 的連線程式登入主機的時後,由於 Linux 預設使用有顏色的方式顯示方式,但是像上表一樣,藍色的字樣根本就是很難看到!這個時候通常我都是使用『ls --color=never 』來丟掉顏色!那如果想讓 ls 預設沒有顏色的話,可以在 /root/.bashrc 或者是你的家目錄的 .bashrc 這個檔案中加入下面這一行: alias ls='ls --color=never' 這樣就可以把顏色去到了!至於 alias 是在干嘛的?我們到了 bash 這個 shell 的時候再來談吧! 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 語法: [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 以二進位的方式讀取檔案內容! 底下我們來談一談每個指令的基本用法吧! cat 語法: [root @test /root ]# cat [-n] 參數說明: -n: 顯示時,連行號印出螢幕上。 范例: [root @test /root]# cat ~/.bashrc <==顯示 .bashrc 這個檔案 # .bashrc # User specific aliases and functions PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH" alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' alias ll='ls -l --color=never' alias lm='ls -almore' alias h='history' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi [root @test /root]# cat ~/.bashrc -n <==顯示 .bashrc 並且加上行號! 1 # .bashrc 2 3 # User specific aliases and functions 4 PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH" 6 alias rm='rm -i' 7 alias cp='cp -i' 8 alias mv='mv -i' 9 alias ll='ls -l --color=never' 11 alias lm='ls -almore' 12 alias h='history' 13 14 # Source global definitions 15 if [ -f /etc/bashrc ]; then 16 . /etc/bashrc 17 fi 說明: 嘿嘿! Linux 裡面有『貓』?!喔!不是的, cat 是 Concatenate (連續)的簡寫,主要的功能是將一個檔案的內容連續的印出在螢幕上面!例如上面的例子中,我們將重要的參數檔 .bashrc 印出來!如果加上 -n 的話,則每一行前面還會加上行號呦!cat 比較少用!畢竟當你的檔案內容的行數超過 40 行以上,嘿嘿!根本來不及看!所以,配合 more 或者是 more 來執行比較好! tac 語法: [root @test /root ]# tac [檔名] 參數說明: 范例: [root @test /root]# tac ~/.bashrc <==發現了沒?反向印出呦! fi . /etc/bashrc if [ -f /etc/bashrc ]; then # Source global definitions alias h='history' alias lm='ls -almore' alias ll='ls -l' # alias ll='ls -l --color=never' alias mv='mv -i' alias cp='cp -i' alias rm='rm -i' eXPort PATH PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH" # User specific aliases and functions # .bashrc 說明: tac 這個好玩了!怎幺說呢?詳細的看一下, cat 與 tac ,有沒有發現呀!對啦! tac 剛好是將 cat 反寫過來,所以他的功能就跟 cat 相反啦, cat 是由『第一行到最後一行連續顯示在螢幕上』,而 tac 則是『由最後一行到第一行反向在螢幕上顯示出來』,很好玩吧! 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 的大寫字眼,那幺可以: [root @test /root ]# less /etc/man.config 按鍵說明: /Word:在 /etc/man.config 這個檔案中搜尋 word 這個字串的所在 q :離開 less 的畫面 然後在輸入 / 之後,游標會移動到最左下角等待輸入,這個時候您只要輸入你的字串之後,就會自動的幫你找出來該關鍵字啰! head 語法: [root @test /root ]# head [-n number] [檔名] 參數說明: -n :顯示 number 行 范例: [root @test /root]# head ~/.bashrc <==預設情況下,顯示頭十行 [root @test /root]# head -n 20 ~/.bashrc<==顯示頭二十行! 說明: head 的英文意思就是『頭』啦,那幺這個東西的用法自然就是顯示出一個檔案的前幾行啰!沒錯!就是這樣!若沒有加上 -n 這個參數時,預設只顯示十行,若只要一行呢?那就加入『 head -n 1 filename 』即可! tail 語法: [root @test /root ]# tail [-n number] [檔名] 參數說明: -n :顯示 number 行 范例: [root @test /root]# tail ~/.bashrc [root @test /root]# tail -n 5 ~/.bashrc <==只顯示最後面五行! 說明: 那幺有 head 自然就有 tail ( 尾巴 ) 啰!沒錯!這個 tail 的用法跟 head 的用法差不多類似,只是顯示的是後面幾行就是了!預設也是顯示十行,若要顯示非十行,就加 -n number 的參數! 例題一:假如我想要顯示 ~/.bashrc 的第 11 到第 20 行呢? 答: 這個應該不算難,想一想,在第 11 到第 20 行,那幺我取前 20 行,再取後十行,所以結果就是:『 head –n 20 ~/.bashrc tail –n 10 』,這樣就可以得到第 11 到第 20 行之間的內容了!但是裡面涉及到管線命令,需要在第三篇的時候才講的到! nl 語法: [root @test /root ]# nl [檔名] 參數說明: 范例: [root @test /root]# nl ~/.bashrc 說明: 那幺 nl 又是什幺?這也沒什幺,這個指令的用法跟 cat -n 的用法類似,也就是『可以印出行號』的指令來查看檔案啦!也是挺好用的! od 語法: [root @test /root ]# od [檔名] 參數說明: 范例: [root @test /root]# od ~/.bashrc 0000000 020043 061056 071541 071150 005143 021412 052440 062563 0000020 020162 070163 061545 063151 061551 060440 064554 071541 0000040 071545 060440 062156 063040 067165 072143 067551 071556 0000060 050012 052101 036510 027442 064542 035156 071457 064542 0000100 035156 072457 071163 071457 064542 035156 072457 071163 0000120 061057 067151 027472 071565 027562 067554 060543 027554 0000140 061163 067151 027472 071565 027562 067554 060543 027554 0000160 064542 035156 050044 052101 021110 062412 070170 071157 0000200 020164 040520 044124 005012 066141 060551 020163 066562 0000220 023475 066562 026440 023551 060412 064554 071541 061440 0000240 036560 061447 020160 064455 005047 066141 060551 020163 0000260 073155 023475 073155 026440 023551 021412 060440 064554 0000300 071541 066040 036554 066047 020163 066055 026440 061455 0000320 066157 071157 067075 073145 071145 005047 066141 060551 0000340 020163 066154 023475 071554 026440 023554 060412 064554 0000360 071541 066040 036555 066047 020163 060455 076154 067555 0000400 062562 005047 066141 060551 020163 036550 064047 071551 0000420 067564 074562 005047 021412 051440 072557 061562 020145 0000440 066147 061157 066141 062040 063145 067151 072151 067551 0000460 071556 064412 020146 020133 063055 027440 072145 027543 0000500 060542 064163 061562 056440 020073 064164 067145 004412 0000520 020056 062457 061564 061057 071541 071150 005143 064546 0000540 000012 0000541 說明: 好了,那幺如果有一個非 ASCII 的資料檔案呢?例如那個 binary 的檔案!使用 vi 根本就是看不著~這個時候看來只有使用將整個資料以數值方法讀出來啦!那就是 od 這個指令來讀出來呦!這個東西可以用來輸出該資料為十進位、16進位等等的資料格式!不過這個東西對於工程師可能比較有用啦!因為印出來的東西都是數字或記憶體當中的資料~~ 連結檔的介紹: 在開始介紹介紹連結檔 ( Link ) 之前,我們得先來了解一下什幺是 inode 這個東西?說實在的,這個東西真的很重要,不了解他的時候,很容易搞錯很多的咚咚! 什幺是 inodes ? 要提到 inode 之前,我們得先來了解一下硬碟的整體構造才行!硬碟裡面有多個硬碟盤組合在一起,而一個硬碟盤可以如下圖所示,硬碟盤為圓形的,其中,每一個硬碟盤上面都有個可以讀寫的磁頭( Head ),而當這個磁頭固定住,讓硬碟盤轉一圈,那幺那一個圓形的就是磁軌( Track )啦,而在硬碟內的幾個硬碟盤同半徑的那一圈的磁軌總和稱為磁柱( Cylinder ),而由圓心向外畫出直線,可以得到如下圖所示,那幺那一顆一顆的咚咚,就是硬碟的最小儲存物理量,我們稱為磁區( setctor ),一個磁區的物理量大約是 512 bytes ( 約 0.5K )。 磁頭 ( Head ) :可讀寫的金屬磁片; 磁軌 ( Track ) :讀寫頭轉一圈 ( 同心圓的一圈 ) 的量; 磁區 ( Sector ) :最小的物理儲存量。 好了,知道了大體的硬碟構造之後,再來談一談怎麼硬碟分割( partition )呢?我們在進行硬碟分割的時候,最小都是以磁柱為單位進行分割的,那麼分割完成之後自然就是格式化( format )啰,在 Linux 裡面我們在進行格式化的時候必須要考慮到 Block 與 inode 的資訊,這個 block 還好理解,他是我們磁碟可以記錄的最小單位,是由數個 sector 所組成的,所以他的大小通常為 n*512 bytes ,例如 4K 。那麼 inode 是什麼? Block 是記錄『檔案內容資料』的地區,而 inode 則是記錄『該檔案的屬性、及該檔案放置在哪一個 Block 之內』的資訊!所以,每個檔案都會占用到至少一個 inode 。而當我們 Linux 系統要找到這個檔案時,他會先去搜尋 inode table 找到這個檔案的屬性及資料放置的地區,然後再到資料去找到資料存放的 Block 進而將資料取出利用。這個 inode 數目在一開始就會被設定好,他的設定方式通常是利用 ( 硬碟大小 / 一個容量 ),這個容量至少應該比 Block 要大一些較佳,例如剛剛的 Block 訂為 4K ,那麼 inode 可以訂為 8K 左右。所以,一顆 1GB 的硬碟,如果以 8K 來規劃他的 inode 數時,他的 inode 就會有 131072 個 inode 啦!而一個 inode 的大小為 128 bytes 這麼大!這麼一來的話,我們就可以清楚的知道了,那就是一個 partition 格式化為一個 filesystem 之後,基本上,他一定會有 inode table 與 data area 兩個區塊,一個用來記錄檔案的資訊與該檔案放置的 block 區塊,一個用來記錄檔案的內容! 由於我們 Linux 在讀取資料的時候,是先查詢 inode table 以得到資料是放在那個 Block 裡面,然後再去該 Block 裡面讀取真正的資料內容!然後,那個 block 是我們在格式化硬碟的時候規定出來的一個值,這個 block 是由 2 的 n 次方個 sector 所集結而成的!所以,他是 0.5K 的倍數喔!假設我們 block 規劃為 4KBytes 好了,那麼由於一個 inode 與一個 block 最多均只紀錄一個檔案,所以,哈哈!如果你的一個檔案有 0.1 K bytes 這麼大時,你要曉得的是,由於你的 block 為 4K bytes ,因此,你就會有 3.9 Kbytes 的空間『浪費掉』喔!所以,當你在格式化硬碟的時候,請千萬注意到你的系統未來的使用方向喔! 當 block 越小 ( 最小為 0.5K ) 、inodes 越多,可利用空間越多,但是大檔案寫入效率較差:適合檔案數量多但是檔案容量小的系統,例如 BBS 或者新聞群組 news 這方面的服務之系統; 當 block 越大 ( 最大可到 16 * 0.5K 以上 ) 、 inodes 數越少,大檔案寫入效率較佳,但浪費的空間較多:適合檔案容量大的系統。 ln OK!知道了什麼是 inode 與他的功能之後,接著下來就要來介紹 link 這個玩意兒了!說到 link 其實也沒有什麼大不了的,說穿了,就真的有點像是 Windows 的『捷徑』一樣,不過, link 的功能要好的多呦! Link 又分為 hard link 與 symbolic link 兩種方式,分別來談一談: Hard Links: 剛剛說過,當系統要讀取某一個檔案的時候,就會先去讀 inode table ,然後再根據 inode 的資訊到 block area 去將資料取出來利用!而 hard link 就是直接再建立一個 inode 連結到檔案放置的 block 區塊。也就是說,進行 hard link 的時候,實際上,你的檔案內容不會改變,只是你在查詢的時候,利用原來的 inode 與後來的 inode 均可被指定到該檔案放置的地點,因此兩個檔案的內容會是一樣的!所以讀取任何一個 inode 的結果都是存取在同一個檔案的內容就是了。不過,這樣一來就有個問題啦,因為 inode 是會連結到 block 區域去的,而『目錄』本身僅消耗 inode 而已,那麼一來的話, hard link 不就不能 link 目錄啦?對的!沒錯! Hard link 有兩個最大的限制: 不能跨 filesystem ,因為不同的 filesystem 有不同的 inode table 嘛! 不能 link 目錄! Symbolic Links: 相對於 hard link , Symbolic link 可就好理解多了,基本上,他就是在建立一個獨立的檔案,而這個檔案會讓資料讀取指向他 link 的那個檔案內容!由於只是利用檔案來做為指向的動作,所以,當來源檔被刪除之後,symbolic link 的檔案會『開不了』,會一直說『無法開啟某檔案!』 所以,看樣子,似乎 hard link 比較安全,因為即使某一個 inode 被殺掉了,只要有任何一個 inode 存在,那麼該檔案就不會不見!不過,不幸的是,由於 Hard Link 的限制太多了,包括無法做『目錄』的 link ,所以在用途上面是比較受限的!反而是 Symbolic Link 的使用方向較廣喔!好了,說的天花亂墜,看您也差不多快要昏倒了!沒關系,實作一下就知道怎麼回事了! 特別留意,底下的案例中,我們是將系統的設定檔 copy 到 /root/test 底下進行測試用的,請不要在 /etc/ 底下做,未來我們的工作目錄都會在 /root/test 底下進行,這有個好處,是可以讓您清楚的知道,這是用來 test 用的啦! 語法: [root @test /root ]# ln [-s] [來源檔] [目的檔] 參數說明: -s :提供連結檔的連結!如果直接以 ln 不加任何參數的話,那麼就屬於 hard link 啰! 范例: [root @test /root]# mkdir test [root @test /root]# cd test [root @test /test]# cp /usr/bin/passwd . 0. 原本的資訊: [root @test /test]# ll -rw-r--r-- 1 root root 13476 Jun 26 11:31 passwd [root @test /test]# du -k <==查看該目錄下的占用硬碟空間 20 1. Hard Link 資訊: [root @test /test]# ln passwd passwd-hard [root @test /test]# ll total 32 -rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd -rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd-hard 注意看,上面那個數字變成 2 啰!這就是占用掉 inodes 啰! [root @test /test]# du -k 20 <==注意看,容量並沒有變大!因為是 link 檔案呀! 2. Symbolic Link 資訊: [root @test /test]# ln -s passwd passwd-soft; ll -rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd -rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd-hard lrwxrwxrwx 1 root root 6 Jun 26 11:37 passwd-sofe -> passwd 注意啰!該 Symbolic Link 的檔案是有容量的呦! 注意啰, passwd-soft 會指到另外一個檔案去,而且,最前面屬性顯示 l , 此外,他是一個獨立的檔案!先殺掉 passwd 後,我們分別 more 一下內容: 3. 用 more 來試試看是怎樣?! [root @test test]# rm passwd rm: remove regular file `passwd'? y [root @test test]# more passwd-hard ………(正常顯示) [root @test test]# more passwd-soft passwd-soft: No sUCh file or directory 說明: 要注意啰!如果不加任何參數的話,那麼就是 Hard Link 啰!如同上面的情況,增加了 hard link 之後,可以發現 link 那一欄屬性增加了!而如果這個時候砍掉 passwd 會發生什麼事情呢?呵呵! passwd-hard 的內容還是會跟原來 passwd 相同,但是 passwd-soft 就會找不到該檔案啦!就是這樣!了解了嗎?!還有,跟 cp 也不一樣呦!因為雖然 Hard Link 的檔案看起來是有容量的,但是基本上還是指向原來的檔案,所以啰,整體容量是沒有增大的啦! 而如果使用 -s 的參數時,就做成差不多是 Windows 底下的『捷徑』的意思(Symbolic Link,較常用!)不過,需要特別注意的是, Linux 的 link 與 Windows 的捷徑是不一樣的東西!舉個例子說,當你在 Windows 建立一個捷徑時,你可以在這個捷徑內修改任何資料,而你的原始資料並不會跟著變!不過,當你修改 Linux 下的 link 檔案時,則更動的其實是『原始檔』,呵呵,所以不論你的這個原始檔被連結到哪裡去,只要你修改了連結檔,呵呵!原始檔就跟著變啰!以上面為例,由於你使用 -s 的參數建立一個名為 passwd-soft 的檔案,則你修改 passwd-soft 時,其內容與 passwd 完全相同,並且,當你按下儲存之後,被改變的將是 passwd 這個檔案! 此外,如果你做了底下這樣的連結: ln –s /bin /root/bin 那麼如果你進入 /root/bin 這個目錄下,『請注意呦!該目錄其實是 /bin 這個目錄,因為你做了連結檔了!』所以,如果你進入 /root/bin 這個剛剛建立的連結目錄,並且將其中的資料殺掉時,嗯! /bin 裡面的資料就通通不見了!這點請千萬注意!並不是 /root 底下的資料都是 root 的!還需要注意一下該屬性才行! 基本上, Symbolic link 的用途比較廣,所以您要特別留意 symbolic link 的用法呢!未來一定還會常常用到的啦! 檔案與目錄權限: 由 Linux 檔案屬性 的內容我們可以知道一個檔案有若干個屬性,包括 ( r, w, x ) 等基本屬性,及是否為目錄 (d) 與檔案 (-) 或者是連結檔 (l) 等等的屬性!那麼要修改屬性的方法在前面也約略提過了,這裡再加強補充一下!此外,由於 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 說明: 還記得在『檔案屬性與系統』那一章吧!一個檔案或目錄至少有九個屬性,三個三個一組,共分為三組!而可以使用數字來當作變換屬性的參考依據!各屬性如下: r:4 w:2 x:1 舉個例子來說,當一個屬性為『-rwxr-xr--』時,那是幾分呢?!我們可以將他看成如下『-[rwx][r-x][r--]』三組,所以分數就變成了『[4+2+1][4+0+1][4+0+0]』共有『754』分啦!這樣會算嗎?!OK!測試一下,底下的分數為幾分: -r-xr-xr-x -rwxrw---- 如果你可以算出『555』與『760』,呵呵!那麼你就應該會算啰!所以,如果你要將 .bashrc 設定成所有人都可以讀取的話,就下達『 chmod 777 .bashrc 』吧!其中需要特別注意的是,通常我們都會允許個人網頁的設定!那麼由於個人網頁預設是記錄在/home/userID/public_html底下,偏偏 /home/userID 的屬性為『drwx------』根本就不允許任何人進入!所以,你最少要將你的目錄設定成『drwx--x--x』 才可以!當然也可以設定成『drwxr-xr-x』!不過不建議設定成『777』呦! 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 等等的資訊!並且,也同時提供了是否有使用動態函式庫的資訊!相當的好用! 本章習題練習 ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 ) 什麼是絕對路徑與相對路徑 答: 絕對路徑的寫法為由 / 開始寫,至於相對路徑則不由 / 開始寫! 如何更改一個目錄的名稱?例如由 /home/test 變為 /home/test2 答: mv /home/test /home/test2 PATH 這個環境變數的意義? 答: 這個是用來指定執行檔執行的時候,檔案搜尋的目錄路徑。 umask 有什麼用處與優點? 答: umask 可以拿掉一些屬性,因此,適當的定義 umask 有助於系統的安全,因為他可以用來建立預設的目錄或檔案的權限。 當一個使用者的 umask 分別為 033 與 044 他所建立的檔案與目錄的權限為何? 答: 在 umask 為 033 時,則預設是拿掉 group 與 other 的 w(2)x(1) 權限,因此權限就成為『檔案 –rw-r--r-- , 目錄 drwxr--r-- 』而當 umask 044 時,則拿掉 r 的屬性,因此就成為『檔案 -rw--w--w-,目錄 drwx-wx-wx』 什麼是 SUID ? 答: 當一個指令具有 SUID 的功能時,則當其他人使用這個指令時,該程序將具有指令擁有者的權限。 當我要查詢 /usr/bin/passwd 這個檔案的一些屬性時,可以使用什麼指令來查詢? 答: ls –al, file, lsattr 嘗試用 find 找出目前 linux 系統中,所有具有 SUID 的檔案有哪些? 答: find / -type f –perm –04000 -print