每次进入Linux系统的时候,总是看到类似于下面的登录画面:
Red Hat Linux release 6.2(Zoot)
Kernel 2.2.14-5.0 on an i686
这种冷冰冰的欢迎让人觉得很不友好。而且,有时候我们不仅希望能够自定义漂亮的登录画面,更希望系统在启动的时候自动执行自定义的脚本,这可以做到吗?
当然可以。和UNIX一样,Linux不但是一种多任务系统,而且一个很明显的优点,就是能够灵活的允许基于系统时间或时间的作业控制。我们希望的就是系统登录时的自动作业控制,下面就以它为例来分析Linux的自动作业控制(以red hat 6.2为例)。
启动脚本的概念
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)一个进程
通过创建自己的脚本来实现系统启动时的自动作业
如上所述,可以在rc3.d建立自己的脚本文件,来实现系统启动时的自动运行。为了不和系统原有的脚本发生冲突,应该在执行完系统的其他所有脚本之后才开始运行,因此,创建的脚本的序号应不小于系统原有的脚本的序号,在这里是S99local,因此可以设置我们的脚本为S99myscript(允许有多个脚本采用同样的序号),只是注意要把这个脚本的属性和所有者等信息设置为与其他脚本相同。
更改系统的登录画面
通常情况下,登录画面保存在/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的改动语句放到这里,效果是一样的。
远程登录情形
检查/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文件就是远程登录时的登录画面。所以可以采用与修改登录画面相同的方法来修改远程登录画面。