2006年(25)
分类: LINUX
2006-09-09 11:38:27
前面我們已經對 Linux 的檔案系統有一定的了解了﹐而已也會得運用基本的命令溜灠檔案目錄﹐以及建立﹑刪除﹑複製﹑等動作。這裡我們要介紹的﹐這針對檔案內容上的一些處理。下面﹐我簡單介紹一些我們常用到的命令﹕
假如您不確定一個檔案的種類是什麼﹐那您最好用 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 /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 命令。
您可以按著 Shift 鍵﹐再配合 PageUP 和 PageDown 鍵來回翻閱熒幕。但畢竟有限和不方便﹐您最好用 more 命令看一個檔案﹐這樣﹐結果只顯示一個熒幕的內容﹐然後您按 Enter 鍵的話﹐則往下捲動一行﹔如果按空白鍵的話﹐則往下捲動一個熒幕。同時﹐會在最底下告訴您目前所顯示的百分比。當檔案顯示到最後一行的時候﹐命令就結束。
不過﹐用 more 命令卻不能往上翻頁哦﹐如果您想要在顯示檔案的時候能夠上下來回翻頁﹐那就用 less 命令吧。這樣﹐您按 Enter 或向下方向鍵﹐則往下捲動一行﹔按空白鍵或 PageDown 則往下捲動一個熒幕﹔按向上方向鍵則往上捲動一行﹔按 PageUp 則往上捲動一個熒幕。但是﹐用 less 命令就算檔案顯示最後一行了﹐也不會自動結束﹐您得按 Q 鍵才能離開。
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 行後面的內容都會顯示出來。其實﹐可用的選項很多啦﹐請您自己慢慢發掘囉。
這個命令用來整理一些數據非常好用﹐日後寫 script 的時候應該會常用到的﹐不妨熟悉熟悉。
這命令常會和 sort 命令一起使用﹐而將重複句子過濾掉(或找出來)。
不如舉例子來說明好了。您如果檢查 /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 個字母之間的內容。
這個命令常會和其它命令一起使用﹐以過濾命令結果﹐找到指定所需的字串﹐靈活運用﹐可有非常豐富的變化﹐請多花些時間在上面。
再拿前面的 /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 及其它特殊標籤)
只要您用這個命令來檢查一個檔案﹐那麼這個檔案的行數(line)﹑詞數(word)﹑以及字數(charactor)﹐都會幫您總結出來。當然﹐您也可以分別用 -l ﹑ -w ﹑ -c 這幾個參數單獨顯示行數﹑詞數﹑和字數。您還能用它來檢查一個檔案是否空的。
假如您是個編輯﹐要計算稿費可非常好用哦~~~
find / -name smb.conf |
這裡﹐我們打算從 / 開始尋找檔案。找什麼檔案呢﹖-name 這個參數告訴我們這裡要找的檔案名字﹕ smb.conf 。除了 name 之外﹐還可以是 date﹑size﹑owner﹑type﹑等不同的選項。
不過﹐每次執行 find 這個命令﹐如果您搜索的範圍很大﹐那麼可能需要一些時間才能執行完畢。有沒有更快的辦法呢﹖有的﹐就是用 locate 這個命令﹕
locate smb.conf |
這命令同樣也能幫您找出檔案的位置﹐而且非常快。不過﹐事實上﹐這個命令並不是真的搜尋當前的檔案系統﹐而是檢索一個檔案系統的資料庫。這個資料庫需要執行 updatedb 這個命令才會更新。在這個資料庫上一次更新之後才建立的檔案﹐用 locate 這個命令就找不到了。執行這個 updatedb 命令﹐和用 find 找 / 目錄一樣久﹐不過﹐系統會透過排程程式來定期更新這個資料庫的。
如果您只知道某一個檔案的內容其中一個關鍵字﹐ 而忘記了檔案的名稱﹐那麼 find 和 locate 都沒辦法幫助您﹐但是 grep 就成為您的救星了。比方﹐您這樣執行﹕
grep kenny /etc/* |
那麼所有在 /etc/目錄下含有 kenny 這個字串的檔案﹐其中的句子都會被顯示出來﹐而句子前面會加上檔案的名稱﹐這樣﹐您再進行過濾就找到您要的檔案了。如果您加上 -r 參數﹐那麼搜索的範圍就不局限在 /etc/ 目錄下﹐而是連同其下的所有子目錄都會搜索。
如果您只想找出某個檔案中的特地內容﹐比方說﹐我現在要找出 kenny 這個帳號的設定﹐那我可以這樣輸入﹕
grep kenny /etc/passwd |
這樣﹐所有包含 kenny 這個字串的句子都會顯示出來﹐當然﹐如果關於 kenny 這個帳號的內容是分數行來書寫的﹐而其中只有一行有 kenny 這個字串﹐那您所找到的資料就不完整了。幸好﹐passwd 這個檔﹐所有帳號的資料都寫在單一句子裡面。
這個命令也經常和其它命令一起使用﹐以過濾出您真正需要的內容﹐也請多加練習。
要管理好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 的救命鍵﹕Esc。如果您亂按亂按之後迷失了方向﹐可以連續地多按幾下 Esc 鍵﹐您就會回到 vi 的編輯模式。下面先讓我們按幾下 Esc 吧﹐或許您會聽到喇叭會發出 BB 聲﹐但這是沒關係的﹐請放心好了。在 vi 裡面﹐能聽到這個聲音反而心裡比較定呢~~ ^_^
接著﹐輸入 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 才行)。
除了前面接受的基本命令之外﹐還有許多技巧我們可以運用的﹕
相反的﹐如果您輸入 ?kenny﹐也是進行字串查找﹐但方向和 / 相反﹕從游標往第一行句子那個方向進行查找﹐到了頂端然後繞到最後一行繼續。
這裡略略介紹的﹐只是 vi 其中很少一部分功能﹐其他的要您自己去發現了(尤其當您掌握了 Regular Expression 之後)。不過﹐光靠以上這幾個基本命令(組合)﹐相信﹐您也可以“行走江湖”了。只是﹐效率可能沒 vi 高手那麼快而已(反正您也比較少用 vi 來寫文章吧﹖)。
另外﹐我們還可以使用 vim 來代替 vi 進行文書編輯﹐vim 是 vi 的增強版。如果您有興趣深入的學習一下 vim 或 vi (操作上基本一樣)﹐請看 這篇文章。
我們在安裝的時候最少會建立兩個帳號﹕一個是 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 之設定啦。這個檔案裡面﹐每一個帳號都獨佔一行設定﹐格式相同﹐分別用 ‘﹕’來分隔﹕
和 /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 名稱會和使用者名稱一樣)﹐至於用哪個號碼﹐則由系統自己決定了。
究竟使用者家目錄的內容是怎麼定的呢﹖只要您以 root 的身份變更 /etc/skel 目錄下面的內容﹐那麼以後新建的帳號﹐會跟著改變。
不過﹐要該帳號真正能夠被使用的話﹐這時候﹐您還得在此為使用者指定一個密碼﹕
passwd user1 |
您需要輸入密碼兩次才能完成這個動作﹐而且﹐只有系統管理員才可以指定別人的密碼。以後﹐當使用者成功登錄之後﹐他可以使用‘passwd’不帶任何參數﹐來修改自己的密碼。再次提醒您﹕密碼不要設得太簡單﹗如果使用者自己執行 passwd 來修改密碼的話﹐系統會檢查您的密碼是否合格﹐否則會不接受﹐而要您輸入合格的密碼為止﹔如果您用 root 來設密碼的話﹐不合格的密碼只會獲得警告信息而已﹐密碼還是可以使用。
那麼﹐我們又如何刪除帳號呢﹖您可以使用﹕
userdel -r user1 |
加上 -r 參數的話﹐帳號和家目都會錄清除掉。但如果該使用者使用過郵件信箱的話﹐我們就得手工的將其信箱移除了。
rm -rf /var/spool/mail/user1 |
還有﹐最好用 find / -user user1 找找這個使用者還有哪些檔案與之相關﹐然後一一處理。您可以參考“shell 與 shell script”中的最後一個範例﹐幫您完成這項工作。
接下來﹐讓我們看看第三個檔﹕
more /etc/shadow |
這個檔案的格式和 passwd 有點類似﹐但其中的設定意思卻很不一樣﹕
請您仔細比較 /etc/group﹑/etc/passwd﹑和 /etc/shadow 這三個檔的權限﹐您會發現前兩個檔的 group 和 others 都有 read 的權限﹐而 shadow 則只有 root 才能讀取。您最好不要修改這些預設權限﹐因為 group 和 passwd 檔常被許多程式讀取﹐以進行權限設定的依據﹐如果您將 others 的 r 取消了﹐那會造成系統大混亂。shadow 檔之所以會被使用﹐也是因為 passwd 這檔能夠被任何人讀取﹐所以將其中最重要的密碼資訊轉移出來﹐然後只能讓 root 讀取﹐從而提高系統的安全性能。
呵﹐您如果有這樣的相法﹐可能是太低估了破解者的能力了。沒錯﹐破解者沒辦法根據您編碼之後的內容進行逆向演算﹐但它可以用同樣的辦法來進行加密﹐然後比較加密後的內容﹐如果得出來是一樣的﹐那就知道原來的密碼是什麼了。雖然系統使用了 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 來工作。
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 裡面的使用者﹐就要更小心保護他們自己的密碼了。
以前要安裝 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 的目錄﹐或許它們會在那裡。您大概花上數分鐘了解安裝要求和過程﹐說真的﹐這或許會幫您省掉好幾個小時的冤枉時間。
有些程式的安裝還是蠻複雜的﹐但一般來說﹐安裝步驟不外如下﹕
一般來說﹐用 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 |
仔細看看命令的輸出結果﹐其中或許有些資訊您是有所興趣的。
有些 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 資料庫的資訊失實。所以﹐如非必要和確定安全﹐不建議這麼玩法﹐小心小心。
rpm -qa | grep sendmail |
從顯示結果中﹐我們就知道當前使用的 sendmail 是什麼版本了﹐當然﹐sendmail 必須是以 rpm 安裝的﹐資料才會準確。這個方法用來查找系統是否安裝有某個軟體也很方便哦~~~
我用一個從 internet 下載的小程式來和大家一起看看 rpm 的安裝過程﹐這是一個用來撥接 ADSL 的程式﹐叫 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 上安裝這個套件還算順利啦。
rpm -Uvh /usr/src/redhat/RPMS/i386/rp-pppoe-3.2.1.i386.rpm |
如果不能用滑鼠﹐那就參考下一章介紹 BASH 所提到的 ‘tab 鍵補全’功能吧。
如果您看到一長串 # 符號﹐那就成功了﹐否則根據提示進行修正。
然後輸入 adsl-start 就可以建立連線﹔輸入 adsl-stop 就可以掛線。更具體的設定﹐不妨參考如下網頁﹕ 。
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 |
如果您確定沒有執行 internet 程式﹐而又發現連線一直在跑﹐那就要小心您的系統是否遭到別人入侵或攻擊了~~~
前面所介紹的是 SRPM 的安裝例子。如果條件允許的話﹐我建議您儘量抓 source RPM 回來安裝。有時候您需要在安裝套件的時候修改或設定一些預設選項﹐這時候﹐就只能修改 SRPM 了。下面是 marr 大大所教的一個方法(在 mandrake 上以 openssh 為例)﹕
From: "Penelope Marr" |
好了﹐關於 RPM 的說明到此為止﹐如果您還想更深入了解一下 RPM 的資料﹐您可以參考這篇文章﹕[FYI] RPM document ﹐或是看 RPM 的 文件(或 )。
Linux 是一個“多人多工 (Multi User & Multi Task)”系統﹐假如您用慣了 DOS 和 Windows﹐很難想像這是怎麼一個形式的﹐倒不如讓我們親自試試好了。當您開著機器﹐見到 Login: 提示的時候﹐如常登錄。然後按﹕ Ctrl + Alt + F2 鍵﹐您就會發現另外一個 Login: 提示﹐也請您登錄進去﹔之後再按 Alt + F3 ﹐試用另一個帳號登錄。您可以任意選擇 Ctrl + Alt 加 F1 到 F6 來進行另外登錄(可以使用相同帳號)﹐我們稱不同的熒幕為 terminal 或 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 |
就可以再次回到程式中了﹐意思是讓程式回到前景中執行。好玩吧﹖哈哈~~~ ^_^
如果有多個工作在非前景中執行的話﹐您在使用 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’是強制殺死的意思﹐無論什麼狀況都可以將改行程殺掉。
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’﹐試試就知道了。
以小弟經驗來看﹐看 linux 文件有時候很混淆﹐閱讀的時候要注意用來做例子的版本。因為有時候例子中的版本可能比您機器上的版本要舊﹐而且﹐不同的 distribution 也使用不同的路徑等等。如果要想獲得最新的 Linux 文件﹐當然最好是上網來看啦﹐您大可到﹕ 或 那裡看到最新的 HOWTO。如果您不喜歡看英文的話﹐則可以到﹕看中文的 HOWTO 翻譯文件(可能沒有英文站的那麼齊全)。
另外﹐有問題的話﹐也可以到新聞組(如﹕tw.bbs.comp.linux)上發表。但發問之前最好先多試幾次﹐記錄好所做的步驟和看到的錯誤信息﹐在問題裡盡可能多的將情況寫清楚﹐以及您的目的是什麼。別指望別人會回到您的信箱去﹐因為板上是大家討論的地方﹐一個分享之所。如果過一段時間沒看到回復﹐可以再發問看看﹐但不鼓勵一題多問﹐也就是將同一文章一次過 post 幾遍。當然﹐本網站也有“討論園地”供大家交流意見。
還有﹐關於中文化的安裝和使用﹐以及一些常見問題﹐可以從這個 地址獲得。
假如您是個 Linux 新手﹐我強烈建議您先看看這篇文章﹕“”。
一句話﹕上帝只打救那些自救的人。