QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10526|回复: 39

linux的自动登录【转】

[复制链接]
发表于 2003-7-20 15:01:56 | 显示全部楼层 |阅读模式
如何自动登录linux(续)
作者:郑彦兴([email protected]
现攻读国防科大计算机学院博士学位
2003年6月11日

在"如何自动登录linux"中,以redhat 7.2操作系统平台为背景,阐述了如何实现自动登录X window(系统启动级别为5),并自动运行指定的应用程序。本文以redhat 8.0操作系统平台为背景,阐述如何实现启动级别为3时的自动登录,及自动运行相应程序,并简要介绍了如何在redhat 8.0下自动登录X window(系统启动级别为5),并自动运行指定的应用程序。

一、启动级别为3时自动登录的实现

启动级别为3时自动登录的实现涉及两个软件包:mingetty-1.00-3.src.rpm软件包及util-linux-2.11r-10.src.rpm软件包。
(1)mingetty-1.00-3.src.rpm软件包
对于启动级别为3的自动登录的实现,仍然需要考察/etc/inittab脚本,

3:123:respawn:/sbin/mingetty tty3

因此,如果想在启动级别3的情况下实现自动登录,必须要了解mingetty的功能,甚至要修改mingetty的代码。用命令rpm -qf /sbin/mingetty 可知redhat 8.0版本的mingetty包含在mingetty-1.00-3.src.rpm软件包中,下载该软件包,安装源代码,缺省情况下,代码会安装在/usr/src/redhat/下,我们关心的只是mingetty.c源文件。mingetty.c约有五百行代码,主要实现如下功能:

打开指定的tty(由参数指定);
提示用户登录(login:);
获得登录用户名;
把用户登录名作为参数,调用/bin/login。

我们所关心的部分实质上只有以下三行:
... ...
438 while ((logname = get_logname ()) == 0); //mingetty.c文件438行
439 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL);
440 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]);
... ...

第一行的功能是输出login提示,并获得用户输入的登录用户名,登录用户名由logname返回。因此,可作如下修改
... ...
438 // while ((logname = get_logname ()) == 0); //注释掉本行,不再提示login:
439 logname = "root"; //添加本行代码
440 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL);
441 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]);
... ...

注意,这里假定用户以超级用户身份登录。

第二行以用户登录名为参数,调用/bin/login程序,进一步实现登录。因此,要想实现自动登录,还应该了解/bin/login的功能,必要时还应修改其源代码。

第三行为出错处理。

(2)util-linux-2.11r-10.src.rpm软件包

采用同样的方法,查看/bin/login所属软件包(redhad8.0版本的login包含在util-linux-2.11r-10.src.rpm软件包中),下载并安装util-linux-2.11r-10.src.rpm,login可执行文件有几个源文件编译而成,我们最关心的是login.c源文件(大约1500行的代码)。下面简要分析一下login要实现的功能,并对相应部分作必要的修改。

Login程序主要可以分为以下几个主要部分:

Login首先检查登录者是否为超级用户,如果不是超级用户,并且存在/etc/nologin文件,则输出该文件内容,并中止登录过程;主要由checknologin()实现;
如果登录用户是超级用户,那么login必须在/etc/securetty/中指定的tty列表中实现登录,否则将导致登录失败。同样可以不指定/etc/securetty文件,此时,超级用户可以在任何tty上登录。
经过前两步测试后,login接下来将提示输入登录密码(由getpass()调用完成,有兴趣的读者可参考其手册页面),并进行验证,如果密码不对,则提示重新登录。
顺利经过密码验证后,login还将检查是否存在.hushlogin文件,如果该文件存在,则执行一次"quiet"登录(所谓的quiet登录指的是,登录时不再提示邮件mail,不再显示最后一次登录时间,不输出任何消息。启动级别为3时,正常情况下输出这些信息)
login接下来设置登录tty的用户ID和组ID,并设置相应的环境变量,包括HOME、PATH、SHELL、TERM、LOGNAME等。对于普通用户来说,PATH缺省被设置成/usr/local/bin: /bin/usr/bin:;对于超级用户来说,PATH被设置成/sbin: /bin: /usr/sbin: /usr/bin:
login的最后一步是为用户启动shell。如果在/etc/passwd中没有为用户指定shell,那么将使用/bin/sh,如果在/etc/passwd中没有给出当前工作目录,则使用"/"。

