桂劍
每次進入Linux系統的時候,總是看到類似於下面的登錄畫面:
Red Hat Linux release 6.2(Zoot)
Kernel 2.2.14-5.0 on an i686
這種冷冰冰的歡迎讓人覺得很不友好。而且,有時候我們不僅希望能夠自定義漂亮的登錄畫面,更希望系統在啟動的時候自動執行自定義的腳本,這可以做到嗎?
當然可以。和UNIX一樣,Linux不但是一種多任務系統,而且一個很明顯的優點,就是能夠靈活的允許基於系統時間或時間的作業控制。前面我們希望的就是系統登錄時的自動作業控制,下面我們就以它為例來分析Linux的自動作業控制(以red hat 6.2為例)。
1. 啟動腳本的概念
Linux的目錄樹結構中,/etc目錄包括了所有與系統啟動有關的配置文件,例如lilo.conf, profiles,inittab等,其中rc.d目錄包括了系統啟動時的所有運行腳本。這類腳本稱為rc腳本,也稱為運行控制腳本。其中rc.d目錄下按照運行級別的不同又分為多個腳本目錄。如下:
#ls /etc/rc.d
init.d rc.local rc0.d rc2.d rc4.d rc6.d
rc rc.sysinit rc1.d rc3.d rc5.d
這裡的rc.sysinit作為系統的初始化腳本,是每一個運行級都要首先運行的。而rc.local則是每一個運行級別在最後都要運行的。在不同的運行級別,運行不同的rcx.d內的腳本。缺省情況下,每次啟動時進入運行級別3,即有網絡支持的標准多用戶模式。我們來看rc3.d目錄下有些什麼樣的腳本,如下:
#ls /etc/rc.d/rc3.d
K20nfs K35smb S10network S30syslog S60lpd S99linuxconf
K20rstatd K60marsnwe S11portmap S35identd S75keytable S99local
K20rusersd K84ypserv S14nfslock S40atd S80sendmail
K20rwalld K92ipchains S16apmd S40crond S85gpm
K20rwhod S05kudzu S20random S45pcmcia S85httpd
K34yppasswdd S10dualconf S25netfs S50inet S90xfs
每個腳本命名的方式是“前綴+序號+腳本名”。在前綴後面,每一個腳本都有標識自身的序號,這個序號控制著腳本的運行順序,而且前綴為K或S也各有不同的含義,其中:
K為前綴時表示運行腳本將刪除(Kill)一個進程;
S為前綴時表示運行腳本將啟動(Start)一個進程。
2. 通過創建自己的腳本來實現系統啟動時的自動作業
如上所述,可以在rc3.d建立自己的腳本文件,來實現系統啟動時的自動運行。為了不和系統原有的腳本發生沖突,應該在執行完系統的其他所有腳本之後才開始運行,因此,創建的腳本的序號應不小於系統原有的腳本的序號,在這裡是S99local,因此可以設置我們的腳本為S99myscript(允許有多個腳本采用同樣的序號),只是注意要把這個腳本的屬性和所有者等信息設置為與其他腳本相同。
3. 更改系統的登錄畫面
通常情況下,登錄畫面保存在/etc目錄下的issue文件,如下:
#more /etc/issue
Red Hat Linux release 6.2(Zoot)
Kernel 2.2.14-5.0 on an i686
可以用vi等任何一種文本編輯器編輯issue文件成為我們想要的形式。那麼,下一次啟動的時候,系統便會讀取issue文件作為登錄畫面嗎?
實際上,光改動issue文件是不行的,還必須修改相應的控制文件。對issue文件的控制文件在前面提到過的/etc/rc.d中的rc.local腳本中。我們來看rc.local的最後一部分語句吧:
#more /etc/rc.d/rc.local
...
#This will overwrite /etc/issue at every boot. So, make any changes you
#want to make to /etc/issue here or you will lose them when you reboot.
echo "" > /etc/issue
echo "$R" >> /etc/issue
echo "Kernel $(uname -r) on $a $SMP$(uname -m)" >> /etc/issue
cp -f /etc/issue /etc/issue.net
echo >> /etc/issue
fi
從這裡可以看出,每次系統啟動的時候,實際上是利用rc.local腳本重新生成issue文件。這樣,就有兩個選擇,或者注釋掉這裡的語句,或者直接把對issue的改動語句放到這裡,效果是一樣的。
4. 遠程登錄情形
檢查/etc目錄下的inetd.conf配置文件,可以看到有這樣一個語句:
...
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
...
可以看出,對於telnet請求,系統執行/usr/sbin/in.telnetd來響應。因此,我們可以通過如下的方法來修改遠程登錄的自動作業控制:
(1)首先進入/usr/sbin目錄 ;
#cd /usr/sbin
(2)創建自己的自動作業腳本,例如取名為in.myscript,注意屬性和所有者等應和in.telnetd相同;
(3)把文件in.telnetd改名,例如改為in.telnetd.second;
(4)創建一個名為in.telnetd的shell腳本,在這個腳本中,首先運行in.myscript,最後運行in.telnetd.second,例如可以寫成下面這樣:
#!/bin/sh
echo ""
exec /usr/bin/in.myscript
exec /usr/bin/in.telnetd.second
對登錄畫面的修改,由剛才的分析我們知道,可以創建一個自動運行的腳本,這個腳本的功能就是顯示自定義的登錄畫面文件。
除此以外,還有一種和前面對issue文件的修改很類似的做法。
細心的讀者可能會注意到,前面提到的rc.local文件腳本中有一個語句:
...
cp -f /etc/issue /etc/issue.net
...
這個語句的作用是把issue文件復制成/etc目錄下的issue.net文件。其實,issue.net文件就是遠程登錄時的登錄畫面。所以可以采用與修改登錄畫面相同的方法來修改遠程登錄畫面。
好了,介紹了這些,大家一定對Linux系統中登錄時的自動作業控制有了一個明確的印象了吧。那就馬上去試試吧。讓你的Linux真正的乖巧起來,聽到你的腳步聲,就馬上為你把想做的事情做好了,這才是我們友好的Linux