檔案處理
前面我們已經對 Linux 的檔案系統有一定的了解了﹐而已也會得運用基本的命令溜灠檔案目錄﹐以及建立﹑刪除﹑複製﹑等動作。這裡我們要介紹的﹐這針對檔案內容上的一些處理。下面﹐我簡單介紹一些我們常用到的命令﹕
- file
-
事實上﹐在 Linux 檔案系統上面的檔案有許多種類﹐有些是普通的文字檔﹐例如一些服務設定檔和開機 script﹔有些則是可執行的 binary 檔﹐那些都是經過編譯的﹐一般來說﹐我們看不到它的原始內容是什麼﹔另外還有一些設備檔﹐例如在 /dev 目錄下面的各種設備。
假如您不確定一個檔案的種類是什麼﹐那您最好用 file 這個命令來檢查一下﹐您不妨執行﹕
# file /etc
/etc: directory
# file /etc/rc.d/rc.local
/etc/rc.d/rc.local: Bourne shell script text executable
# file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (
uses shared libs), stripped
# file /dev/fd0
/dev/fd0: block special (2/0)您可以根據命令的結果來判斷這個檔案大約是什麼性質的﹐從而決定您要如何處理它。
- cat
-
當我們用 ls 來檢查一個檔案的時候﹐我們除了可以確定它的存在之外﹐還可以查詢到它的一些屬性﹐但檔案的內容是什麼﹐就不得而知了。如果您要看一個檔案的內容﹐可以用 cat 命令﹕
# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=rh71.siyongc.domain
GATEWAY=""
GATEWAYDEV=""
FORWARD_IPV4="yes"上面就是 /etc/sysconfig/network 這個檔案的內容﹐您最好先用 file 命令確定這個檔是個普通的文章檔。如果您要用 cat 來顯示一個 binary 檔的話﹐您會看到一大堆亂七八糟的字符。更為嚴重的﹐還可能將您的熒幕顯示弄得亂七八糟﹐比方說﹐不能顯示輸入的命令行﹐字行首尾相連﹐等等狀況。這時候﹐您閉著眼睛敲兩下 Enter﹐然後輸入 reset 然後再 Enter﹐就可以重整熒幕畫面了。要看 binary 檔﹐您得用 od 命令。
- more & less
-
用 cat 的確可以顯示一個檔案的的內容﹐但如果檔案很長﹐超過一個熒幕怎麼辦﹖
您可以按著 Shift 鍵﹐再配合 PageUP 和 PageDown 鍵來回翻閱熒幕。但畢竟有限和不方便﹐您最好用 more 命令看一個檔案﹐這樣﹐結果只顯示一個熒幕的內容﹐然後您按 Enter 鍵的話﹐則往下捲動一行﹔如果按空白鍵的話﹐則往下捲動一個熒幕。同時﹐會在最底下告訴您目前所顯示的百分比。當檔案顯示到最後一行的時候﹐命令就結束。
不過﹐用 more 命令卻不能往上翻頁哦﹐如果您想要在顯示檔案的時候能夠上下來回翻頁﹐那就用 less 命令吧。這樣﹐您按 Enter 或向下方向鍵﹐則往下捲動一行﹔按空白鍵或 PageDown 則往下捲動一個熒幕﹔按向上方向鍵則往上捲動一行﹔按 PageUp 則往上捲動一個熒幕。但是﹐用 less 命令就算檔案顯示最後一行了﹐也不會自動結束﹐您得按 Q 鍵才能離開。
- head & tail
-
好了﹐您用 more 或 less 可以逐頁翻開一個長檔案﹐但有時候您只想看檔案的前面數行﹐而不管後面的內容是什麼﹐那您可以用 head 這個命令。預設上﹐head 只會顯示一個檔案的前 10 行﹐但您可以用
-number 來指定顯示的行數﹕
head -20 /var/log/boot.log 那就可以看到這個檔案的前 20 行內容。但反過來﹐您只想看這個檔案的最後 20 行呢﹖用 tail 命令就是了﹕
tail -20 /var/log/boot.log 和 head 一樣﹐如果您不指定顯示行數﹐那麼 tail 也只顯示檔案的最後 10 行內容。不過﹐tail 還有一個很好用的參數﹐您可以用 +number 來顯示第幾行起至檔案結尾的內容﹕
tail +2 /var/log/boot.log 那麼﹐除了第一行之外﹐第 2 行後面的內容都會顯示出來。其實﹐可用的選項很多啦﹐請您自己慢慢發掘囉。
- tac
-
仔細點看﹐這個命令 cat 是調過來寫的﹐那麼它執行結果是否也調過來呢﹖猜對了﹗用 cat 命令可以顯示一個檔案內容﹐而且按每一行的排列順序的先後顯示。而這個 tac 呢﹐也是顯示檔案內容﹐但每一行的排列順序卻是調過來的。也就是﹐最後一行最先顯示﹐最先一行最後顯示。就醬子。
- sort
-
這個命令除了可以顯示檔案內容之外﹐還可以將每一行句子按您指定的要求進行重新排序。在預設的情況下﹐它是以字母的順序來排序的﹕先是符號﹑然後是數字﹑最後是字母(沒分大小寫)﹐如果您使用
-n 參數﹐則按‘數值大小’來排序﹕符號和字母(不按大小寫)將被認為‘無值’﹐會先顯示﹐然後數值越大(正整數)﹐則越排在後面。如果您加上
-r 參數﹐那顯示順序就顛倒過來。
這個命令用來整理一些數據非常好用﹐日後寫 script 的時候應該會常用到的﹐不妨熟悉熟悉。
- uniq
-
如果一個檔案中有接連兩行或多行的句子是相同的﹐那麼 uniq 命令只會顯示一行而已。小心哦﹐預設情況下﹐如果相同的句子不是連續的﹐則各行還是會顯示啦。如果您加上一個 -d 參數﹐那麼﹐結果和預設一樣﹐但沒有被重複到的句子就不顯示了。
這命令常會和 sort 命令一起使用﹐而將重複句子過濾掉(或找出來)。
- cut
-
這個命令通常用來處理以‘列表’方式排列的句子﹕您可以指定不同的分隔符號來將句子分成數‘列’﹐然後顯示指定的‘列’。
不如舉例子來說明好了。您如果檢查 /etc/passwd 這個檔案的內容﹐每行格式如下﹕﹕
kenny:x:500:500:Kenny Chen:/home/kenny:/bin/bash 這是我們的系統帳號設定檔﹐這個檔裡面的每一行都是用 6 個“﹕”分成 7 列﹐假如我們只想顯示第一列(user ID)和第 7 列(user shell)﹐那麼我們可以用 cut 命令來做到﹕
cut -d ":" -f 1,7 /etc/passwd 這裡﹐我用 -d ":" 來指定用來做分隔的符號是“﹕”﹐然後用 -f 指定只顯示第 1 和第 7 列。假如所有句子的字母長度都一致的話﹐我們甚至可以唷個 -c 來指定顯示第幾個字母到第幾個字母﹐如﹕-c1-7 就只顯示第 1 個到第 7 個字母之間的內容。
這個命令常會和其它命令一起使用﹐以過濾命令結果﹐找到指定所需的字串﹐靈活運用﹐可有非常豐富的變化﹐請多花些時間在上面。
- tr
-
會用這個命令的人相信不是很多﹐它可以進行一對一的字串轉換﹐也可以將連續的字母為單一字母。
再拿前面的 /etc/passwd 檔來說明好了﹐如果我要將句子中用來做分隔符號的“﹕”換成空白鍵的話﹐那我可以如此輸入﹕
cat /etc/passwd | tr -t ':' ' ' 這裡我們用一個“|”將兩第 cat 的命令結果輸入到 tr 命令去(這個功能我們後面再談)﹐然後用 -t ':' ' ' (注意﹕最後兩個 ' ' 之間是一個空白鍵哦﹗)﹐那麼原來的 ﹕就換成空白鍵了。嗯﹐您也可以用 -s ' ' ' ' (注意﹐前後兩個 ' ' 之間是一個空白鍵)﹐可以將連續的空白鍵壓縮為單一的空白鍵。
cat /path/to/old_file | tr -d '\r' > /path/to/new_file 這樣﹐ old_file 的內容 就會寫到 new_file 裡面去﹐但 ^M 就給拿掉了﹗(除了 tr﹐您也可以用 col 命令來過濾這個 ^M 及其它特殊標籤)
- wc
-
哦﹐這可不是公共廁所的縮寫哦﹐它是 word count 的意思啦~~ ^_^
只要您用這個命令來檢查一個檔案﹐那麼這個檔案的行數(line)﹑詞數(word)﹑以及字數(charactor)﹐都會幫您總結出來。當然﹐您也可以分別用 -l ﹑ -w ﹑ -c 這幾個參數單獨顯示行數﹑詞數﹑和字數。您還能用它來檢查一個檔案是否空的。
假如您是個編輯﹐要計算稿費可非常好用哦~~~
- find & locate
-
當我們不知道一個檔案的準確路徑在哪裡﹐或甚至是您只知道檔案名字的部份字串而已﹐那您可以用 find 這個命令來搜索整個檔案系統﹕
find / -name smb.conf 這裡﹐我們打算從 / 開始尋找檔案。找什麼檔案呢﹖-name 這個參數告訴我們這裡要找的檔案名字﹕ smb.conf 。除了 name 之外﹐還可以是 date﹑size﹑owner﹑type﹑等不同的選項。
不過﹐每次執行 find 這個命令﹐如果您搜索的範圍很大﹐那麼可能需要一些時間才能執行完畢。有沒有更快的辦法呢﹖有的﹐就是用 locate 這個命令﹕
locate smb.conf 這命令同樣也能幫您找出檔案的位置﹐而且非常快。不過﹐事實上﹐這個命令並不是真的搜尋當前的檔案系統﹐而是檢索一個檔案系統的資料庫。這個資料庫需要執行 updatedb 這個命令才會更新。在這個資料庫上一次更新之後才建立的檔案﹐用 locate 這個命令就找不到了。執行這個 updatedb 命令﹐和用 find 找 / 目錄一樣久﹐不過﹐系統會透過排程程式來定期更新這個資料庫的。
- grep
-
我們用 locate 和 find 可以找出檔案的名字﹐但如果我要找檔案裡面的內容又怎麼做呢﹖就是用 grep 這個命令啦。
如果您只知道某一個檔案的內容其中一個關鍵字﹐ 而忘記了檔案的名稱﹐那麼 find 和 locate 都沒辦法幫助您﹐但是 grep 就成為您的救星了。比方﹐您這樣執行﹕
grep kenny /etc/* 那麼所有在 /etc/目錄下含有 kenny 這個字串的檔案﹐其中的句子都會被顯示出來﹐而句子前面會加上檔案的名稱﹐這樣﹐您再進行過濾就找到您要的檔案了。如果您加上 -r 參數﹐那麼搜索的範圍就不局限在 /etc/ 目錄下﹐而是連同其下的所有子目錄都會搜索。
如果您只想找出某個檔案中的特地內容﹐比方說﹐我現在要找出 kenny 這個帳號的設定﹐那我可以這樣輸入﹕
grep kenny /etc/passwd 這樣﹐所有包含 kenny 這個字串的句子都會顯示出來﹐當然﹐如果關於 kenny 這個帳號的內容是分數行來書寫的﹐而其中只有一行有 kenny 這個字串﹐那您所找到的資料就不完整了。幸好﹐passwd 這個檔﹐所有帳號的資料都寫在單一句子裡面。
這個命令也經常和其它命令一起使用﹐以過濾出您真正需要的內容﹐也請多加練習。
文書編輯 --- vi
要管理好Linux系統﹐少不了要對設定檔案進行編輯﹐如果您用慣了Microsoft Word 或 Notepad 這些文字編輯器的話﹐除了 X window 裡面的編輯程式(如 xemacs )用起來尚可應付外﹐在 Linux 的文字模式下﹐會覺得檔案編輯程式都沒有 Windows 程式那麼方便。事實上﹐ Linux 下面也有好多種文書編輯器﹐例如﹕ed﹑vi﹑pico﹑joe﹑emacs﹑等﹐只是個人的使用習慣而已。
在 Linux 上面最常用到的﹐也是許多 Linux 套件預設的文字編輯器﹐就是歷時悠久和功能強大的 vi 文書編輯器了。如果您能將它的功能發揮出來﹐而且用得習慣﹐您會發現它的本事比起 Windows 裡面的文字編輯器強得多呢﹗嗯﹐下面我要介紹的 vi 功能﹐只是最基本最基本的﹐目的是讓您能完成一個檔案的編輯就好了﹐至於其它的特異功能﹐就留給您自己發揮了。
先讓我們複製一個檔然後進行編輯吧﹕
cp /etc/lilo.conf test.vi vi test.vi |
當你進入後﹐請試試打些文字上去﹖嗯~~ 您可能在一輪亂按亂按之後才發現可以輸入文字﹐不過﹐您卻可能不知道如何離開﹗開始會覺得非常恐懼的﹐當初我打開 vi 之後﹐真的不知道怎麼離開呢﹗
不過﹐只要您知道了 vi 的基本命令﹐其實用起來還算得心應手的﹐只是需要慢慢發現其功能而已。
先讓我們認識 vi 的主要模式吧﹕
- 一就是編輯模式﹐您一進入 vi 就是這個模式。您可以在命令模式執行諸如﹕插入﹑刪除﹑替換﹑複製﹑粘貼﹑跳行﹑查找﹑等動作。
- 而另一個是插入模式﹐就是您要打的字﹐或您要輸入的內容﹔
- 另外是命令模式﹐通常以“﹕”開始﹐然後輸入命令。例如﹕顯示行號﹑改變跳格(tab)大小﹑存檔﹑離開﹑等等。
然後﹐您要記住 vi 的救命鍵﹕Esc。如果您亂按亂按之後迷失了方向﹐可以連續地多按幾下 Esc 鍵﹐您就會回到 vi 的編輯模式。下面先讓我們按幾下 Esc 吧﹐或許您會聽到喇叭會發出 BB 聲﹐但這是沒關係的﹐請放心好了。在 vi 裡面﹐能聽到這個聲音反而心裡比較定呢~~ ^_^
tips﹕在 vi 的編輯模式中﹐是否能使用方向鍵來移動游標﹐得取決於您使用的 terminal 設定是否和 server 的一致。有時候﹐尤其在 telnet 中使用 vi﹐您會發現方向鍵會失靈﹐系統越是不同﹐越是容易發生這樣的情況。vi 為了讓使用者無須修改 terminal 設定而在任何平臺上面使用﹐您可以在編輯模式中用 h﹑j﹑k﹑l 這四個鍵取代 左﹑下﹑上﹑右 這四個方向鍵。建議您不妨習慣一下。
接著﹐輸入 5G﹐哈您會跑到第 5 行去。然後﹐按‘ i(小寫) ’鍵﹐您會看到螢幕下端會出現“-- INSERT --”的提示﹐您就知道您現在是在插入模式中了﹐現在請你隨便寫幾行字(按 Enter 就可以斷行)。
然後再按 Esc 鍵﹐這時您會發現 -- INSERT -- 消失了﹐那您就回到編輯模式了。
按方向鍵往上跳一行﹐然後將游標移到中間位置﹐按幾下‘ x ’鍵﹐您會發現在游標後面的字會被刪除掉﹔如果按‘X(大寫)’﹐你會發現在游標前面的字會消失掉。他們就像 Del 和 Backspace 鍵一樣。
現在請您按‘ u ’鍵﹐您會看見剛才刪除的字又回來了﹗原來這是 undo 的意思﹐那麼 redo 呢﹖按 Ctrl + r 看看﹖
接著﹐請按兩下‘ y ’鍵﹐然後按‘ p ’鍵﹐您會看到游標所在的那行會被複製出來了。這裡 y 是 yank (複製)的意思﹐而 p 則是 past (貼上)的意思。
現在請將游標移到第一行﹐然後按‘2’接著按兩次‘y’﹐然後再按‘p’你會發現會在游標所在的行和下一行被複製了﹐並且貼在游標的下一行裡(按大寫 P 則貼在游標的上一行裡面)。這裡的 2yy 是複製游標所在算起的兩行﹐如果將數字改成 3 則複製三行﹐如此類推。
好了﹐現在請多按幾下 p 產生多行文字﹐然後輸入﹕
:set nu |
這樣 vi 會列出各行的行數。這裡的“﹕”是一個命令提示符(別忘了您現在是在命令模式哦~~)﹐‘ set ’是用來設定 vi 環境的﹐‘nu’是 number 的意思。如果您要取消行號﹐可以輸入﹕‘:set nonu’。
現在﹐讓我們保留行號顯示模式﹐再請您輸入兩個小寫‘ gg ’移到第一行(如果一個大寫‘ G ’則跳到最後一行)﹐然後按‘3’接著按兩次‘ d ’鍵﹐您會發現頂端的三行會被刪除掉了。然後您就知道 dd 就是 delete 的意思了 ~~~ ^_^
現在請您移動游標到任意一行的中間部份﹐然後按‘ i ’進入插入模式﹐再按 Enter 將後面的文字打斷(break)到下一行。請問﹕您知道除了按‘u’來 undo 之外﹐怎麼將之重新接為一行呢﹖哈哈﹐無論您用 x ﹑或 X ﹑還是 Backspace ﹑或 del 鍵﹐都不作用哦~~~ 不過﹐如果您按 Esc 之後﹐再按‘ J(大寫)’就可以將游標所在的下一行接(Join)上來。
好了﹐如果您已經滿意您的修改了﹐那麼按 Esc 退回命令模式﹐然後輸入﹕
:wq |
這裡的‘ w ’是 write (寫入檔案)的意思﹐‘ q ’是 quit (退出 vi )的意思。因為您在 vi 所做的全部修改﹐其實只在一個臨時檔進行而已﹐並不真正影響到原來的內容﹐直到您按 w 為止﹐內容才會寫回原檔案中。如果我們修改了一個當案﹐但後來又後悔了﹐覺得還是不做修改為好。換句話說﹐就是您不想更動原有內容而退出 vi 的話﹐可以單純按‘q’離開嗎﹖答案是否定的﹐這時候您就要在 q 後面加上一個‘ ﹗ ’﹐這是強制執行的意思﹐這樣您就可以強行離開 vi 了(如果要強制寫入一個 read only 檔﹐就用 w! 即可﹐當然﹐您是 root 才行)。
tips﹕有時候﹐您的 vi 意外的中斷了﹐例如 telnet 的連續掛了。下次您再用 vi 來修改這個檔﹐您會遇到一個警告﹐您可以仔細看看它的說明。如果您要繼續上一次修改過但沒來得及存檔的內容進行編輯﹐那就輸入 :revover ( 否則按 Enter 繼續)﹐完成之後再用 :wq 退出﹐然後您執行 ls -a ﹐您會發現有一個以 . 開頭﹑以 swp 結尾的隱藏檔案﹐只要您將這個檔砍掉﹐那麼下次再編輯這個檔就不會碰到這個警告了。
除了前面接受的基本命令之外﹐還有許多技巧我們可以運用的﹕
- .
-
就是一個小點﹐這是編輯模式中的神奇小點﹕當您要連續重複執行一個命令﹐您只需輸入命令一次﹐然後按
. 就可以重複上一個命令。非常方便﹗
- w & s
-
w 代表一個詞(word)。當您在編輯模式裡面(多按 Esc)﹐輸入 dw﹐會將當前的這個詞自游標所在位置其的部份刪除掉﹐輸入 d2w 會將游標所在位置起的兩個詞刪除掉﹔輸入 y3w﹐會將游標起的三個詞複製﹐供 p 進行貼上。如果將 w 換成 s﹐則以句子為單位。
- c & C
-
兩者都是變更(change) 的意思。如果您要變更一個詞﹐您可以先輸入 dw 然後按 i 進行輸入﹔也可以直接按 cw 進行輸入。如果您輸入 c7w﹐那您輸入的內容就會變更掉後面的 7 個詞(剛好一個 IP 位址)﹐除非碰到 Esc﹐否則修改會一直保持在插入模式。如果您輸入大寫 C﹐那要變更的部份就會是從游標所在位置到句子末端。
- r & R
-
兩者都是替換(replace) 的意思。如果輸入 r ﹐那麼您只換掉游標所在的一個字母﹔如果您輸入 R ﹐那麼您連續的輸入﹐就連續的替換游標起往後的字母﹐直到您按 Esc 為止。
- 0 & $
-
在編輯模式中﹐按 0 (數字)鍵游標會跳到句子前端﹐如按 $ 則跳到句子末端﹔如果輸入 d0 會從游標到句子前端的文字刪除掉﹐如果輸入 d& 則會將游標到句子末端的文字刪除掉﹔如果輸入 y0 會將游標到句子前端的文字進行複製﹐如果輸入 yd 則是複製游標到句子末端的文字。
- gg & G
-
在編輯模式中﹐輸入 gg 會跳到檔案第一行﹐輸入 G 會跳到檔案最後一行﹔如果輸入 dgg 會將游標所在這行到第一行砍掉﹐如果輸入 dG 則將游標所在這行到最後一行句子刪除掉﹔如果輸入 ygg 則是複製游標所在的句子到第一行句子的內容﹐輸入 yG 則複製游標所在的句子行到最後一行句子的內容。
- / & ﹖
-
在編輯模式中﹐要找出檔案裡面的某些字串﹐例如 kenny ﹐您可以輸入 /kenny ﹐然後就會在游標的文章往文章末尾部份搜索這個字串。找到第一個之後﹐再按
n 鍵﹐則繼續查找下一個﹐如果遇到最後一行﹐則會重第一行繼續。如果是大寫 N﹐則返回上一次找到的字串。
相反的﹐如果您輸入 ?kenny﹐也是進行字串查找﹐但方向和 / 相反﹕從游標往第一行句子那個方向進行查找﹐到了頂端然後繞到最後一行繼續。
- Ctrl+F & Ctrl+B
-
在編輯模式中﹐按著 Ctrl 鍵和 F 鍵﹐會往前面翻一頁﹔按 Ctrl 和 B ﹐則往後翻一頁。
這裡略略介紹的﹐只是 vi 其中很少一部分功能﹐其他的要您自己去發現了(尤其當您掌握了 Regular Expression 之後)。不過﹐光靠以上這幾個基本命令(組合)﹐相信﹐您也可以“行走江湖”了。只是﹐效率可能沒 vi 高手那麼快而已(反正您也比較少用 vi 來寫文章吧﹖)。
另外﹐我們還可以使用 vim 來代替 vi 進行文書編輯﹐vim 是 vi 的增強版。如果您有興趣深入的學習一下 vim 或 vi (操作上基本一樣)﹐請看 大家來學 vim 這篇文章。
帳號管理
我們在安裝的時候最少會建立兩個帳號﹕一個是 root﹐另一個則是您自己用來登錄的普通帳號。如果您有新的使用者加入﹐你知道怎麼增加帳號嗎﹖如果不會﹐請先看看這個檔案內容﹕
more /etc/group |
您會看到群組檔案 /etc/group/ 下面盡是些諸如﹕“users::100: ”這樣的內容。這裡告訴我們兩個信息﹕一個是‘group name’﹐另一個是‘group ID’﹐兩者都必須是唯一的。如果您用 vi 對這個檔進行編輯﹐您可以直接創建‘group name’和‘group ID’﹐格式可參考其他句子。不過﹐您也可以使用 groupadd 這個程式來增加群組﹐不過要先知道 /etc/group 裡面有哪些 name 和 ID 已經被使用了﹐如果被使用了﹐我們就要使用其他名字和數字了﹕
groupadd -g 1001 group1 |
通常﹐我們正常建立的群組 ID 都由 500 開始﹐小於此數值的都是系統帳號(以 Redhat 為例)﹐許多程式會根據一定 ID 的範圍來決定行為特性或安全等級。上面這個命令﹐我們為 /etc/group 增加了一個 ID 為 1001﹑名稱為 group1 的群組。
接下來﹐讓我們看看第二個檔案﹕
more /etc/passwd |
我們看到第一行為﹕“root:x:0:0:root:/root:/bin/bash”﹐這個就是密碼檔裡面的使用者 root 之設定啦。這個檔案裡面﹐每一個帳號都獨佔一行設定﹐格式相同﹐分別用 ‘﹕’來分隔﹕
- 第一個詞是使用者名稱。
- 然後是使用者密碼﹐它會經過加密﹑並存放到另外一個叫 shadow 的檔案裡面﹐所以您只能看到“x”(如果被修改成 “ * ”符號﹐就表是沒有分配密碼﹐但該帳號就不能用來登錄了)。
- 然後是 user ID (UID)﹐如果是 0 的話﹐那就是 super user (root) 的帳號。
- 然後是 group ID (GID)﹐root 群組的號碼是 0 。
- 接下來的是一些使用者資料(可以省略)﹐例如使用者的姓名。
- 再下來是使用者的家目錄(home directory)所在路徑。
- 最後﹐是登錄時候要使用的 shell﹐預設是 /bin/bash。如果您不想使用者登錄進系統﹐但可以為它們提供某些服務﹐如 FTP 和 MAIL﹐那您可以將它們的 shell 修改為 /bin/ture﹑或 /bin/false﹑或 /dev/null。
和 /etc/group 一樣﹐如果您知道怎麼設定﹐您可以直接編輯這個檔案﹐來增加和指定或修改使用者帳號。然後執行 pwconv 程式更新 /etc/shadow 檔案﹐然後要為使用者建立家目錄和信箱﹐以及相關屬性。這比較麻煩﹐所以﹐我們也可以使用‘useradd’這個程式來增加使用者。和增加群組一樣﹐我們先要找出哪些user name 和 ID 可以使用﹕
useradd -u 1001 -g 1001 user1 |
這樣我們就可以建立起一個名叫‘user1’的使用者帳號了﹐他的 user ID 為 1001﹐屬於‘group1’這個群組(因為 -g 10001 所指定的 group ID 為1001﹐group1是也﹐它必須已經存在 /etc/group 裡面)。
剛才使用的命令﹐可以讓您具備更好的指定性﹐但如果您不理會 group 和 ID 等因素﹐只想單純建立一個使用者帳號的話﹐您可以使用﹕
useradd user1 |
不帶任何參數就可以了﹐這樣﹐goup 和 ID 都會被自動建立起來(group 名稱會和使用者名稱一樣)﹐至於用哪個號碼﹐則由系統自己決定了。
tips﹕使用 useradd 來建立使用者的話﹐其家目錄和相關資料也會被建立起來﹐也就省去了手工設定的麻煩了。
究竟使用者家目錄的內容是怎麼定的呢﹖只要您以 root 的身份變更 /etc/skel 目錄下面的內容﹐那麼以後新建的帳號﹐會跟著改變。
不過﹐要該帳號真正能夠被使用的話﹐這時候﹐您還得在此為使用者指定一個密碼﹕
passwd user1 |
您需要輸入密碼兩次才能完成這個動作﹐而且﹐只有系統管理員才可以指定別人的密碼。以後﹐當使用者成功登錄之後﹐他可以使用‘passwd’不帶任何參數﹐來修改自己的密碼。再次提醒您﹕密碼不要設得太簡單﹗如果使用者自己執行 passwd 來修改密碼的話﹐系統會檢查您的密碼是否合格﹐否則會不接受﹐而要您輸入合格的密碼為止﹔如果您用 root 來設密碼的話﹐不合格的密碼只會獲得警告信息而已﹐密碼還是可以使用。
那麼﹐我們又如何刪除帳號呢﹖您可以使用﹕
userdel -r user1 |
加上 -r 參數的話﹐帳號和家目都會錄清除掉。但如果該使用者使用過郵件信箱的話﹐我們就得手工的將其信箱移除了。
rm -rf /var/spool/mail/user1 |
還有﹐最好用 find / -user user1 找找這個使用者還有哪些檔案與之相關﹐然後一一處理。您可以參考“shell 與 shell script”中的最後一個範例﹐幫您完成這項工作。
tips﹕如果我們想暫時停用某帳號﹐我們可以直接修改 /etc/passwd 檔﹐然後在該帳號句子前面加上一個“#”符號就可以了(注意﹕在 Linux 裡面的檔案﹐我們通常使用‘#’將句子標記起來﹐這樣﹐系統只會把該行視作‘註解’﹐而不會執行其設定內容)。往往﹐當一個使用者要不再使用系統(如離職或畢業)﹐我們最常採用的辦法是暫時將帳號停用﹐直到過了一段日子﹐確定該帳號再沒問題了﹐才真正刪除。
接下來﹐讓我們看看第三個檔﹕
more /etc/shadow |
這個檔案的格式和 passwd 有點類似﹐但其中的設定意思卻很不一樣﹕
- 使用者帳號名稱﹐這點沒什麼分別。
- 使用者密碼內容。您在這裡或許看到兩種密碼﹕“ !! ” 和一長串雜亂無章的字符。如果是兩個嘆號的話﹐表示這個帳號目前沒有密碼﹐也不能用來登錄﹐通常為一些系統帳號﹔如果是一長串字符﹐那是經過加密之後的密碼內容。還記得我們在安裝系統的時候﹐其中有個 Shadow Password 和 MD5 Password 的選項嗎﹖那就是了﹐這裡的密碼是經過 MD5 單向加密演算法處理過的﹐理論上是無法進行逆向破解的。在任何時候﹐您都不能直接在這個檔案上修改這裡的密碼。
- 上次密碼修改的時間。這裡的單位是從 1970 年 1 月 1 號到最後修改日期的天數。
- 密碼自上次修改後﹐要隔多少天才能再次修改。通常為 0 ﹐也就是沒有這個限制。
- 密碼自上次修改後﹐要隔多少天必須再次修改。預設為 99999 天(還是無限﹖我不敢確定﹐也沒深入查證)。
- 如果密碼有期限限制(參考倒數第 2 項設定)﹐要在過期前多少天向使用者送出警告信息。預設為 7 天。
- 如果前設定為密碼必須要修改﹐而且到達規定期限之後仍未修改﹐要等多少天才自動關閉帳號。
- 從 1970 年 1 月 1 日算起﹐到多少天後該帳號就會過期(忽略密碼是否仍有效)。
- 系統保留﹐未用。
請您仔細比較 /etc/group﹑/etc/passwd﹑和 /etc/shadow 這三個檔的權限﹐您會發現前兩個檔的 group 和 others 都有 read 的權限﹐而 shadow 則只有 root 才能讀取。您最好不要修改這些預設權限﹐因為 group 和 passwd 檔常被許多程式讀取﹐以進行權限設定的依據﹐如果您將 others 的 r 取消了﹐那會造成系統大混亂。shadow 檔之所以會被使用﹐也是因為 passwd 這檔能夠被任何人讀取﹐所以將其中最重要的密碼資訊轉移出來﹐然後只能讓 root 讀取﹐從而提高系統的安全性能。
tips﹕您或許會問﹕既然密碼是經過 MD5 單向加密的﹐別人沒辦法進行逆向破解﹐而且﹐linux 系統也會用一個所謂的 salt 作為加密的鍵值﹐就算兩位用戶使用相同的密碼﹐經過編碼之後的內容也不一樣﹐那麼﹐有必要從 passwd 移出來嗎﹖
呵﹐您如果有這樣的相法﹐可能是太低估了破解者的能力了。沒錯﹐破解者沒辦法根據您編碼之後的內容進行逆向演算﹐但它可以用同樣的辦法來進行加密﹐然後比較加密後的內容﹐如果得出來是一樣的﹐那就知道原來的密碼是什麼了。雖然系統使用了 salt 來做為加密鍵值﹐但比畢竟範圍有限﹐破解者可以用不同的密碼和不同的 salt 組合進行加密比對﹐如果電腦運算速度夠快﹐要找出相同的比對不難。如果使用者的密碼使用字典單詞﹐或是設定不夠嚴謹﹐更是容易破解。
當我們了解了相關帳號檔安的格式之後﹐雖然我們可以使用任何的文書編輯器進行編輯﹐但是我們不建議您這樣做﹐而是使用一些命令來幫忙管理。例如 usermod﹑groupmod 和 chage 這三個命令(請仔細的 man 一下﹐看看其中的說明)。如果您錯誤的使用了一個文書編輯器﹐而導致一些特殊字符的變更﹐將會導致設定值產生難以預期且非常難以偵錯的變化(萬不得以一定要編輯的話﹐建議用 vi 來進行比較保險)。比方說﹐您要改變一個 user 的 shell 和 group﹐可以這樣執行﹕
usermod -s /bin/true -G group1,group2 user |
這樣會將 user 這個賬號的 shell 換成 /bin/true 同時加入 group1 和 group2 兩個群組中。不過﹐在使用 usermod -G 來改變 user 群組的時候﹐要注意﹕ -G 後面所列的群組名稱(用逗號分隔)是 user 要加入的‘所有的額外群組’﹐假如沒出現在名單中﹐那麼除了 initial group 之外﹐其他所有不在列的群組都會退出。所以在使用 -G 的時候﹐要將 user 的所有群組指定清楚﹐請小心﹕-G 並不是單純的‘新加入’一個群組 (我也覺得這樣的設計不合理﹐不過﹐請跟 usemod 的作者提出建議) 。然而﹐您卻可以輕易的透過 gpasswd 來管理群組﹕
gpasswd -d user group2 gpasswd -a user group3 |
這樣就會將 user 從 group2 移除﹐然後加入到 group3 中。
事實上﹐我們在 disable 一個帳號﹐如果不手工的編輯密碼檔而使用命令的話﹐您只要將其‘帳號期限’設定起來就好﹐比方說﹕
usermod -e 2002-01-01 user 或﹕ chage -E 2002-01-01 user |
上面兩個命令的結果都是一樣的﹕user 這個帳號在 2002 年 1 月 1 號就會過期。只要您將日期修改為昨天或更早的日期﹐那麼帳號馬上就不能登入了(已經登入的仍可繼續)。假如您想讓帳號重新啟用﹐而不設定期限的話﹐這樣修改回來就好﹕
usermod -e "" user |
不過﹐我在實作的時候﹐卻發現不能用 chage -E "" user 的方法來炮製﹐這也是一個值得留意的地方。
我們平時都用普通帳號登錄系統(理由很多﹐您日後就慢慢體會)﹐如果碰到一定要使用 root 的權力的時候﹐您可以輸入如下命令﹕
su - |
(su 不帶‘-’的話﹐root 的一些環境設定可能不會生效﹐例如程式路徑等)﹐然後輸入 root 的密碼﹐您就可以轉變成 root 的身份了。當完成了系統設置之後﹐您可以輸入‘exit’跳離 root 的身份﹐回到自己的身份。這樣做完全是基於安全考量﹐因為 root 的權限最大了﹐他可以對系統做任何動作﹐如果 root 不小心破壞了系統設定或刪除了某些重要設定檔案﹐或修改了檔案的權限﹐除非您有備份﹐否則是永遠也救不回來的了。尤其是當您的系統被值入一個後門程式之後﹐使用 root 更是危險萬分﹐因為您一旦誤觸動機關﹐那麼該程式就是以 root 的身份執行﹗所以 ﹐有必要再一次提醒﹕除非必要﹐就不要使用 root 來工作。
tips﹕不過﹐有時候在一個多管理員的系統上﹐您或許不想將 root 的密碼到處公佈﹐或是不想每次(定期)改變 root 密碼之後要逐個轉告﹐那您可以使用 sudo 這個工具。
RedHat7.1 上面本身就裝好 sudo 套件了﹐您只需修 /etc/sudoers 這個檔。假如您要使用者完全獲得和 root 一樣的權力﹐那就將 root 那行複製一行﹐然後將 root 換成使用帳號名稱就是了﹕
user1 ALL=(ALL) ALL |
具體更細緻的設定﹐請您自行參考 sudo 的技術文件了。
如果您已經加在這個 list 中﹐然後要臨時以 root 身份執行相關指令﹐那就在命令前面加上 "sudo " ﹐再輸入您自己的密碼就可以了﹐例如﹕
sudo tail -20 /var/log/messages |
如果要完全變成 root 的身份﹐輸入 "sudo su -" 然後是自己的密碼就好了。這樣﹐root 的密碼更好保護了﹐當然﹐在 sudoers 裡面的使用者﹐就要更小心保護他們自己的密碼了。
套件管理 --- RPM
以前要安裝 Linux 程式﹐有一大堆的 make 要設定﹐如果要移除一個程式﹐更是千頭萬緒﹐耦斷絲連﹐都不知道到底有沒有清除乾淨。不過﹐自從有了 RPM(Redhat Package Manager)之後﹐事情就變得容易得多了。
一般我們從 internet 上面下載的套件﹐通常有兩種格式﹕tarball 和 rpm。
我們先看看 tarball 形式好了﹐這些檔案通常都是以 .tar.gz 或 .tgz 結尾(如果沒有壓縮的話﹐則以 tar 結尾)。我們要先對這些檔案進行解壓才能夠進行安裝﹕
tar zxvf xyz.1.2-3.tar.gz |
這樣就會將檔案解壓﹐並產生一個安裝目錄(通常是套件名稱﹐如 xyz )。然後您進入這個目錄﹐第一個步驟﹐就是看看 README 和 INSTALL 檔案﹐(我發現許多入門的朋友都不怎麼喜歡看這兩個檔﹐但事實上﹐您的套件安裝經驗越多﹐越會從這兩個檔開始)。如果您找不到這兩個檔﹐那就看看是否有一個 doc 的目錄﹐或許它們會在那裡。您大概花上數分鐘了解安裝要求和過程﹐說真的﹐這或許會幫您省掉好幾個小時的冤枉時間。
有些程式的安裝還是蠻複雜的﹐但一般來說﹐安裝步驟不外如下﹕
- 執行 ./configure 。這通常是跑一個 script﹐按您的系統實際環境制定出系統所需的安裝設定檔。您應該會從 README 或 INSTALL 上找到相關的選項。
- 然後執行 make。這動作是將程式的執行檔﹑和相關資料檔產生出來。不過﹐這些檔僅產生在這個目錄之下而已。
- 最後﹐要執行 make install 將剛纔 make 產生出來的檔﹐安裝到系統正確的位置上﹐然後您才能使用。
一般來說﹐用 tarball 來安裝都不會有什麼問題。不過﹐如果是反安裝的話﹐恐怕就要花上一翻功夫了。
使用 rpm 的話﹐就簡單的多了。
如果當初您安裝 Redhat 的時候﹐不是選擇 everything﹐而現在又想增加一些程式﹐或是您從 internet 上面下載了最新的 rpm 版本﹐那麼﹐您就可以體驗一下 rmp 的方便了。讓我們先將 cdrom 掛載好(別說您不會哦﹗否則要打屁屁了~~~)﹐然後看看 /mnt/cdrom/RedHat/RMPS 裡面有什麼東東。如果您使用 ls 命令的話﹐可以配合‘*’來找到您想找的檔案﹔假如一個屏幕都顯示不完列表結果﹐您可以使用﹕
ls /mnt/cdrom/RedHat/RPMS/* | more |
這樣可以逐頁觀看﹐也可以按 shift + Ppage Up / Page Down 來回查看﹐或是配合 grep 找出您要的套件。然後您可以用 -qpi 參數來看看套件的相關資訊﹐例如﹕程式名稱﹑版本號碼﹑程式大小﹑等等。
rpm -qpi /mnt/cdrom/RPMS/zyx.1.2-3.i386.rpm |
仔細看看命令的輸出結果﹐其中或許有些資訊您是有所興趣的。
tips﹕通常﹐您會看到 rpm 檔案前面都有一個 i386 或 i586 / i686 之類的文字。這是告訴您關於這個 rpm 所適用的硬體平臺。i386 的 i 是指 Intel﹐凡是與 Intel 兼容的 CPU 都可以使用。其後的 386 指 CPU 型號﹐一般而言﹐586 和 686 都能兼容 386﹐換句話說﹐您可以在Pentium 或 Pentium-2 的機器上﹐安裝 i386 的 rpm﹐但您卻不能在 386 的機器上安裝 i686 的 rpm。
有些 rpm 或許是以 noarch 命名的﹐這些 RPM 是沒有平臺局限的﹐也就是說﹐它可以裝在任何 CPU 之上。
當您找到您欲安裝的 rpm 檔案之後﹐然後就可以直接用 rpm 命令進行安裝﹕
rpm -ivh /mnt/cdrom/RedHat/RMPS/xyz.1.2-3.i386.rpm |
如果一切順利﹐您會看到如下的結果﹕
xyz ################################################# |
這時因為您在 i 後面加上了 vh 參數﹐所以會將安裝進度以 # (hash) 符號顯示出來。
假如您看到一長串 # ﹐那就表示安裝成功了﹔但如果您看到諸如這樣的信息﹕
error: failed dependencies: aaa is needed by xyz-1.2-3 bbb is needed by xyz-1.2-3 ccc is needed by xyz-1.2-3 |
這是碰到 dependence (相依性)的問題﹐也就是說﹐這個程式( xyz )需要其他那些程式才能工作﹐那麼您就必須將 aaa﹑bbb﹑ccc 等程式先行裝上﹔如果這些程式又要求 ddd﹑eee﹑fff 等程式﹐那麼﹐您還須再進行更進一步的安裝﹐直到出現一串‘##########’為止。
雖然我們已經安裝好程式了﹐但我們卻不知道它安裝到哪裡去了﹐這時候﹐我們可以輸入﹕
rpm -qpl /mnt/cdrom/RPMS/xyz.1.2-3.i386.rpm |
這裡﹐我們是直接查詢 rpm 檔來獲得程式資料。但如果程式已經安裝好了的話﹐您在執行 rpm -q 的時候就不用帶“ p ”這個選項了﹐而且也不用輸入 rpm 的檔案名稱﹐直接輸入程式的名稱(name)就可以了。例如﹐您可以執行﹕
rpm -qi xyz rpm -ql xyz |
您會看到一大串路徑會被顯示出來﹐也就是告訴您這個程式的檔案被安裝到哪裡去了。通常﹐Linux 的應用程式都會裝在‘bin’目錄之下﹐那麼我只要留意 bin 這個字眼(可以配合 grep 找到)就知道怎麼呼叫程式了:
rpm -ql xyz | grep bin |
如果﹐您覺得程式並不好用﹐或出於任何原因﹐想要移除程式﹐那我們下面命令進行﹕﹕
rpm -qi xyz |
找到 rpm 程式資料中的‘name’﹐例如﹐您看到的是﹕“Name : xyz”﹐然後輸入﹕
rpm -e xyz |
這裡﹐我們不用輸入 rpm 的全稱哦~~~﹗只輸入 name 就可以了。如果您沒看到任何回應信息﹐就表示移除成功了。如果您看到諸如這樣的信息﹕
xyz is needed by ggg-1.2.3 xyz is needed by hhh-4.5.6 xyzx is needed by iii-7.8.9 |
這裡﹐我們又碰到相依性的問題了﹐告訴我們還有其他程式必須依靠目前這個程式才可以執行。那您就要先將 ggg﹑hhh﹑iii 這些程式移除掉才可以繼續。原理和安裝的時候一樣﹐只是順序掉過來而已。
或許﹐我們在進行 RPM 安裝的時候﹐最頭痛就是碰到相依性的問題﹐尤其是 library 相關的。通常﹐我都會採取整個系統升級的辦法來解決。但有時候﹐也會用 --force 和 --nodeps 來強行安裝。不過﹐根據我的經驗是﹕如果用強迫安裝﹐日後遇到的麻煩是隱藏的﹐您不知道系統到什麼時候會出現問題。而更討厭的是﹕在出現問題的時候根本搞不清楚其來龍去脈﹐其原因就是用強迫安裝﹐會導致 RPM 資料庫的資訊失實。所以﹐如非必要和確定安全﹐不建議這麼玩法﹐小心小心。
Tip﹕另外﹐rpm 還可以用來查詢軟體版本呢﹕
rpm -qa | grep sendmail |
從顯示結果中﹐我們就知道當前使用的 sendmail 是什麼版本了﹐當然﹐sendmail 必須是以 rpm 安裝的﹐資料才會準確。這個方法用來查找系統是否安裝有某個軟體也很方便哦~~~
下面我用一個從 internet 下載的小程式來和大家一起看看 rpm 的安裝過程﹐這是一個用來撥接 ADSL 的程式﹐叫 rp-pppoe。
- 先告訴大家我通常是怎麼上 internet 抓 RPM 的﹕第一個我會去看的網站是 http://rpmfind.net/ 。您不妨先閱讀一下首頁的內容﹐或許會找到其它的有用資訊。
- 然後我會轉到 Go directly to the RPM database 的聯結去。這個聯結裡面有許多不同的索引方法﹐我比較喜歡用 index by Name 。好﹐現在也請您進入 by Name 的聯結中。
- 然後﹐根據套件的第一個字母按順序找到相應的聯結﹐並進入。這裡﹐我們移動到 Packages beginning with letter R 那裡去。
- 這裡或許要等一下了﹐這要看您的連續速度。因為套件比較多﹐而且大小寫有別﹐請耐心捲動視窗﹐找到 rp-pppoe 開頭的套件。
- 通常﹐一個套件都有好幾個版本﹐最新的會排在前面。不過﹐如果套件作者沒有將最新版本丟上來的話﹐就誰也不敢保證了。然後﹐請選擇 linux/i386 的套件。
- 進入後﹐您會獲得該套件的許多有用資訊﹐有空不妨看看﹐尤其是它的 Requires 。嗯﹐不過﹐我最有興趣的是表格中的 Url:。因為那才是這個套件的原始網站。為了確保我能抓到最新版本和了解最新資訊﹐我通常都會去那邊下載﹐而不是在 rpmfind.net ﹐除非原始網站上面沒有下載提供。好﹐那就讓我們轉到 rp-pppoe 的原始網站吧﹕http://www.roaringpenguin.com/pppoe.html 。
- 有些網站或許會搬家﹐我們發現 rp-pppoe 的網站搬到 ﹕http://www.roaringpenguin.com/pppoe/ 去了。沒關係﹐能找到就好﹐然後﹐花點時間看看首頁上是否有一些最新的資訊﹐例如 bug & fixed 之類的。不過﹐我想﹐大家最關心的應該是 Download 吧﹖Okay﹐不妨現在就去挖挖寶。
- 到了 download﹐您或許有點困擾﹕不知道究竟要抓哪個檔案﹖嗯﹐沒關係﹐先聽聽我的建議好了﹕還記得前面提到的 i386 和 noarch 的意思嗎﹖不管您的 CPU 是 Pentium 或 Pentium-4 ﹐抓 i386 的 rpm 都能使用。但是﹐我不妨告訴您一個 RPM 秘密﹕這些 i386 之類的 RPM 是別人在他們的機器上做出來的﹐其環境未必完全和您的機器一樣﹐如果差異部份不足以影響程式的運作﹐那您抓 i386 回去應該沒什麼問題(比如﹕RedHat CDROM 裡面的 rpm 套件)。不過﹐如果有可能的話﹐我建議您先抓 src.rpm 回去﹐用 rebuild 的方式﹐根據自己的機器實際環境做出完全符號自己條件的 rpm 。所以﹐這裡請您選擇最新版本的 src.rpm 進行下載(目前是 3.2.1)。如果您有使用 X window﹐那還可以將同版本的 rp-pppoe-gui 的 src.rpm 也抓回去。兩個檔案都存放到 /usr/src/pkgs 目錄去(這個目錄目前是不存在的﹐請先用 mkdir 建立)。
- 等所有檔案的下載完畢之後(您也可以直接從本站抓取﹕ rp-pppoe-3.2-1.src.rpm & rp-pppoe-gui-3.2-1.src.rpm)﹐我想您會迫不及待的跑去 /usr/src/pkgs 目錄去吧﹗可以理解~~ ^_^
- 在 /usr/src/pkgs 裡面﹐您應會找到剛纔抓回來的檔案。如果您在 rp-pppoe 上面看過文件﹐應該知道 rp-pppoe-gui 是安裝在 rp-pppoe 之上的﹐也就是說﹐它們是有相依性的﹕我們必須先安裝 rp-pppoe 這個套件。這裡﹐請您輸入﹕
rpm --rebuild rp-pppoe-3.2-1.src.rpm - 這時候﹐熒幕上應該會跑出許多資訊。如果眼睛夠快﹐不妨看看﹐但最關鍵還是在最後面﹕當一切順利結束之後﹐您往上數幾行﹐應該會發現一行﹕
Wrote: /usr/src/redhat/RPMS/i386/rp-pppoe-3.2.1.i386.rpm
這個就是 rebuild 針對您機器環境所產生的 rpm 了﹗如果沒有﹐那可能是 rebuild 不起來﹐您可以根據錯誤信息進行修正。如果您夠功力﹐您還可以到 /usr/src/RedHat/BUILD/ 目錄去修改﹐並重新 build 一個 RPM。無論如何﹐我目前在 RH7.1 上安裝這個套件還算順利啦。
- 前面已經介紹過用 -ivh 的參數來安裝 rpm 套件。其中的 i 是 install 的意思﹐假如套件是第一次安裝﹐並沒有舊版本﹐用 i 就可以了。但如果系統上已經有這個套件的舊版本了﹐那您可以將 i 改成 U (大寫) ﹐進行 Upgrade。不過﹐就算系統沒有舊版本﹐其實用 U 也無傷大雅﹐所以我一般都會用 U 來安裝﹕
rpm -Uvh /usr/src/redhat/RPMS/i386/rp-pppoe-3.2.1.i386.rpm 如果不能用滑鼠﹐那就參考下一章介紹 BASH 所提到的 ‘tab 鍵補全’功能吧。
如果您看到一長串 # 符號﹐那就成功了﹐否則根據提示進行修正。
- 接下來的使用﹐可以說與 RPM 無關﹐您可以參考套件自帶的文件﹐或是到原始網站上找資料。
然後輸入 adsl-start 就可以建立連線﹔輸入 adsl-stop 就可以掛線。更具體的設定﹐不妨參考如下網頁﹕Linux 使用 ADSL (計時制) 的經驗分享 。
- 假如您的 X window 已經設定好了﹐那您就可以將 rp-pppoe-gui 套件也裝上來。具體步驟可以參考前面的介紹﹕
rpm --rebuild rp-pppoe-gui-3.2.1.src.rpm
rpm -Uvh /usr/src/redhat/RPMS/i386/rp-pppoe-gui-3.2.1.i386.rpm - 然後﹐您在 X 裡面的開始選單上的 internet 會找到 TkPPPoE 的程式。執行它﹐在最終畫面裡面按 ‘New Connection’來設定就可以了(不知道的部份﹐可以空著不碰﹐其中 options 那裡可以設定 Firewall 模式﹐但我建議取消‘Use synchronous PPP’選項)。最後﹐按 Start 就可以連線﹔按 Stop 就可以掛線。連線成功之後﹐還可以看到連線的使用狀態呢﹗
如果您確定沒有執行 internet 程式﹐而又發現連線一直在跑﹐那就要小心您的系統是否遭到別人***或攻擊了~~~
前面所介紹的是 SRPM 的安裝例子。如果條件允許的話﹐我建議您儘量抓 source RPM 回來安裝。有時候您需要在安裝套件的時候修改或設定一些預設選項﹐這時候﹐就只能修改 SRPM 了。下面是 marr 大大所教的一個方法(在 mandrake 上以 openssh 為例)﹕
From: "Penelope Marr" To: "網中人" Sent: Saturday, December 08, 2001 12:40 AM Subject: Re: 請教一個 RPM 問題 > On Fri, Dec 07, 2001 at 07:40:16PM +0800, 網中人 wrote: > > > > 就是﹐如果我下載了一個 src.rpm 回來﹐ > > 我想修改套件的安裝選項 (如 tarball 的 ./configure 那樣)。 > > 不知道如何做呢﹖ > > 暫時不確定你想修改成怎麼... > 舉例: > > # wget http://twopensource.org/~marr/openssh-3.0.2p1-1.src.rpm > # rpm -i openssh-3.0.2p1-1.src.rpm > # cd /usr/src/RPM (for Mandrake user) > # vi SPECS/openssh.spec > > ------------------- search for '%configure' ------------------- > %configure \ > --libexecdir=%{_libexecdir}/openssh \ > --datadir=%{_datadir}/openssh \ > --with-pam \ > --with-tcp-wrappers \ > --with-rsh=/usr/bin/rsh \ > --with-default-path=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin \ > $EXTRA_OPTS > --------------------------------------------------------------- > > # rpm -ba SPECS/openssh.spec > > > 大概是這樣,相關的細節其實算不少,最好參考一下 MaximumRPM > http://www.rpm.org/maximum-rpm.ps.gz > |
好了﹐關於 RPM 的說明到此為止﹐如果您還想更深入了解一下 RPM 的資料﹐您可以參考這篇文章﹕[FYI] RPM document ﹐或是看 RPM 的 HOWTO 文件(或 中文版 )。
資源管理
Linux 是一個“多人多工 (Multi User & Multi Task)”系統﹐假如您用慣了 DOS 和 Windows﹐很難想像這是怎麼一個形式的﹐倒不如讓我們親自試試好了。當您開著機器﹐見到 Login: 提示的時候﹐如常登錄。然後按﹕ Ctrl + Alt + F2 鍵﹐您就會發現另外一個 Login: 提示﹐也請您登錄進去﹔之後再按 Alt + F3 ﹐試用另一個帳號登錄。您可以任意選擇 Ctrl + Alt 加 F1 到 F6 來進行另外登錄(可以使用相同帳號)﹐我們稱不同的熒幕為 terminal 或 console。
Tip﹕如果您已經進入 X window﹐那麼﹐F7 就是保留給 X window 用的﹔但同一機器上面﹐您只能打開一個 X window ﹐其它 6 個則為 console。
無論您在哪裡﹐只要您輸入﹕
whoami |
就可以知道您究竟使用哪一個身份登錄的了(或是輸入 id 命令也可以)。然後您再輸入﹕
who |
您就可以看到這個系統中﹐一共有哪些使用者登錄了﹐和他們從哪裡登錄進來的﹐還有登錄時間等信息。如果是本機登錄的話﹐會顯示出諸如﹕ttys1﹑ttys2 等終端來源﹔如果是使用 telnet 或 X window 進來的話﹐則會顯示出諸如﹕pts/1﹑pts/2 等來源﹐後面還會顯示出他們目前的本地主機是什麼。
如果您只輸入﹕
w |
您還可以看到各使用者目前在做什麼﹐以及他所使用的程式所佔用的 CPU 情況﹕
1:46pm up 1:54, 4 users, load average: 0.01, 0.02, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 - 11:53am 1:49m 5.41s 0.03s sh /usr/X11R6/b kenny pts/1 pii266 12:05pm 1.00s 0.16s 0.04s w netman pts/3 redhat62 1:40pm 2:13 0.13s 0.08s vi /etc/passwd netman pts/4 redhat62 1:48pm 14.00s 0.40s 0.31s top |
讓我們先看第一行﹕1:46pm 表示當前時間﹔up 1:45 表示開機累計時間﹔4 users 表示當前使用者人數﹔然後 load average: 0.01, 0.02, 0.00 分別表示系統過去1﹑5﹑10分鐘的平均負載程度﹐機器越快﹐數值就越低。然後下面各使用者的資料分別顯示出﹕使用者名稱﹑終端來源﹑機器名稱﹑登錄時間﹑空置時間(即使用者沒執行任何動作)﹑該用者一共佔用 CPU 的時間(秒)﹑使用者目前執行程式佔用的 CPU 時間﹑使用的程式名稱。
我們使用‘w’看到的是全部使用者的情況﹐我們也可以用‘w netman’來觀測指定使用者的情況。
如果﹐您還想看看機器目前處理的程式和它各自所佔用的資源狀況﹐我們可以執行﹕
top |
然後﹐您可以一一看到系統的資源使用情況﹐這裡留待您自己去慢慢觀察了。我這裡要指出的一個很重要的 Linux 程式概念﹕Child Process。也就是說﹐在 Linux 裡面可以由一個 Process (Parent)產生另外一個 Process (Child)﹐這個個動作叫 fork﹐然後 parent 就會暫時進入 sleep 狀態(休息去了)﹐這時﹐parent 運算是處於背景(backgroud) 執行狀態﹔然後當 child 完成了運算後就會報告給 parent﹐這時候 parent 就會醒過來﹐重新回復前景(foreground) 執行狀態。
一個 parent 可以產生好幾個 child﹐同時﹐child 也可以再產生 grand child﹐等等.... 如果不幸﹐當一個 child 程式由於某些原因死掉﹐但 parent 卻沒察覺出來的話﹐就會令系統產生 zombie (活死人)了﹐這通常是程式寫得不夠嚴謹而導致的。通常﹐您用 top 指令看到 ‘0 zombie’的結果﹐這是正常的﹔假如系統的 zombie 越來越多﹐那系統資源會越被耗掉﹐無限增加的話﹐有朝一日會讓系統衰竭而死。
我們可以將當前執行的程式送進背景執行狀態哦﹐例如 ﹕‘find / -name test &’。我們直接在執行程式的命令行最後加上“&”符號﹐就可以將之送到背景中執行。假如我們在一個已經執行的程式中﹐按 Ctrl+Z 鍵﹐則會將程式由 foregroud 進入 suspend 模式。例如﹕您用 vi test.txt 編輯一個檔案﹐然後按 Ctrl+Z ﹐那您就會將 vi 暫時掛住﹐而回到 parent 程式﹐也就是回到 shell 中(我在下一章會討論 shell )。 這個時候﹐您可輸入﹕
jobs |
這樣就看到有哪些程式在非前景中執行﹑以及他們的狀態。假如呢再輸入﹕
bg |
就會把程式丟到 background 中去繼續執行﹕[1]+ vi test.txt & 。如果這時候我們輸入﹕
fg |
就可以再次回到程式中了﹐意思是讓程式回到前景中執行。好玩吧﹖哈哈~~~ ^_^
Tips﹕如要簡單的區別前景和背景程式﹐主要是看它對控制台( console ) 的控制權﹕如果一隻程式在執行狀態中﹐而且 console 的控制權在程式手上﹐那它就是前景執行中﹔如果控制權在其父程式 ( parent )手上﹐那就是在背景中執行。
如果有多個工作在非前景中執行的話﹐您在使用 bg 和 fg 命令的時候﹐可以直接以 job number 來作參數﹐就可以處理指定的工作程式了﹔至於 job number 是什麼﹖您可以執行 jobs 命令獲得。
將程式送到背景中有一個好處是﹕您可以同時執行多個程式。例如﹐您有一個好大的壓縮檔要解壓﹐但這可能需要一點時間﹔如果您不想等在那裡無所事事的話﹐您可以將這個程式送到背景執行﹐這樣您就可以繼續做其它東西了﹔等背景程式執行完畢﹐它會回到前景將執行結果告訴您的。
事實上﹐每一個程式﹐它要在系統上執行的時候﹐都會產生一個行程(process) 。如果程式會產生它的子程式﹐那子程式也擁有自己的行程。當我們登入系統的時候﹐首先是獲得一個 shell﹐這個 shell 本身就佔據一個行程﹐然後我們輸入的命令﹐或執行的程式﹐都可以說是這個 shell 的子程式。
在 Linux 中﹐每一個行程都有一個獨一無二的 process ID (PID)的﹐只要您輸入﹕
ps |
就會顯示當前這個 shell 所產生的所有行程﹐如果您輸入﹕
ps aux |
就可以將系統上所有行程顯示出來了。但如果您覺得太亂了﹐可以配合 grep 這個指令找到您指定要找的信息﹕
ps aux | grep vi |
這樣﹐凡是含有‘vi’字眼的行程就會呈現在您眼前了。
kenny 664 0.2 6.7 2468 980 pts/1 S 15:45 0:00 vi test root 666 0.3 5.9 2420 856 pts/0 T 15:45 0:00 vi test.vi root 667 0.5 5.9 2420 856 pts/0 T 15:45 0:00 vi test1.vi root 671 2.0 3.4 1840 496 pts/0 S 15:45 0:00 grep vi |
從顯示出來的信息﹐我們可以看到的資訊有﹕使用者名稱﹑PID﹑CPU使用率﹑記憶體佔用率﹑行程大小﹑駐留體積﹑終端號碼﹑狀態(Running還是Sleeping)﹑啟始時間﹑執行時間﹑指令名稱﹐這些資訊。其中﹐我們最需要的是它的 PID﹐如果我們知道了程式的 PID﹐我們就可以透過信號(SIGNAL) 對其進行多樣處理。我們可以用 kill 命令送出相關信號。這個 kill﹐顧名思義就是殺死的意思啦﹐因為預設的信號是 TERMINATE ﹐也就是終止行程﹐和我們認為的‘殺死’之意差不多。除了 TERMINATE 之外﹐還有其它的相關信號﹕
信號名稱 | 代表號碼 | 代表意思 |
HUP | 1 | 掛斷(HangUP)﹐通常用來重新讀取設定。 |
INT | 2 | 使用者送出的中斷(Interrupt)﹐也就是按 Ctrl + C 鍵。 |
QUIT | 3 | 使用者送出的推出(Quit)﹐也就是按 Ctrl + / 鍵。 |
KILL | 9 | 強制性立即終止行程(Kill)。 |
TERM | 15 | 一般性終止行程(預設﹐Terminate)。 |
STOP | 19 | 停止或擱置行程(Stop)﹐也就是按 Ctrl + Z 鍵。 |
假如您已經在 foreground 的程式裡面﹐除了 kill 命令之外﹐您也可以透過 Ctrl 的組合鍵送出信號﹐例如 Ctrl+C ﹐通常都可以將一個前境程式終止掉﹐尤其是您發現它執行起來不太對的時候﹐比方說﹕您要結束一個 ping 命令或離開 top 命令。
比方說﹕有一個程式由於某種原因停在那裡﹐而您當前的終端不能夠進行任何進一步動作了﹐那麼您可以利用另外一個終端(甚至用 telnet)﹐登錄後切換為 root 身份﹐再用 ps 加 grep 找到它的 PID (假設是664)﹐然後輸入﹕
kill -9 664 |
就可以將該程式殺掉﹐而無需像 Windows 那樣必須重新開機﹗這裡的‘-9’是強制殺死的意思﹐無論什麼狀況都可以將改行程殺掉。
Tip﹕如果您只想要某程式重新執行的話﹐例如﹕您修改了程式的一些設定檔﹐您可以輸入﹕
kill -HUP pid |
以上的命令都是管理程式的工具﹐有時候您可能需要查看一下硬體上的設定。除了開機的時候您可以觀察屏幕的輸出內容外﹐您還可以隨時輸入﹕
dmesg |
這個命令會將您目前所使用的硬體資料顯示出來。
如果您還想查看更詳細的硬體情況﹐您可以看看 /proc 目錄下面的檔案﹐如﹕
cat /proc/interrupts cat /proc/ioports |
您就可以得知系統目前使用了哪些 IRQ 和 IO 了。
事實上﹐在 /proc 目錄下面﹐都是關於系統的資訊﹐您如果不清楚當前系統裝了些什麼硬體﹐或被設定為何種特性﹐都可以來這裡挖寶。
最後﹐我想再和大家介紹另一個行程概念﹕nice level。當您執行 top 命令之後﹐您會發現其中有一欄叫 NI 的﹐正常來說﹐這欄都是 0 。嗯﹐這個就是所謂的 nice level 了。怎麼理解呢﹖先讓我們看看 nice 的範圍吧﹕-20 ~ +19 之間。
如果一個行程的 nice 數值越低﹐那麼麼﹐當它就更有優先權獲得處理﹔反之﹐數值越高﹐那麼處理優先權越低。通常來說﹐一般行程的 nice 值都是 0﹐那麼彼此在處理上的優先權都是平等的。
不過﹐如果您是 root﹐可以任何時候調整當前行程或使用者的 nice 值﹐使用 renice 命令就可以了﹐例如﹕
renice 8 622 renice 9 user1 |
這樣﹐您就能將 PID 為 622 的 nice 值設為 8 ﹔同時將所有 user1 執行的程式設為 9 (呵~~ 當管理員真爽﹗^_^ )。然後﹐您再用 top 命令就可以比較前後的變化了。不過﹐作為一般使用者﹐您只能調整自己執行的程式﹐而且只能往上加值而不能往下降。不信﹖玩玩看就知道了。
如果您在執行一個命令的時候﹐就想加大它的 nice 值﹐將其處理優先權降低﹐那您可以配合 nice 命令一起使用﹕
nice -n 8 find / -name test.text |
這樣﹐find 這個命令就以更低的優先權執行了。
怎樣﹖您是否越來越佩服 Linux 這些特異功能了呢﹖ ^_^
尋求幫助
沒用人天生出來就懂的﹐知識都要靠經驗的積累﹐但我們也不可能每一樣東西都有經驗的﹐那麼﹐參考別人的經驗和使用手冊就顯得非常重要了。幸好﹐在 Linux 世界裡﹐我們不愁找不到資料﹐許多時候更讓您感覺到資料太多而不知道怎麼篩選﹗就算您上不了 internet﹐系統本身就帶有非常詳盡的手冊文件。其實﹐最常用的一個指令是﹕‘man’﹐即 manual 的意思(也有人說找男人)。無論我們在任何地方﹐只要您知道程式的名稱﹐我們就可以用 man 來看它的使用方法﹐和各種參數設定。例如﹕我們想看看 useradd 這個程式是怎麼使用的﹐可以輸入﹕
man fstab |
您就可以看到關於 useradd 的 manual 內容了﹐如果超過一個屏幕﹐您可以按空白鍵向下翻﹐也可以用方向鍵往前翻﹐其實和 less 命令一樣。同時﹐您還可以搜索字眼哦﹐您只要輸入﹕
/ext2 |
銀幕就會將所有 ext2 這個字眼顯示出來﹐如果要繼續往下找﹐只要輸入‘n’就可以了。如果你要離開 man﹐可不同 vi 那樣哦﹐只要按‘q’就可以離開了。
通常﹐在 man 檔案最後部分﹐都會列其他一些相關的 manual 名稱﹐有些後面還帶有數字的﹐如﹕exports(5)﹐那是表示 exports 可能還有其他好幾個層次的 manual﹐如下﹕
等級 | 代表意思 |
1 | 可執行檔和 shell 命令。 |
2 | 直接由核心提供的系統呼叫。 |
3 | 系統函式庫裡面的函式呼叫。 |
4 | 通常於 /dev 裡面的特殊檔案。 |
5 | 檔案格式和協定。 |
6 | 游戲。 |
7 | 巨集(Macro) 套件協定。 |
8 | 通常供管理員使用的系統管理命令。 |
9 | 非標準的核心進程。 |
如果您要閱讀數字指定的 manual﹐可以輸入﹕
man 5 exports |
要學 Linux ﹐看 HOWTO 文件是少不了的事情﹐您可以在 /usr/doc/HOWTO 目錄裡面﹐用任何的文書編輯器來看。如果能夠用netscape的話﹐也可以看看目錄下面的 INDEX.html ﹐就可以找到相關題目了。
因為在 linux 裡面﹐還有很多命令需要在文字模式執行的﹐有時候也挺難記住全部命令的句子語法。這時候﹐您可以用 ‘--help’跟在命令後面﹐這樣可以看到該命令的簡單使用指引了。如輸入﹕
cp --help |
就可以看到關於 cp 這個命令的說明了。有時候﹐您也可以用‘-h’來代替‘--help’﹐試試就知道了。