静下来,定好方向,好好干。
分类: LINUX
2008-08-15 20:53:39
本文介绍自动登陆到Utuntu系统文本模式的一种实现方法。
之所以要实现Ubuntu自动登陆,一开始的动机只是为了现成一次作业。至于是否还有其他的用途,我想,Linux系统的可定制性这么高,自动登陆的实现就是一个很好的例子,也许在其他的一些地方,还用得到这个方法。
我的Ubuntu是版本是Edgy(6.10),自动登陆的实现参考了网上广为转载的一篇介绍自动登录到Redhat的文章──《如何自动登陆Linux》。对于自动登录到Ubuntu Edgy的办法,还没有能够在网上找到,其实原理上一样,实现上略有不同。
根据文章的分析,要实现动登陆,从Linux系统启动的inittab文件入手,修改启动终端的命令getty和它所调用的用户登录的命令login来实现。采用下载程序源码,修改程序源码,生成新的可执行文件,覆盖旧的getty和login命令的办法来实现。
Linux系统启动到登录的大概过程是:init进程是系统所有进程的起点,内核在完成核内引导以后,即在本线程(进程)空间内加载init程序。 init程序需要读取/etc/inittab文件作为其行为指针,inittab是以行为单位的描述性(非执行性)文本。init进程将启动运行rc脚 本,在rc返回后,init将得到控制,并启动getty。
(1)查找命令所属的deb包。
$ dpkg -S getty
util-linux: /usr/share/doc/util-linux/README.modems-with-getty.gz
util-linux: /usr/share/man/man8/getty.8.gz
util-linux: /sbin/getty
util-linux: /usr/share/doc/util-linux/README.getty.gz
由上面的输入,我们可以猜测到,getty命令由名字为util-linux的deb包提供。
(2)下载deb包源代码
$ sudo apt-get source util-linux
在当前目录下即可得到util-linux的源码包,有如下文件:
util-linux_2.12r-11ubuntu2.diff.gz
util-linux_2.12r-11ubuntu2.dsc
util-linux_2.12r.orig.tar.gz
util-linux-2.12r
源代码即在util-linux-2.12r文件夹中。
getty命令和login命令的源代码在util-linux-2.12r/login-utils/文件夹下。
注意,此处于文章《如何自动登陆Linux》中不同之处在于,不需要下载两个source rpm包,而两个命令的源代码都在此处。其中,getty命令的源代码可以为agetty.c,login命令的源代码为login.c。
getty 就是一个程序,他让你能从各种设备上登陆,比如虚拟终端,文字终端或是一个modem。他显示一个登陆提示符,一旦你键入用户名,getty把它传送到 login,login会向你要密码,认证成功后给你一个shell。有很多getty,有的发行版,包括red hat使用很小的,只能在虚拟终端上用的mingetty。login(登陆)程序是linux功能包的一部分,包含了一个名为agetty的 getty。
(3)修改getty命令的源代码
getty的功能一般包括:
打开终端线,并设置模式;输出登录界面及提示,接受用户名的输入;以该用户名作为login的参数,加载login程序;缺省的登录提示记录在/etc/issue文件中。
在agetty.c的源代码中的第366行和367行可以看到:
366 while ((logname = get_logname(&options, &chardata, &termio)) == 0)
367 next_speed(&termio, &options);
此处调用了get_logname得到用户输入的用户名,get_logname在1014行调用了do_prompt函数,输出了登录的提示符,类似于“login:”。这里,我们把366和367行注释,直接赋值logname为root:
366 //while ((logname = get_logname(&options, &chardata, &termio)) == 0)
367 // next_speed(&termio, &options);
368 logname = “root”;
(4)修改源login命令的源代码
login程序在getty的同一个进程空间中运行,接受getty传来的用户名参数作为登录的用户名。
在login.c的源代码中的第407行:
407 passwd_req = 1;
通过对源代码的分析,此处为密码是否需要验证的一个开关。我们修改此处,把密码需要验证的开关直接关闭:
407 //passwd_req = 1;
408 passwd_req = 0;
(5)编译生成可执行文件
直接利用util-linux-2.12r/login-utils/目录下的makefile文件进行编译,直接打make命令,编译完成后,即可得到可执行文件:agetty和login。
下面备分系统原来的getty和login可执行文件。查找文件所在位置,并备份,把新生在的可执行文件移入相应的目录中,对agetty改名。
$ whereis login
login: /bin/login /etc/login.defs /usr/share/man/man1/login.1.gz
$ sudo cp /bin/login /bin/login.bak
$ sudo cp login /bin/
$ whereis getty
getty: /sbin/getty /usr/share/man/man8/getty.8.gz
$ sudo cp /sbin/getty /sbin/getty.bak
$ sudo cp agetty /sbin/
$ sudo mv /sbin/agetty /sbin/getty
最后这一步,也可以创建一个名字为getty的软链接到agetty。
$ sudo ln -s /sbin/agetty /sbin/getty
(6)重启系统
在启动信息显示过后,系统将直接进入root用户登录状态,出现类似于下面的提示符:
root@link-desktop:~#
这表示我们已经顺利自动登Ubuntu系统中了。