至此,一个完整的登录过程就结束了。

从以上对login源程序分析过程中可发现,如果要实现自动登录,应该在第三步做文章,设法绕过提示输入密码以及对密码进行验证这一过程。实际上很简单,login源程序对是否要求输入密码设置了一个开关控制passwd_req,缺省情况下,其值为1(passwd_req = 1),即要求输入密码进行身份验证。把该行代码改为(passwd_req = 0)后,问题就解决了。即对源文件作如下修改即可:
... ...
402 fflag = hflag = pflag = 0; //login.c文件402行
403 //passwd_req = 1 //缺省时,要求进行密码验证,注释掉本行
404 passwd_req = 0 //添加本行
... ...

修改后,可以直接使用util-linux-2.11r-10.src.rpm提供的Makefile进行重新编译,也可以自己对其编译:

gcc -o login login.c setproctitle.c checktty.c xstrncpy.c -Wall -lcrypt注意包含后面的编译选项-lcrypt,否则会出问题。

有了新版的mingetty及login后,拷贝mingetty到/sbin/目录,拷贝login到/bin目录,并将/etc/inittab中的启动级别设置为3,再重新引导系统即可(读者可以自己写一个脚本实现上述过程)。

如果读者对mingetty或login代码的其他部分感兴趣,可以反复修改login.c或mingetty.c的源代码,测试一下代码的功能,这里要注意的是,在拷贝新版mingetty和login之前,一定要把原来的mingetty和login备份,同时还要准备系统引导盘(有系统安装盘亦可,这样读者有机会键入linux rescue),在测试新版程序前更应如此,如果对代码修改稍有不当,系统将不能正常启动。


如果不想再作进一步的代码测试,只是按本文给出的方法进行代码修改,在系统启动上不会出现什么问题。

二、自动登录后,自动运行特定的应用程序

在实现了启动级别3时的自动登录后,自动运行应用程序非常简单,把应用程序添加在/etc/rc.d/rc.local脚本中既可。(读者可以尝试一下把startx加入脚本中,看一看效果如何。在某种意义上,又增加了一种自动登录X window的方法)

三、对自动登录X window(系统启动级别为5),并自动运行指定的应用程序的补充

在"如何实现自动登录linux"中,主要以redhat 7.2平台为背景进行阐述的,其中的自动登录部分可以直接用于redhat 8.0中,不需要任何修改。

但是,登录后自动运行应用程序的接口在redhat 8.0中有所不同,主要是登录gnome后,自动运行应用程序的接口有所改变:首先点击面板上的GNOME帮助(那个红色的小帽子),然后选择/其它/首选项/Sessions,在Session对话框的启动程序属性页中添加要启动的程序即可。

对于登录kde后,自动运行程序的接口没有改变。

四、结论

本文同"如何实现自动登录linux"一文,基本上解决了如何实现自动登录Linux,并自动运行相应应用程序的问题。对于两个最常见的启动级别(3、5),都给出了各自的方法。

在系统初始化到mingetty及login这一阶段,内核实际上已经完成了引导过程,已经到了系统初始化的最高阶段,与内核没什么关系了。此时,主要是/sbin/init根据/etc/inittab的内容而相机行事。读者可通过(man 8 init)或者(man 5 inittab)了解更多东西。

在对文中提到的软件包修改时,请遵守GNU General Public License(GPL)相关标准,另外,替换login通常被视为黑客行为,应当谨慎行事。

参考文献

login手册页面
mingetty-1.00-3.src.rpm,在redhat 8.0的发行版本的源代码中,包含该软件包;
util-linux-2.11r-10.src.rpm,

可在http://rpmfind.net/linux/RPM/redhat...包(..src.rpm)

关于作者

郑彦兴,男,现攻读国防科大计算机学院博士学位。您可以通过电子邮件 [email protected]和他联系


__________________
系统:RH Linux8.0
SHELL:BASH&KSH
桌面:gnome
浏览器:Konqueror
发表于 2003-7-20 21:07:31 | 显示全部楼层
呵呵,不错!
回复

使用道具 举报

发表于 2003-8-24 09:06:13 | 显示全部楼层
在开始菜单的系统设置的登录屏幕选项里就可以设置要自动登录的帐号了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

