第三章 UNIX 系統(tǒng)入門
3.1 第一次登入系統(tǒng)
安裝完 FreeBSD 后,重新開機(jī),要知道的第一件事就是要怎么使用嘛。我第一次使用 FreeBSD 時(shí),一開機(jī)看到 login: 時(shí)我當(dāng)場(chǎng)呆在那里,完全不知如何下手。所以我一定要說一下這個(gè),如何登入并更改密碼。說了一堆好像很難的樣子,其實(shí)不會(huì)啦,開機(jī)后看到 login: 時(shí),打 root 就可以登入系統(tǒng)了,如圖 3-1。
圖 3-1
這里的 root 就是所謂的超級(jí)使用者,這個(gè)使用者是 UNIX 系統(tǒng)中的預(yù)設(shè)管理者名稱。root 擁有系統(tǒng)所有權(quán)限,我們可以使用這個(gè)賬號(hào)登入系統(tǒng)進(jìn)行管理。root
這個(gè)使用者擁有許多一般使用者所沒有的權(quán)限,建議您平常使用時(shí)最好不要以 root 登入。例如收發(fā) email,程序開發(fā)、瀏覽網(wǎng)頁、練習(xí) UNIX 指令等,應(yīng)該以一般使用者的身份來進(jìn)行。因?yàn)槟赡懿恍⌒拇蛄四硞€(gè)指令而刪除不該被刪除的檔案、或因?yàn)椴涣嫉牟僮鞫绊懴到y(tǒng)的穩(wěn)定。因此,在我們?cè)O(shè)定完系統(tǒng)后,您應(yīng)該新增一個(gè)一般使用者以減少錯(cuò)誤的發(fā)生。
由于這是剛裝好的系統(tǒng),所以當(dāng)我們以 root 登入時(shí),系統(tǒng)不會(huì)問我們密碼。一個(gè)沒有密碼保護(hù)的系統(tǒng)是十分危險(xiǎn)的事,所以我們第一件要做的事就是設(shè)定 root 的密碼。請(qǐng)執(zhí)行指令
passwd 來設(shè)定您的密碼,系統(tǒng)會(huì)問您二次新密碼,以確認(rèn)二次輸入的密碼相同。請(qǐng)不要使用太簡(jiǎn)單的密碼,以免造成安全的漏洞。
3.2 基本指令介紹
在開始使用之前,我們先說明一些簡(jiǎn)單的指令用法,以利后續(xù)的設(shè)定,更詳情的指令介紹請(qǐng)參考本書第二十章「指令應(yīng)用」,或使用指令 man 來查詢指令的用法。如果您是 UNIX 初學(xué)者,先閱讀「指令應(yīng)用」可以讓您對(duì) UNIX 指令及系統(tǒng)管理有更多的了解。
指令 | 說明 |
cd | 改變所在位置,和 DOS 中的用法類似,如果要到 /etc 下,就打 cd /etc。 |
pwd | 直接打就會(huì)顯示目前所在目錄的名稱。 |
ls | 看目錄中的檔案清單。打 ls 或 ls /etc,就像 DOS 中的 dir。 |
w | 查詢目前在在線的使用者。 |
ee | 文書編輯軟件。 |
date | 看目前的日期及時(shí)間。 |
mkdir | 建立一個(gè)目錄,mkdir abc 就可以建立一個(gè)目錄叫 abc 。 |
rm | 刪除檔案或目錄。刪除檔案時(shí) rm file.txt,刪除目錄時(shí)要加參數(shù) -rf , 如 rm -rf abc。 |
cp | 復(fù)制檔案,就像 DOS 中的 copy。cp file newfile。 |
man | 查詢?cè)诰€使用手冊(cè),如 man cp 就可以看到 cp 這個(gè)指令的詳細(xì)說明。 |
su | 從一般使用者變成超級(jí)使用者即 root。 |
還有一個(gè)您一定要知道的小秘訣,當(dāng)您要 cd 到一個(gè)目錄時(shí),您可以只打檔名的一部份,再按 [Tab] 鍵,tcsh 會(huì)自動(dòng)幫您補(bǔ)上剩余的部份。例如,我們要切換工作目錄 (使用 cd 這個(gè)指令) 到 /usr/local,當(dāng)你打了 cd /usr/lo 時(shí),即可按 [Tab] 鍵,只要在 /usr 中,除了 local 外沒有其它開頭為 lo 的檔案或目錄,tcsh 便會(huì)自動(dòng)補(bǔ)齊成 cd /usr/local。除了 cd 外,其它的指令也是一樣,只要按 [Tab] 即可自動(dòng)補(bǔ)齊。而且除了檔案及目錄外,指令也可以自動(dòng)補(bǔ)齊喔。例如,你要下指令 ifconfig,您可以只打 ifc 再按 Tab 鍵,tcsh 會(huì)自動(dòng)補(bǔ)成 ifconfig。如果您只打 if 即按 Tab 鍵,您會(huì)發(fā)現(xiàn)并沒有任何動(dòng)作,因?yàn)樵谙到y(tǒng)中,除了 ifconfig 外,還有指令開頭也是 if,如 ifmcstat。
3.3 文書編輯器
因?yàn)樵S多系統(tǒng)設(shè)定都必須修改設(shè)定檔,而修改設(shè)定文件必須使用文書編輯軟件,所以在開始所有設(shè)定之前,讓我們先來了解文書編輯器的用法。
我們將介紹 FreeBSD 內(nèi)附的二套文書編輯軟件 ee 及 vi。這二套軟件都是在命令列模式下使用的軟件,ee 是一套比較適合初學(xué)者的編輯器,它的使用方式和我們一般的使用習(xí)慣較接近,操作簡(jiǎn)單又容易上手。不過 ee 是 FreeBSD 特有的編輯軟件,在其它的 UNIX 系統(tǒng)中無法使用。因此,我們也將介紹另一套所有 UNIX 系統(tǒng)都內(nèi)附的編輯器 vi。
vi 是一套威力強(qiáng)大的工具,操作熟練的人會(huì)覺得如有神助,而對(duì)于初學(xué)者而言卻是望之卻步。是否要將 vi 練到出神入化見人見智,但對(duì)于一個(gè) UNIX 系統(tǒng)管理者而言,我們至少要知道一些基本的操作方式。
3.3.1 ee
ee 是 FreeBSD 系統(tǒng)內(nèi)附較適合初學(xué)者的文書編輯軟件,它是 Easy Editor 的簡(jiǎn)稱,顧名思義 ee 使用上十分容易。當(dāng)您要編輯檔案 example.txt 時(shí),只要在命令列上打 ee example.txt 即可。執(zhí)行 ee 之后將會(huì)出現(xiàn)下列畫面:
圖 3-2
在畫面最上方有使用說明,幾乎我們所有的會(huì)使用到的功能都在最上方的說明中。您可以使用上下左右鍵來移動(dòng)游標(biāo),并直接輸入內(nèi)容,以下為 ee 的指令說明,請(qǐng)注意我們將鍵盤上獨(dú)立的按鍵以小于及大于的符號(hào)括起來,例如 <Ctrl> 表示鍵盤上 Ctrl 這個(gè)鍵:
按鍵 | 意義 |
<Ctrl> + [ 或 <ESC> 鍵 | 顯示主選單。 |
<Ctrl> + o | 輸入 ASCII code,例如輸入 65 就會(huì)顯示 A。 |
<Ctrl> + u | 跳到檔案結(jié)尾。 |
<Ctrl> + t | 跳到檔案開頭。 |
<Ctrl> + c | 輸入指令。在按了 Ctrl+c 后,上方選單會(huì)出現(xiàn)命令說明,例如您可以直接輸入數(shù)字,表示將光標(biāo)移到某一行。 |
<Ctrl> + y | 搜尋。按了 Ctrl+y 之后,你可以輸入欲搜尋的字符串。如果要搜尋下一個(gè)該字符串,只要再按 Ctrl+x 即可。預(yù)設(shè)的搜尋是不分大小寫的,如果要區(qū)分大小寫,您可以按 Ctrl+c 并輸入 case 即可。如果要取消只要再按 Ctrl+c 并輸入 nocase。 |
<Ctrl> + a | 跳到行首。 |
<Ctrl> + e | 跳到行尾。 |
<Ctrl> + d | 刪除光標(biāo)所在位置的字符。 |
<Ctrl> + j | 貼上上一次所刪除的字符。 |
<Ctrl> + k | 刪除光標(biāo)所在位置的一整行。 |
<Ctrl> + l | 貼上上一次刪除的一整行內(nèi)容。 |
<Ctrl> + w | 刪除一個(gè)字。 |
<Ctrl> + r | 貼上上一次所刪除的字。 |
<Ctrl> + p | 將光標(biāo)移到上一行。 |
<Ctrl> + n | 將光標(biāo)移到下一行。 |
<Ctrl> + b | 將光標(biāo)移到上一個(gè)字,和方向鍵左鍵一樣。 |
<Ctrl> + f | 將光標(biāo)移到下一個(gè)字,和方向鍵右鍵一樣。 |
<Ctrl> + g | 下一頁。 |
<Ctrl> + v | 上一頁。 |
<Ctrl> + z | 移到下一個(gè)字。 |
<Esc> + <Enter> | 離開 ee。如果檔案有修改過,它會(huì)問您是否要儲(chǔ)存檔案。 |
當(dāng)我們按了 <Esc> 鍵時(shí),會(huì)出現(xiàn)一個(gè)主選單,在選單中我們可以進(jìn)行一些設(shè)定,如果您儲(chǔ)存這些設(shè)定,它會(huì)被存在您的 home 目錄下的 .init.ee,以 root 為例,設(shè)定檔會(huì)存放在 /root/.init.ee。如果您要還原默認(rèn)值,只需將該檔刪除即可。
3.3.2 vi
Vi 是一個(gè)歷史悠久且功能強(qiáng)大的 UNIX 文書編輯器。在古早的年代,許多鍵盤都只有一些基本按鍵,連上下左右鍵都沒有,所以 vi 大多數(shù)的功能都必須使用一些特殊的按鍵。
Vi 在使用時(shí)可以分成二種模式,一種是「編輯模式」,另一種則為「命令模式」。在編輯模式時(shí),我們可以使用上下左右鍵來移動(dòng)光標(biāo)并編輯輸入我們所要編輯的文字內(nèi)容。而命令模式時(shí),我們可以進(jìn)行檔案操作 (開文件、存盤等)、搜尋等功能。使用 vi 時(shí),我們會(huì)很常按 <Esc> 鍵,<Esc> 鍵可以讓我們離開編輯模式并進(jìn)入命令模式。請(qǐng)執(zhí)行 vi example.txt 來編輯 example.txt 這個(gè)檔案,一進(jìn)入 vi 時(shí),預(yù)設(shè)會(huì)處于命令模式,我們必需先輸入 "o"、"i"、或"a"才能進(jìn)入編輯模式。
以下即為進(jìn)入編輯模式的指令:
按鍵 | 意義 |
i | Insert (插入),在目前光標(biāo)前開始輸入。 |
a | Append (附加),在目前光標(biāo)后開始輸入。 |
o | 在光標(biāo)下方新增一空白行并開始編輯。 |
O | 在光標(biāo)上方新增一空白行并開始編輯。 |
如果您輸入錯(cuò)誤,您無法使用 <Delete> 或 <Backspace> 來刪除,我們必須使用 vi 的其它命令來進(jìn)行。請(qǐng)先按 <Esc> 來進(jìn)入命令模式,接著您就可以使用下列指令來進(jìn)行進(jìn)階編輯:
按鍵 | 意義 |
x | 刪除光標(biāo)所在位置的字符。 |
dw | 刪除游標(biāo)所在到字尾,即刪除一個(gè)字。 |
dd | 刪除游標(biāo)所在一整行。 |
d + 數(shù)字 + <Enter> | 刪除從光標(biāo)所在位置到其下方 n 行。例如輸入 d5 <Enter>,將刪除光標(biāo)所在位置起 6 行。 |
yw | 復(fù)制光標(biāo)開始到字尾。 |
yy | 復(fù)制游標(biāo)所在一整行。 |
y + 數(shù)字 + <Enter> | 復(fù)制從光標(biāo)所在位置到其下方 n 行。例如輸入 y4 <Enter>,將復(fù)制光標(biāo)所在位置起 5 行。 |
p | 貼上上一次復(fù)制的內(nèi)容。 |
:w <Enter> | 存檔。 |
:w 文件名稱 <Enter> | 另存新檔。您必輸在 w 后輸入新的檔名。 |
:q <Enter> | 離開 vi。如果檔案有修改過會(huì)無法離開。 |
:wq <Enter> | 存檔并離開。 |
:q! <Enter> | 不存檔并離開。 |
接下來我們說明一下如何在檔案中穿梭移動(dòng):
按鍵 | 意義 |
h | 游標(biāo)向左移。 |
j | 游標(biāo)向下移。 |
k | 游標(biāo)向上移。 |
l | 游標(biāo)向右移。 |
^ | 跳到行首。 |
$ | 跳到行尾。 |
w | 游標(biāo)跳到下個(gè)字的開頭。 |
e | 游標(biāo)跳到下個(gè)字的結(jié)尾。 |
b | 游標(biāo)跳到上個(gè)字的開頭 |
<Ctrl> + d | 光標(biāo)往下移動(dòng)半個(gè)屏幕。 |
<Ctrl> + u | 光標(biāo)往上移動(dòng)半個(gè)屏幕。 |
<Ctrl> + f | 光標(biāo)往上移動(dòng)一個(gè)屏幕。 |
<Ctrl> + b | 光標(biāo)往下移動(dòng)一個(gè)屏幕。 |
:數(shù)字 <Enter> | 跳到 n 行,例如輸入 :100 即可將光標(biāo)移到第 100 行。 |
/欲搜尋的字符串 <Enter> | 輸入 / 后,您可以在 / 后輸入所要搜尋的字符串,如果要找下一個(gè),則直接按 / <Enter> 即可。 |
只要您熟悉了上列指令,您大概就可以很輕松的使用 vi 了。Vi 還有許多功能,你可以 man vi 來獲得更多信息。
3.4 Shell 環(huán)境簡(jiǎn)介
在 UNIX 系統(tǒng)中,使用者對(duì)于系統(tǒng)的操作是透過 "Shell",Shell 就好像是 DOS 中的 command.com 或 Windows 中的 explorer.exe。Shell 在接收到指令之后,會(huì)將它轉(zhuǎn)換成機(jī)器可以讀的語法來對(duì)系統(tǒng)進(jìn)入操作。
FreeBSD 內(nèi)附的 Shell 有 sh、csh、tcsh,sh 名為 Bourne Shell,它是 UNIX 系統(tǒng)中最悠久的 shell,所有的 UNIX 系統(tǒng)都會(huì)內(nèi)附這個(gè) shell,我們?cè)趯?shell scripts 時(shí)為了可移植性,大多使用 sh。在 FreeBSD 中 csh 和 tcsh 是一樣的東西,csh 名稱的由來是因?yàn)樗?scripts 語法和 C 語言很像。至于要使用哪一種 shell 全憑個(gè)人偏好,您也可以自行從 ports 中安裝 Linux 用的 bash 或 ksh。
以筆者個(gè)人而言,我偏好使用 tcsh,它除了有 3.2 節(jié)中提及的使用 <Tab> 鍵自動(dòng)完成檔名外,最重要的一點(diǎn)是它會(huì)自動(dòng)搜尋上一次輸入的指令 (history-search-backward)。
例如,我們輸入下列指令:
# ls /usr/port/www # cd /usr/port/www # cd /usr
在輸入上述指令后,現(xiàn)在我們?nèi)绻褂面I盤方向鍵按上,將出現(xiàn)上一次所輸入的指令內(nèi)容。如果我們先打了 ls 再按方向鍵上,則 tcsh 會(huì)自動(dòng)找出最近輸入過開頭為 ls 的指令,多按幾次上它還會(huì)繼續(xù)出現(xiàn)上上一次輸入過的 ls 指令,很棒吧。
如果您想變更自己所使用的 Shell,可以執(zhí)行下列指令:
# # chsh -s /bin/tcsh
上述指令中,我們將所使用的 Shell 變更成 /bin/tcsh。請(qǐng)注意,您所輸入的 shell 名稱一定要存在于 /etc/shells 這個(gè)檔中。系統(tǒng)預(yù)設(shè)的 shell 有 /bin/sh、/bin/csh、/bin/tcsh。 如果想使用自行安裝的 shell,您必須先將該 shell 的路徑加入 /etc/shells 中才可以使用。
3.4.1 Shell 的環(huán)境變量
在 Shell 有所謂的環(huán)境變量,當(dāng)我們?cè)?shell 中執(zhí)行指令時(shí),這些環(huán)境變量可能會(huì)被該程序用來判斷程序所要執(zhí)行時(shí)的參數(shù)。例如,我們?cè)趫?zhí)行 cal 這個(gè)指令時(shí),我們不必打它的絕對(duì)路徑 /usr/bin/cal,因?yàn)?shell 會(huì)自動(dòng)依照 PATH 這個(gè)環(huán)境變量所設(shè)定的路徑去找我們所輸入的指令。您可以使用下列指令來看目前 PATH 這個(gè)變量的內(nèi)容:
# echo $PATH /sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin
如果您使用 tcsh,您也可以打 setenv 來看目前所有的環(huán)境變量。以下為一些常用的環(huán)境變量:
變量名稱 | 描述 |
USER | 目前所使用的使用者名稱。 |
PATH | 執(zhí)行指令所要搜尋的位置,以冒號(hào)隔開。 |
SHELL | 目前所使用的 Shell。 |
TERM | 目前所使用的終端機(jī)模式。 |
OSTYPE | 操作系統(tǒng)名稱。 |
MACHTYPE | 系統(tǒng)所使用的 CPU 架構(gòu)。 |
PAGER | 當(dāng)需要分頁時(shí),所要使用的分頁軟件,如 more 或 less。 |
EDITOR | 預(yù)設(shè)所要使用的編輯器。 |
您也可以使用 setenv 來改變一個(gè)環(huán)境變量的值。例如,我們要將預(yù)設(shè)的文書編輯器改成 ee,在 tcsh 中可以使用:
# setenv EDITOR ee
如果您使用的是 Bourne Shell:
# export EDITOR="ee"
3.4.2 Tcsh 的環(huán)境設(shè)定
登入系統(tǒng)后,您會(huì)發(fā)現(xiàn)在光標(biāo)之前有一個(gè)井字號(hào) "#",這個(gè)井字號(hào)我們稱之為提示符號(hào) (prompt)。在 tcsh 及 csh 中,當(dāng)以 root 登入時(shí),預(yù)設(shè)的提示符號(hào)是 "#",而以一般使用者登入時(shí),提示符號(hào)為 "%"。
FreeBSD 安裝好后,我們必須做一些設(shè)定讓 FreeBSD 使用起來更順手。在預(yù)設(shè)的況狀下,系統(tǒng)并不支持中文文件名,對(duì)于使用中文的人不太方便。另外,命令列提示符號(hào)的樣子也不符合我們的需求。如果你想要客制化一些指令,也可以在這里加上去。所以在開始進(jìn)行其它設(shè)定之前,我們先建立一個(gè)良好的使用環(huán)境。
在使用者登入后,Tcsh 會(huì)先去讀取 /etc/csh.cshrc 及 /etc/csh.login 的設(shè)定,接著會(huì)讀取該使用者家目錄下的 .cshrc 及 .login。因此,我們可以經(jīng)由設(shè)定這幾個(gè)檔案讓設(shè)定使用者一登入時(shí)就生效。
首先編輯 /etc/csh.cshrc 加入下列設(shè)定:
setenv EDITOR ee alias ls ls -F set prompt = "%B%m [%~] -%n-> " |
第一行設(shè)定是將預(yù)設(shè)的文書編輯器改成 ee。第二行是要將指令 ls 變成 ls -F,就是每次打 ls 時(shí),系統(tǒng)會(huì)出現(xiàn) ls -F 的效果。而第三行是將命令列的提示符號(hào)改成下面這樣:
mydomain [/home/john] -john->
就是開頭是機(jī)器名稱,再來是路徑名稱,最后是使用者名稱。
由于在 /etc 下的 csh.cshrc 是通用的設(shè)定,但如果使用者自己的設(shè)定和通用設(shè)定一樣時(shí),會(huì)以使用者的設(shè)定為主。例如,在一般使用者的家目錄下的 .cshrc 也有一行編輯器的設(shè)定,當(dāng)設(shè)定不同時(shí),會(huì)以使用者目錄下的設(shè)定為主。因此,我們必須再編輯 ~/.cshrc,并找到setenv EDITOR vi 換成 setenv EDITOR ee 設(shè)定才會(huì)生效。
如果您希望日后每個(gè)新增的使用者的設(shè)定都是這樣,則必須修改 /usr/share/skel/dot.cshrc 檔案,該檔內(nèi)容的修改和修改 ~/.cshrc 一樣,把 vi 換成 ee ,并加入 alias ls ls -F。因?yàn)樵谑褂?adduser 指令新增使用者時(shí),它會(huì)問你是否要將 /usr/share/skel/dot.file 復(fù)制到使用者目錄下,因此我們就修改這里,讓日后新增使用者時(shí)能使用該設(shè)定。
/etc/csh.cshrc 和 /etc/csh.login 的差別在于如果是使用者登入,二個(gè)檔案都會(huì)被執(zhí)行,如果是 scripts 則只會(huì)去讀取 csh.cshrc。我們接下來要讓使用者登入后可以支持中文的 console 環(huán)境,所以我們編輯 /etc/csh.login 并在最后面加入以下的設(shè)定:
setenv ENABLE_STARTUP_LOCALE zh_TW.Big5 # 若是使用遠(yuǎn)程登入時(shí),才能打出中文 # 4.x 請(qǐng)?jiān)O(shè)定為 is_IS.ISO_8859-1,5.x 為 is_IS.ISO8859-1 setenv LC_CTYPE is_IS.ISO8859-1 # 若是console下用,才能打出中文 setenv LANG zh_TW.Big5 |
上述的環(huán)境變量設(shè)定會(huì)在使用者登入時(shí)自動(dòng)被加載,一些程序 (例如 date) 會(huì)自動(dòng)讀取這些變量,并產(chǎn)生中文的訊息。不過由于我們的 console 尚未支持中文,我們必須先安裝中文終端機(jī)軟件,或在支持中文的 PC 上使用 telnet 登入。別急,我們會(huì)在下面幾節(jié)中說明如何安裝中文終端機(jī)。
3.5 FreeBSD 的目錄結(jié)構(gòu)
在 Windows 操作系統(tǒng)中,在檔案總管中可以看到 Windows 的 "樹狀" 目錄結(jié)構(gòu)。而 FreeBSD 中的目錄也是像一顆樹,一個(gè)目錄下還有很多個(gè)目錄,和 Windows 不同的是在 UNIX 系統(tǒng)中每一個(gè)目錄都有一定用途。我們了解 FreeBSD 目錄結(jié)構(gòu)的用意就是讓我們知道每個(gè)目錄的用途,日后我們要安裝新軟件或使用 FreeBSD 時(shí),能按照這種規(guī)則來做,這樣一來在管理維護(hù)上比較方便,目錄也會(huì)比較有條理。
以下我們就簡(jiǎn)單的說明 FreeBSD 的目錄結(jié)構(gòu),您也可以使用指令 man hier 來查看目錄結(jié)構(gòu)說明。
目錄名稱 | 說明 |
/ | UINX 系統(tǒng)的根目錄,是目錄的最上層。 |
/bin/ | 放置基本的使用者指令,是開機(jī)時(shí)必備的。 |
/boot/ | 系統(tǒng)開機(jī)時(shí)必需用到的設(shè)定。 |
/dev/ | UNIX 系統(tǒng)將外圍設(shè)備視為檔案來管理,這個(gè)目錄就是放置裝置節(jié)點(diǎn)文件 (device node)。在 FreeBSD 5.0 以前 /dev/MAKEDEV 可以使用管理這些節(jié)點(diǎn)檔的工具。5.0 以后這些 device node 都改由 devfs 來管理。 |
/etc/ | 放置系統(tǒng)的設(shè)定文件,例如使用者密碼、群組等。 |
/etc/defaults/ | 放置預(yù)設(shè)的系統(tǒng)設(shè)定文件。請(qǐng) man rc。 |
/etc/gnats/ | gnats 的設(shè)定檔,請(qǐng) man send-pr。 |
/etc/isdn/ | isdn 的設(shè)定檔,請(qǐng) man isdnd。 |
/etc/kerberosIV/ | kerberos version IV 的設(shè)定檔,請(qǐng) man kerberos。 |
/etc/mail/ | Sendmail 的設(shè)定檔。 |
/etc/mtree/ | 目錄權(quán)限的設(shè)定文件,請(qǐng) man mtree。 |
/etc/namedb/ | DNS 服務(wù)器的設(shè)定檔,請(qǐng) man named。 |
/etc/periodic/ | 每天、每周、每月定時(shí)要執(zhí)行的設(shè)定,請(qǐng) man periodic。 |
/etc/ppp/ | ppp 的設(shè)定檔,請(qǐng) man ppp。 |
/etc/ssl/ | OpenSSL 的設(shè)定檔。 |
/kernel | 開機(jī)時(shí)系統(tǒng)會(huì)加載的核心 (kernel)。在 FreeBSD 5.x 中,kernel 這個(gè)文件已被放在 /boot 目錄中。 |
/modules/ | Kernel 可以加載的模塊,請(qǐng) man kldstat。在 FreeBSD 5.x 中, 這個(gè)目錄已被放在 /boot 目錄中。 |
/mnt/ | 空目錄,我們可以用它來作為暫時(shí) mount 檔案系統(tǒng)。 |
/proc/ | 系統(tǒng)執(zhí)行中程序 (process) 數(shù)據(jù),請(qǐng) man procfs mount_procfs。 |
/root/ | 超級(jí)使用者 root 的家目錄。 |
/sbin/ | 系統(tǒng)程序及管理工具的目錄。 |
/stand/ | 這是安裝磁盤上的指令。 |
/tmp/ | 暫存目錄,許多程序都會(huì)需要暫存目錄來存放數(shù)據(jù)。開機(jī)時(shí)會(huì)清除。 |
/usr/ | 包含主要的使用者工具及應(yīng)用軟件。您可以把它看成 Windows 中的 windows 目錄及 program file 目錄的集合。 |
/usr/bin/ | 一般的使用者指令及應(yīng)用軟件。 |
/usr/games/ | 一些小游戲。 |
/usr/include/ | 標(biāo)準(zhǔn) C 語言的標(biāo)頭文件。 |
/usr/lib/ | 系統(tǒng)函式庫。 |
/usr/libdata/ | 一些系統(tǒng)工具的數(shù)據(jù)庫。 |
/usr/libexec/ | 系統(tǒng)服務(wù)程序 (daemons) 及工具。 |
/usr/local/ | 非 FreeBSD 所附的軟件都會(huì)安裝在這個(gè)目錄下,我們?cè)诎惭b軟件時(shí)最好都安裝在這個(gè)目錄。您可以將它視為 Windows 操作系統(tǒng)中的 program file 目錄。這個(gè)目錄中也有 bin sbin etc lib 等目錄。 |
/usr/obj/ | 在編譯 FreeBSD 系統(tǒng)時(shí)存放過程中暫存盤的位置。 |
/usr/ports/ | FreeBSD ports 移植軟件的原始程序目錄,我們可以從這個(gè)目錄中找到自己想要的軟件來快速安裝。 |
/usr/sbin/ | 可以讓使用者執(zhí)行的系統(tǒng)服務(wù)及工具。 |
/usr/share/ | 系統(tǒng)軟件共享的數(shù)據(jù)庫。 |
/usr/src/ | 放置 BSD 或其它軟件原始程序代碼的目錄。 |
/usr/X11R6/ | X Windows 的目錄。 |
/var/ | 放置系統(tǒng)記錄文件、暫存盤的目錄。 |
/var/account/ | 使用者執(zhí)行過的指令記錄文件,請(qǐng) man acct。 |
/var/at/ | 定時(shí)執(zhí)行排程的數(shù)據(jù)文件。請(qǐng) man at。 |
/var/backups/ | 系統(tǒng)重要檔案的備份區(qū)。 |
/var/cron/ | 使用者排程的數(shù)據(jù)表,請(qǐng) man cron。 |
/var/db/ | 重要的系統(tǒng)數(shù)據(jù)庫。 |
/var/games/ | 內(nèi)附的游戲紀(jì)錄文件。 |
/var/log/ | 系統(tǒng)記錄文件,我們可以在這里查看系統(tǒng)狀況記錄。 |
/var/mail/ | 使用者信件暫存區(qū)。 |
/var/preserve/ | 文件編輯時(shí)異常中止時(shí),會(huì)將文件存到這個(gè)目錄,請(qǐng) man ex。 |
/var/msgs/ | 系統(tǒng)訊系的數(shù)據(jù)庫,請(qǐng) man msgs。 |
/var/quotas/ | 檔案系統(tǒng)使用容量限制的記錄。 |
/var/run/ | 記錄系統(tǒng)開機(jī)后執(zhí)行狀態(tài)的暫存區(qū)。請(qǐng) man utmp。 |
/var/spool/ | 列表機(jī)或郵件輸出時(shí)的緩沖區(qū)。 |
/var/tmp/ | 系統(tǒng)暫存區(qū),開機(jī)時(shí)不會(huì)清除。 |
/var/yp/ | the NIS maps。 |
3.6 使用者及權(quán)限管理
由于 FreeBSD 和所有的 UNIX 系統(tǒng)一樣,在設(shè)定上都是為了支持多個(gè)使用者的環(huán)境,所以在使用者管理上必須考量到多個(gè)使用者同時(shí)使用時(shí)所會(huì)造成的影響。例如使用者 A 不可以刪除使用者 B 的數(shù)據(jù),某些使用者可以存取某些數(shù)據(jù)夾,某些則否。為了讓系統(tǒng)管理更有效率,在支持多人使用的操作系統(tǒng)中,都有群組及權(quán)限的觀念。
在 UNIX 系統(tǒng)中,每個(gè)使用者「至少」會(huì)屬于一個(gè)群組,我們可以針對(duì)不同使用者或不同群組來設(shè)定他們?cè)谙到y(tǒng)中的使用權(quán)限。例如,我們有一個(gè)使用者名為「豬小弟」,他的群組是「小豬」,我們讓小豬群組可以進(jìn)入豬圈這個(gè)數(shù)據(jù)夾。同時(shí)由于豬小弟生病了,需要吃藥,所以我們將它加入「病豬」群組,所有病豬都可以吃特別的飼料,其它健康的豬只則禁止存取。如此一來,我們就不必一只一只去設(shè)定每只豬及每個(gè)數(shù)據(jù)夾的權(quán)限,下次新增一個(gè)特別飼料時(shí),只要設(shè)定只有病豬可以存取即可。
所以我們?cè)谛略鍪褂谜邥r(shí),必須指定他的群組,預(yù)設(shè)的群組是一個(gè)和使用者同名的新群組,我們先來看看新增使用者的過程,請(qǐng)使用指令 adduser 來新增使用者。系統(tǒng)會(huì)問您一些問題:
# adduser Username: jack |
執(zhí)行了 adduser 之后,首先要輸入使用者名稱,使用者名稱除了英文字、數(shù)字及 -_ 外不可以包含其它特殊字符。
Full name: Jack |
接著我們要輸入使用者全名,這個(gè)字段可以是空的,如果您不輸入則直接按 Enter 即可。
Uid (Leave empty for default): |
這個(gè)字段是使用者編號(hào),直接留白按 Enter 即可,系統(tǒng)會(huì)自動(dòng)指定。
Login group [jack]: |
輸入使用者群組名稱,群組名稱預(yù)設(shè)會(huì)自動(dòng)產(chǎn)生一個(gè)和新增的使用者同名的群組,如果要使用不同的群組,必須先手動(dòng)新增群組。我們直接按 Enter 即可。
Login group is jack. Invite jack into other groups? []: wheel |
是否要將新的使用者加入其它群組,由于這是我們新增的第一個(gè)一般使用者,所以我們將它加入系統(tǒng)管理者 wheel 這個(gè)群組,讓他可以使用 su 這個(gè)指令來切換身份成 root。
Login class [default]: |
登入的類別,這是用來分類控制使用者對(duì)于系統(tǒng)資源的使用,請(qǐng)參考第五章系統(tǒng)資源限制的說明。在這里我們直接按 Enter 使用默認(rèn)值即可。
Shell (sh csh tcsh nologin) [sh]: tcsh |
輸入所要使用的 Shell,建議輸入 tcsh,如果您不想讓該使用者登入系統(tǒng),可以輸入 nologin。
Home directory [/home/jack]: |
輸入使用者的家目錄,也就是使用者在系統(tǒng)中的數(shù)據(jù)夾,所有使用者的目錄我們都放在 /home 下,所以我們直接按 Enter 即可。
Use password-based authentication? [yes]: |
是否要使用密碼認(rèn)證的方式,預(yù)設(shè)為是,我們直接按 Enter 即可。
Use an empty password? (yes/no) [no]: |
是否要使用空密碼,預(yù)設(shè)為否。
Use a random password? (yes/no) [no]: |
是否使用隨機(jī)產(chǎn)生的密碼,如果使用隨機(jī)產(chǎn)生的密碼,在新增完畢后,系統(tǒng)會(huì)告知我們產(chǎn)生的密碼,預(yù)設(shè)為否。
Enter password: |
輸入該使用者的密碼。
Enter password again: |
再輸入一次密碼,以確認(rèn)輸入無誤。
Lock out the account after creation? [no]: |
在新增完使用者后,是否要先將該賬戶關(guān)閉。
最后會(huì)顯示我們剛才輸入的結(jié)果:
Username : jack Password : ***** Full Name : Jack Uid : 1003 Class : Groups : jack Home : /home/jack Shell : /bin/tcsh Locked : no OK? (yes/no): y |
如果全部 ok 則輸入 y。
adduser: INFO: Successfully added (jack) to the user database. Add another user? (yes/no): n Goodbye! |
最后系統(tǒng)會(huì)詢問我們是否要新增另一個(gè)使用者,如果沒有則按 n 離開。
新增完使用者后,我們可以看到 /home 目錄下多了一個(gè)使用者 jack 的目錄:
# ls -la /home drwxr-xr-x 10 root wheel 512 3 21 16:12 ./ drwxr-xr-x 21 root wheel 512 1 14 06:29 ../ drwxr-xr-x 13 jack jack 1024 3 21 16:05 jack/ |
"." 及 ".." 這二個(gè)目錄分別代表著目前所在的目錄及上一層目錄,我們可以看到它的擁有者是 root,群組是 wheel。而 jack 這個(gè)目錄的目錄的擁有者是 jack,其群組也是 jack。
在 ls 結(jié)果的第一個(gè)字段表著該檔案或目錄的存取權(quán)限,該字段共有十個(gè)字符,第一個(gè)字符表示檔案的類型,以 jack 這個(gè)目錄為例,它的類型是目錄,所以第一個(gè)字是 d,如果是一般的檔案,則第一個(gè)字是 - 。接下來的九個(gè)字符,以三個(gè)為單位,分別代表著使用者 (User)、群組 (Group)、及其它人 (Others) 的權(quán)限:
我們看到 jack 這個(gè)目錄,它的權(quán)限是 rwxr-xr-x,前三個(gè)字 rwx 表示使用者 jack 對(duì)于這個(gè)目錄有讀取、寫入及進(jìn)入目錄的權(quán)限;接下來的 r-x 表示 jack 群組可以讀取及進(jìn)入該目錄,但無法寫入數(shù)據(jù);最后三個(gè) r-x 表示其它使用者可以讀取、進(jìn)入該目錄。
使用者的權(quán)限除了可以使用 rwx 來表示外,我們也可以使用數(shù)字來設(shè)定權(quán)限。假設(shè)檔案擁有者的權(quán)限為 rwx,由于 r 代表的數(shù)字是 4、w 是 2、x 是 1,所以檔案擁有者的權(quán)限就是 4+2+1,也就是 7。同理,如果群組的權(quán)限是 r-x,則數(shù)字表示為 4+0+1,也就是 5。如果我們要將權(quán)限設(shè)成 rwxr-xr--,則數(shù)字就是 754,如下圖所示:
圖 3-3
假設(shè)我們要更改檔案 file.txt 的權(quán)限為 rwxr-xr-- (754),我們可以使用 chmod 這個(gè)指令:
# chmod 754 file.txt
我們上面提及的權(quán)限都是以三位數(shù)字來表示,另外我們也可以使用四位數(shù)字表示。所謂的四位數(shù)字是指在原本的三位數(shù)之前加上一個(gè)關(guān)于檔案形態(tài)的設(shè)定。
假設(shè)我們要設(shè)定檔案 myfile 可以被所有人讀、寫、執(zhí)行,并設(shè)定 sticky:
# chmod 1777 myfile
除了使用數(shù)字一次設(shè)定權(quán)限之外,我們也可以分別針對(duì)檔案的使用者、群組及其它人來設(shè)定權(quán)限。chmod 這個(gè)指令在權(quán)限的參數(shù)部份,除了使用數(shù)字外,也可以使用 (對(duì)誰)(做什么動(dòng)作)(權(quán)限) 這種語法。
項(xiàng)目 | 使用的字符 | 代表意義 |
對(duì)誰 | u | 使用者 (User) |
對(duì)誰 | g | 群組 (Group) |
對(duì)誰 | o | 其它人 (Others) |
對(duì)誰 | a | 所有人 (All) |
做什么動(dòng)作 | + | 增加權(quán)限 |
做什么動(dòng)作 | - | 移除權(quán)限 |
做什么動(dòng)作 | = | 直接設(shè)定權(quán)限 |
權(quán)限 | r | 讀取 |
權(quán)限 | w | 寫入 |
權(quán)限 | x | 執(zhí)行 |
權(quán)限 | t | Sticky |
權(quán)限 | s | Set UID 或 GID |
例如,我們要設(shè)定其它人對(duì)檔案 file.txt 只有讀取及執(zhí)行的權(quán)利:
# chmod o=rx file.txt
更多 chmod 的用法,請(qǐng)參考第二十章指令應(yīng)用。
3.7 系統(tǒng)服務(wù)及行程管理
FreeBSD 和其它常用的操作系統(tǒng)一樣都是多任務(wù)的環(huán)境,我們可以同時(shí)執(zhí)行數(shù)個(gè)工作,例如同時(shí)聽音樂、開瀏覽器上網(wǎng)。在系統(tǒng)一開機(jī)后,便會(huì)自動(dòng)執(zhí)行許多程序來維持系統(tǒng)的正常運(yùn)作。這些正在執(zhí)行的程序我們稱之為行程 (process)。
3.7.1 行程
每一個(gè)行程都有一個(gè)與眾不同的編號(hào),稱之為 process id (PID)。所有正在執(zhí)行中的程序都需要使用到一些系統(tǒng)資源,例如內(nèi)存、CPU 等等,PID 的做用就是讓系統(tǒng)可以根據(jù)這一個(gè)獨(dú)特的編號(hào)來做資源的調(diào)配及工作排程。當(dāng)我們?cè)谶M(jìn)行管理這些程序時(shí),也必須要依照 PID 來區(qū)分不同的行程。
幾乎所有的行程都是由其它程序所呼叫執(zhí)行的,這個(gè)呼叫、執(zhí)行一個(gè)新的行程的人是該行程的 parent。例如當(dāng)我們執(zhí)行了 ls 時(shí),ls 這個(gè)行程的 parent 就是我們當(dāng)時(shí)所使用的 shell。唯沒有 parent 的例外是 init 這支程序。當(dāng) FreeBSD 開機(jī)執(zhí)行完系統(tǒng)核心程序之后,會(huì)自動(dòng)執(zhí)行 init 這支程序,由于這是開機(jī)后所執(zhí)行的第一支程序,所以它的 PID 是 1。init 執(zhí)行之后,會(huì)再呼叫其它程序,例如 /etc/rc 來啟動(dòng)開機(jī)必須執(zhí)行的系統(tǒng)設(shè)定等。
每一個(gè)行程和檔案、目錄一樣,都有行程的擁有者及群組。程序執(zhí)行之后,可能必須要開啟某些檔案或?qū)τ谙到y(tǒng)裝置進(jìn)行存取,而使用這些資源時(shí),即是以該行程的擁有者及群組的身份進(jìn)行存取。
我們可以使用 ps 這支程序來取得行程的信息,以下即為 ps 指令的輸出結(jié)果:
# ps PID TT STAT TIME COMMAND 77393 p0 ILs 0:00.02 login [pam] (login) 78056 p0 IL 0:00.02 su 78057 p0 SL 0:00.02 _su (tcsh) 78074 p0 RL+ 0:00.00 ps 89678 v0 ILs+ 0:00.01 /usr/libexec/getty Pc ttyv0 78073 v1 SLs+ 0:00.01 /usr/libexec/getty Pc ttyv1 616 v2 ILs+ 0:00.00 /usr/libexec/getty Pc ttyv2 617 v3 ILs+ 0:00.00 /usr/libexec/getty Pc ttyv3 618 v4 ILs+ 0:00.00 /usr/libexec/getty Pc ttyv4 619 v5 ILs+ 0:00.00 /usr/libexec/getty Pc ttyv5 620 v6 ILs+ 0:00.00 /usr/libexec/getty Pc ttyv6 621 v7 ILs+ 0:00.00 /usr/libexec/getty Pc ttyv7 |
我們可以看到第一個(gè)字段是 PID,它的范圍從 1 到 99999,當(dāng)用完了 99999 后,系統(tǒng)會(huì)自動(dòng)從頭開始找一個(gè)沒人用的 PID 來使用。TT 這個(gè)字段是我們正在使用的 tty,如果是在 console 前執(zhí)行的執(zhí)令,則 tty 為 ttyvX,如果是 telnet 到系統(tǒng)中,則 tty 為 ttypX。STAT 字段為目前該程序的狀態(tài)。TIME 則是該程序所使用的 CPU 時(shí)間。最后的字段 COMMAND 則是該程序被執(zhí)行時(shí)所下的指令。
除了 ps 之外,我們也可以使用 top 來查看所有行程的狀態(tài):
# top last pid: 78151; load averages: 1.11, 1.04, 1.01 up 27+14:45:03 18:02:07 51 processes: 3 running, 48 sleeping CPU states: 0.2% user, 96.8% nice, 1.5% system, 1.5% interrupt, 0.0% idle Mem: 114M Active, 45M Inact, 64M Wired, 12M Cache, 34M Buf, 7952K Free Swap: 512M Total, 372K Used, 512M Free PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND 235 root 96 0 1616K 1044K select 114:50 0.05% 0.05% natd 425 root 96 0 9644K 4836K select 2:02 0.00% 0.00% httpd 4872 root 96 0 3900K 2048K select 1:40 0.00% 0.00% top 470 root 96 0 3776K 2240K select 1:39 0.00% 0.00% sendmail 290 root 96 0 1312K 764K select 0:30 0.00% 0.00% syslogd 490 root 8 0 1336K 864K nanslp 0:17 0.00% 0.00% cron |
top 這個(gè)指令會(huì)每二秒自動(dòng)更新一次。我們可以看到 top 的輸出分成二個(gè)部份,最上方是目前關(guān)于行程的的系統(tǒng)狀態(tài)。包含最后一個(gè) PID (last pid)、系統(tǒng)負(fù)荷 (load average) 、已開機(jī)時(shí)間 (up)、總共有多少行程正在執(zhí)行中、及 CPU 和內(nèi)存的使用量等等。第二個(gè)部份和 ps 一樣,列出 PID、行程的擁有者、及其它和行程相關(guān)的狀態(tài)。其它更多關(guān)于 ps 及 top 的用法,請(qǐng)參考第二十章指令應(yīng)用。
3.7.2 系統(tǒng)服務(wù)及行程管理
我們每執(zhí)行一個(gè)指令,都會(huì)產(chǎn)生一個(gè)新的行程,有的程序在執(zhí)行完畢后,就會(huì)結(jié)束離開;而有的程序會(huì)常駐在系統(tǒng)中。例如當(dāng)我們執(zhí)行 ls 這個(gè)指令時(shí),會(huì)產(chǎn)生一個(gè)新的行程,在該指令列出了目錄或檔案信息后,便會(huì)立即結(jié)束。而像網(wǎng)頁服務(wù)器所執(zhí)行的 httpd 這類的程序,會(huì)一直常駐在系統(tǒng)中,隨時(shí)等候聯(lián)機(jī)的要求,這種常駐的程序稱之為 daemon。
Daemon 這個(gè)字是由希臘神話而來,Daemon 是一只會(huì)跟隨在主人身邊的小惡魔,它是個(gè)調(diào)皮的小東西,會(huì)幫人類做一些有用的事。不過它本身并沒有善惡之分,也可能會(huì)做出不好的事情,全看人類本身。
FreeBSD 系統(tǒng)內(nèi)附的 daemon 在命名上大都依循一定的規(guī)則,例如 FTP daemon 所執(zhí)行的程序是 ftpd,而負(fù)責(zé) telnet 服務(wù)的 daemon 叫做 telnetd,大到上就是在該服務(wù)的名字后面加上一個(gè) "d" 結(jié)尾。其它非 FreeBSD 內(nèi)附的程序大都有類似的規(guī)則,像 Apahce 這種網(wǎng)絡(luò)服務(wù)器的主要執(zhí)行程序?yàn)? httpd。但也有例外的程序,例如系統(tǒng)中的郵件服務(wù)器 Sendamil,它的執(zhí)行檔是 sendmail 而非 smtpd 或 maild。
通常 daemon 在執(zhí)行后,會(huì)將自己的 PID 以擴(kuò)展名為 .pid 的檔案寫在 /var/run 目錄下,例如 /var/run/syslogd.pid 、/var/run/cron.pid。 該檔案的內(nèi)容為該 daemon 的 PID,可以讓我們直接看該檔案而得知該程序的編號(hào)。
有時(shí)候我們可能會(huì)需要和正在執(zhí)行中的 daemon 溝通。例如當(dāng)我們修改了 /etc/syslog.conf 這個(gè) syslogd 所使用的設(shè)定檔時(shí),我們必須告訴它這個(gè)檔被修改過了,請(qǐng)重新讀取。和 daemon 溝通的方式就是傳送給它一個(gè)信號(hào) (signal),程序在收到信號(hào)后,會(huì)依照信號(hào)的類別做不同的事。以上述要求 syslogd 重新讀取設(shè)定檔為例,我們會(huì)送給它一個(gè) SIGHUP 的信號(hào)。
除了 SIGHUP 外,如果我們想要終止一個(gè)程序的執(zhí)行,可以傳送 SIGTERM 或 SIGKILL 的信號(hào)。SIGTERM 表示通知正在執(zhí)行中的程序我們希望它中止執(zhí)行,如果該程序中有接收 SIGTERM 的機(jī)制,它可以做一些離開前的處理,例如關(guān)閉所開啟的檔案、結(jié)束某些正在執(zhí)行的動(dòng)作等等。然而,收到 SIGTERM 的程序也可以選擇忽視,但 SIGKILL 則是不管程序是否在忙著其它事情,都必須中即停止,而且這個(gè)信號(hào)是不可以被忽視的。所有的信號(hào)都可以使用數(shù)字來表示,例如 SIGHUP 可以使用數(shù)字 1 表示、SIGTERM 為 15、SIGKILL 為 9。
系統(tǒng)中傳送信號(hào)的指令是 kill 這個(gè)指令,假設(shè)我們要送一個(gè) SIGHUP 的信號(hào)給 PID 為 199 的程序,我們可以使用下列指令:
# kill -HUP 199
上述指令中的參數(shù) -HUP 也可以使用 -1 來取代。
值得注意的是,只有超級(jí)使用者 root 可以送信號(hào)給不屬于自己的行程,而一般使用者只能管理自己的行程。
3.7.3 基本系統(tǒng)服務(wù) inetd
在系統(tǒng)中有一個(gè)專門負(fù)責(zé)各式網(wǎng)絡(luò)服務(wù)的超級(jí)服務(wù)器 "inetd"。 我們可以經(jīng)由修改設(shè)定文件請(qǐng)它負(fù)責(zé)許多網(wǎng)絡(luò)相關(guān)的服務(wù),例如 telnet、ftp、ssh 等。當(dāng)有 telnet 聯(lián)機(jī)要求時(shí),inetd 會(huì)依照設(shè)定執(zhí)行負(fù)責(zé) telnet 服務(wù)的 telnetd 這支程序,再將主導(dǎo)權(quán)轉(zhuǎn)手給 telnetd,并繼續(xù)等待下一個(gè)聯(lián)機(jī)要求。若下一個(gè)聯(lián)機(jī)是 ftp,則 inetd 會(huì)呼叫 ftpd 這支程序來負(fù)責(zé)。
其實(shí)像 ftpd 這類的程序,它本身也可以自己成為一支 daemon,由自己等待 ftp 的聯(lián)機(jī)要求,而無需經(jīng)由 inetd。使用 inetd 來管理這些網(wǎng)絡(luò)服務(wù)的好處是我們不必為了提供十種網(wǎng)絡(luò)服務(wù)而執(zhí)行十個(gè)常駐程序。每一個(gè)常駐程序都會(huì)占用一些系統(tǒng)資源,而使用一個(gè) inetd 來統(tǒng)籌,可以讓這些資源空出來。另外,inetd 也可以用來過濾聯(lián)機(jī)來源,針對(duì)不同的聯(lián)機(jī),我們可以使用 inetd 內(nèi)建的 TCP Wrapper 功能來進(jìn)行聯(lián)機(jī)網(wǎng)域的限制,相關(guān)設(shè)定我們會(huì)再后續(xù)章節(jié)中提及。
有優(yōu)點(diǎn)就會(huì)有缺點(diǎn),使用 inetd 來管理網(wǎng)絡(luò)服務(wù)固然有其優(yōu)點(diǎn),但對(duì)于聯(lián)機(jī)較頻繁、需要更快反應(yīng)的服務(wù)而言并不合適。以 FTP 為例,一個(gè)聯(lián)機(jī)進(jìn)來,inetd 都必須重新執(zhí)行一次 ftpd。如果我們是以 daemon 的方式,讓 ftpd 常駐于系統(tǒng)中,則當(dāng)有聯(lián)機(jī)要求時(shí),我們就可以直接將自己復(fù)制一份出來進(jìn)行 ftp 服務(wù),而不需重頭執(zhí)行。所以對(duì)于一臺(tái)大型的 FTP 服務(wù)器而言,通常會(huì)使用獨(dú)立 daemon 的方式。而一些較少使用的服務(wù),如 telnet、ssh 等就交由 inetd 來處理。
FreeBSD 預(yù)設(shè)并不會(huì)啟動(dòng) inetd,所以如果我們想要讓它在一開機(jī)就執(zhí)行,必須在 /etc/rc.conf 中加入下列設(shè)定:
inetd_enable="YES" |
假設(shè)我們想要讓 inetd 負(fù)表 telnet 及 ftp 服務(wù),我們必須修改 /etc/inetd.conf ,將 telnet 及 ftp 前的 "#" 拿掉,如下所示:
# $FreeBSD: src/etc/inetd.conf,v 1.63 2003/06/09 21:04:30 markm Exp $ # # Internet server configuration database # # Define *both* IPv4 and IPv6 entries for dual-stack support. # To disable a service, comment it out by prefixing the line with '#'. # To enable a service, remove the '#' at the beginning of the line. # ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l #ssh stream tcp nowait root /usr/sbin/sshd sshd -i -4 #ssh stream tcp6 nowait root /usr/sbin/sshd sshd -i -6 telnet stream tcp nowait root /usr/libexec/telnetd telnetd telnet stream tcp6 nowait root /usr/libexec/telnetd telnetd #shell stream tcp nowait root /usr/libexec/rshd rshd #shell stream tcp6 nowait root /usr/libexec/rshd rshd #login stream tcp nowait root /usr/libexec/rlogind rlogind #login stream tcp6 nowait root /usr/libexec/rlogind rlogind #finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s #finger stream tcp6 nowait/3/10 nobody /usr/libexec/fingerd fingerd -s #exec stream tcp nowait root /usr/libexec/rexecd rexecd |
接著,再使用下列指令來啟動(dòng) inetd 服務(wù):
# /usr/sbin/inetd -wW
如果 inetd 已經(jīng)被啟動(dòng)了,而我們修改過 inetd.conf 必須要求 inetd 重新讀取設(shè)定檔:
# kill -HUP `cat /var/run/inetd.pid`
請(qǐng)注意這里 `cat /var/run/inetd.pid` 所使用的 ` 是鍵盤左上角的那一個(gè)符號(hào),而非單引號(hào)。不過我們建議您使用 ssh 聯(lián)機(jī)以取代 telnet,因?yàn)?ssh 是以加密過的方式聯(lián)機(jī),比較不會(huì)以明碼的方式傳送數(shù)據(jù)。您可以使用 putty 這個(gè)軟件在 MS windows 下聯(lián)機(jī)到 FreeBSD 中。您可以從 http://www.chiark.greenend.org.uk/~sgtatham/putty/ 下載 putty,也可以在本書光盤二的 wintools 目錄下找到該軟件。
當(dāng)然,您也可以在FreeBSD中使用 ssh 的方式連到別臺(tái)機(jī)器,F(xiàn)reeBSD 中內(nèi)建有 ssh 軟件,你可以使用下列指令:
# ssh jack@123.123.78.9
這個(gè)指令表示以使用者 jack 身份聯(lián)機(jī)到 123.123.78.9,我們也可以使用主機(jī)名稱的方式,例如jack@dns.abc.edu.tw ,或者也可以只打 ssh dns.abc.edu.tw 來登入,此時(shí)登入名稱會(huì)是您現(xiàn)在用的使用者名稱。
如果所聯(lián)機(jī)的站臺(tái)是第一次使用 SSH聯(lián)機(jī),則會(huì)出現(xiàn)下列一堆東西,表示接收到所聯(lián)機(jī)站臺(tái)RSA key,并詢問您是否要繼續(xù)連接。此時(shí)打 "yes" 三個(gè)字即可:
The authenticity of host '123.456.78.9' can't be established. RSA key fingerprint is 13:96:8a:61:31:cf:32:3f:7a:0a:77:ad:7e:49:e7:3f. Are you sure you want to continue connecting (yes/no)? yes |
系統(tǒng)會(huì)將所接收到的金鑰 (key) 存放在使用者家目錄下的 .ssh/known_hosts 檔案中。如果日后在 known_hosts 目錄中所記錄的站臺(tái)金鑰有變更時(shí),我們可以編輯該檔案以刪除舊的金鑰。
設(shè)定到這里后,就可以不必在機(jī)器前作業(yè)了。通常我的習(xí)慣是設(shè)定到這個(gè)地方后,就使用 telnet 或 ssh 的方式經(jīng)由其它計(jì)算機(jī)聯(lián)機(jī)到機(jī)器來作其它的設(shè)定,這樣我就不必一定要待在機(jī)器前,可以在自己家中使用別的機(jī)器聯(lián)機(jī)到 FreeBSD 中做設(shè)定。不過要注意的是 root 賬號(hào)預(yù)設(shè)是不能使用遠(yuǎn)程登入,如果您想使用遠(yuǎn)程登入并擁有 root 的權(quán)限,您必須先使用一般的使用者登入后,再執(zhí)行 su 這個(gè)指令來切換身份成為 root,而且這個(gè)使用者必須加入 wheel 群組中。假設(shè)您在新增使用者時(shí)并未將該使用加入 wheel 群組,您可以手動(dòng)編輯 /etc/group 來加入該使用者。例如我們要讓一般使用者 alex 擁有 su 成為 root 的權(quán)限:
wheel:*:0:root,alex |
3.8 虛擬終端機(jī)
大多數(shù)的時(shí)候,我們都是在命令列模式 (文字模式) 下執(zhí)行系統(tǒng)管理的工作,命令列模式相較于圖形模式而言,所使用的系統(tǒng)資源較少,同時(shí)也是一般 UNIX 最常使用的模式。
在系統(tǒng)一開機(jī)后,屏幕上會(huì)出現(xiàn)類似下列畫面:
Fri Mar 20 14:05:16 CST 2004 FreeBSD/i386 (example.com) (ttyv0) login: |
我們看到第二行的部份有一個(gè) ttyv0,ttyv0 所代表的是編號(hào)為 0的系統(tǒng) console 終端機(jī)。我們?cè)谠摍C(jī)器面前所使用的屏幕中文字模式的畫面就叫做 console,我們可以在 console 下執(zhí)行許多指令。FreeBSD 一開機(jī)后就會(huì)建立讓多虛擬的 console 終端機(jī)機(jī),我們可以同時(shí)開機(jī)多個(gè) console 畫面同時(shí)進(jìn)行操作。您可以使用 ALT+F2、ALT+F3、…直到 ALT+F8 來切換不同的 console 畫面。當(dāng)您使用 ALT+2 時(shí),您會(huì)看到前面所提及的 login 畫面,而畫面上有一個(gè) ttyv1 的字樣。如果您要切換回 ttyv0 只要按 ALT+F1 即可。
當(dāng)我們使用 telnet 或 ssh 進(jìn)入系統(tǒng)時(shí),我們所看到的虛擬終端機(jī)是 ttyp0、ttyp1 等等。關(guān)于各種 tty 權(quán)限的設(shè)定被記錄在 /etc/ttys 這個(gè)檔案中。
console none unknown off secure # ttyv0 "/usr/libexec/getty Pc" cons25 on secure # Virtual terminals ttyv1 "/usr/libexec/getty Pc" cons25 on secure ttyv2 "/usr/libexec/getty Pc" cons25 on secure ttyv3 "/usr/libexec/getty Pc" cons25 on secure ttyv4 "/usr/libexec/getty Pc" cons25 on secure ttyv5 "/usr/libexec/getty Pc" cons25 on secure ttyv6 "/usr/libexec/getty Pc" cons25 on secure ttyv7 "/usr/libexec/getty Pc" cons25 on secure ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure # Pseudo terminals ttyp0 none network ttyp1 none network ttyp2 none network …… |
這個(gè)檔案中設(shè)定了每一個(gè)不同的終端機(jī)類型可以使用的權(quán)限,例如 ttyv0 最后面都有一個(gè) secure 的字樣,而 ttyp0 則無,表示 root 可以從 ttyv0 登入,但不可以從 ttyp0 登入,這也就是為什么 telnet 進(jìn)來時(shí),不可以使用 root 登入的原因。如果您想讓 root 可以使用 telnet 登入,只要在 ttyp0、ttyp1 等行加入 secure 即可,但我們并不建議做這樣的設(shè)定。更多關(guān)于 ttys 這個(gè)檔案的格式及其設(shè)定,請(qǐng) man ttys。
3.8.1登入后的訊息
在您登入系統(tǒng)之后,屏幕會(huì)自動(dòng)秀出一段文字,這段文字稱為 Message Of The Day(motd)。這一段文字是可以修改的,你可以編輯 /etc/motd 來制作自己的畫面。如果你想使用像 BBS 中的文書編輯軟件,來畫 ANSI 圖的話,你可以安裝 ve 這個(gè)軟件。
# cd /usr/ports/chinese/ve # make install clean
再使用 ve /etc/motd 來修改訊息。例如筆者所使用的畫面如下:
圖 3-4
您可以在本書第二片光盤 /examples/etc/motd 找到筆者所使用的 motd 設(shè)定檔。
3.8.2 登入前的訊息
在登入系統(tǒng)前 FreeBSD 時(shí),你會(huì)看到下面的畫面:
FreeBSD/i386 (example.com) (ttyv0) login: |
我們?cè)谶@里要做的就是把它改成想要的樣子。更改 login 前的畫面有二種方式,一種是修改 /etc/gettytab 及 /etc/issue,另一種方式是修改 telnetd。
方式一:
編輯 /etc/gettytab,找到 default的地方。
default:\ |
其中的%s %m %h %t 分別對(duì)應(yīng)到 FreeBSD i386 example.com ttyp0,如果你不想顯示 FreeBSD ,就把 %s 拿掉。最后一行 if=/etc/issue 就是表如果沒有 issue 這個(gè)檔的話,就執(zhí)行 default。
如果你不僅僅是要修改 FreeBSD/i386 這個(gè)部份,還想要在 login 前秀出一段文字的話,你可以新增 /etc/issue 這個(gè)檔,并編輯你想要的畫面。和 motd 一樣,issue 也可以使用 ANSI 畫面,所以你可以用 ve 來編輯畫面。如果你在該檔中加入 %s %m %h %t 等參數(shù)的話,也是會(huì)出現(xiàn) FreeBSD i386 example.com ttyp0等,如果不加就不會(huì)出現(xiàn)。
但由于 issue 這個(gè)檔只會(huì)在 console 登入時(shí)才有作用,如果您要在開機(jī)前的畫面中秀出更多的數(shù)據(jù),您可以使用第二種方式。
方式二:
如果你想要在登入前執(zhí)行一些指令,例如秀出開機(jī)時(shí)間等,必須要以更改 telnetd 的方式來做。首先,請(qǐng)編輯一個(gè)可執(zhí)行檔 /usr/local/libexec/telnetd.sh 內(nèi)容如下:
#!/bin/sh TTY=`/usr/bin/tty | /usr/bin/cut -c9` if [ "$TTY" = 'v' ]; then exec /usr/libexec/telnetd else /bin/cat /etc/issue echo "顏色句柄`/usr/bin/uptime`控制結(jié)束碼" exec /usr/libexec/telnetd fi |
上面句柄部份,你可以使用 ve 來加入顏色句柄,編輯完后要把該檔變成可執(zhí)行的檔案,使用下列指令:
# chmod 755 /usr/local/libexec/telnetd.sh
再編輯 /etc/inetd.conf,將原來的 "/usr/libexec/telnetd telnetd" 換成 "/usr/local/libexec/telnetd.sh telnetd.sh":
telnet stream tcp nowait root /usr/libexec/telnetd.sh telnetd.sh |
最后重跑 inetd,使用指令 kill -HUP `cat /var/run/inetd.pid` 即完成設(shè)定。
3.8.3 使用中文終端機(jī)
FreeBSD 的console 并無法顯示中文,如果我們要在 console 下使用中文的環(huán)境,則必須安裝 big5con 這套軟件才可以。怎么安裝呢? 您可以將本書光盤二 /ports/distfiles 目錄中的所有檔案復(fù)制到 /usr/ports/distfiles 中,或是將光盤放入光驅(qū)中,并使用指令 mount /cdrom 將光驅(qū) mount 進(jìn)來。如此一來,在安裝軟件時(shí),系統(tǒng)就不會(huì)要求連上網(wǎng)絡(luò)取回所需檔案(有的檔案不能從CDROM 安裝,您必須至網(wǎng)絡(luò)下載)。接著以root 的身份直接使用下列指令來安裝:
# cd /usr/ports/chinese/big5con # make install clean
安裝完后,先執(zhí)行 rehash 來更新一下 tcsh 指令的快取,之后我們就可以使用指令 b5c 來出現(xiàn)像 DOS 下倚天中文的環(huán)境,如圖 3-5。
圖3-5