发表于 2003-8-26 09:47:35 | 显示全部楼层
上面的那篇文章有人照着去做吗,我做了
gcc -o login login.c setproctitle.c  checktty.c   xstrncpy.c -Wall -lcrypt
有错,不知道为什末?
回复

使用道具 举报

发表于 2003-8-26 16:14:55 | 显示全部楼层
还有就是用make去执行好像也不行,也没有生成login 生成了一个agetty的文件
有没有人去试过这篇文章中写的东西呀,第2步我没有试通
回复

使用道具 举报

 楼主| 发表于 2003-8-27 11:41:53 | 显示全部楼层
[quote:d36e94f49f="hanchen528"]上面的那篇文章有人照着去做吗,我做了
gcc -o login login.c setproctitle.c  checktty.c   xstrncpy.c -Wall -lcrypt
有错,不知道为什末?[/quote]
出错是头文件的路径有问题,除了作者所说的.还要修改login.c的#inlcude 部分,把#include "XXXXX"的头文件加上绝对路径,.比如我安装的是util-linux-2.11y,安装好了,把/usr/src/redhat/SORUCE/util-linux-2.11y.tar.ba2,cp到/tmp,解开后是/tmp/util-linux-2.11y目录,然后改/tmp/util-linux-2.11y/login-utils/login.c和/tmp/util-linux-2.11y/login-utils/checktty.c,把两个文件的声明头文件部分加以修改,比如原来login.c有,#include "pathnames.h" 改成#inclede "/tmp/util-linux-2.11y/lib/pathnames.h"只要它能找到头文件,编译就没问题了.
mingetty.c就容易多了,照作者说的改了这后.直接进行make,就可以编译成功.
下面是我编译好的这两个文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

发表于 2003-8-29 09:00:48 | 显示全部楼层
\非常感谢chag1226,还有一个问题,就是我实现了文本方式的自动登录,但是自动运行程序还不行,假如我有一个可执行程序在/home/hc/这个目录下,可执行程序叫test,我如何在rc.local中加入呀,我是这样加的,
cd /home/hc
./test
但是没有自动运行,这个程序不需要x Windows,

还有就是文本方式自动登录的方法用在X windows(我的图形方式是kde) 的方式好像不适用,实现不了,有人实现了吗?
我的图形方式是kde,还有就是自动登录后运行程序这一步,一直都没有实现.
回复

使用道具 举报

 楼主| 发表于 2003-8-29 15:36:25 | 显示全部楼层
这样好了/home/gc/test,还有一种,因为照上文所说,登录的用户是ROOT,那就在/ROOT/.BASH_PROFILE里加上你的命令.CD /HOME/GC  ./TEST.因为X是在INIT 5下的,所以这样改不起作用,就照楼上的寒秋兄说的做就行了.
回复

使用道具 举报

发表于 2003-8-31 19:59:05 | 显示全部楼层
那如果我想实现x window的自动登陆,并且是登陆的kde方式下,应该如何做哪
文章中提到在/etc/rc.d/rc.local脚本中加入startx
确实实现了x window的自动登陆,但是是gnome方式,我希望式kde方式,这应该怎末办呀
回复

使用道具 举报

 楼主| 发表于 2003-9-1 09:19:11 | 显示全部楼层
用switchdesk
回复

使用道具 举报

发表于 2003-9-1 12:02:57 | 显示全部楼层
如何用switchdesk,能说的具体一点吗?加在哪个文件里面呀,
这样用吗swtichdesk kde
回复

使用道具 举报

 楼主| 发表于 2003-9-2 09:17:09 | 显示全部楼层
对,就是swtichdesk  <kde|gnome>,试一下就知道了.
回复

使用道具 举报

发表于 2003-10-16 16:50:21 | 显示全部楼层
如果博士生做如此工作和研究来骗取学位,那我无话可说。

但是这个应用有必要吗 ???

纯属垃圾 !!!
回复

使用道具 举报

发表于 2003-10-30 01:36:37 | 显示全部楼层
我看了好像有点明白...
回复

使用道具 举报

发表于 2004-2-8 13:20:33 | 显示全部楼层
"现攻读国防科大计算机学院博士学位"
我最讨厌这种东西,国内特别流行.
另外这些博士写的东西的水平让我......更别说创新了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-5 21:39 , Processed in 0.082830 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表