QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4259|回复: 1
打印 上一主题 下一主题

如何自动登录linux[转载]

[复制链接]
字体大小: 正常 放大

1253

主题

443

听众

-516

积分

复兴中华数学头子

  • TA的每日心情
    开心
    2011-9-26 17:31
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    自我介绍
    数学中国网站(www.madio.cn)是目前中国最大的数学建模交流社区

    邮箱绑定达人 优秀斑竹奖 发帖功臣 元老勋章 新人进步奖 原创写作奖 最具活力勋章 风雨历程奖

    群组越狱吧

    群组湖南工业大学数学建模同盟会

    群组四川农业大学数学建模协会

    群组重庆交通大学数学建模协会

    群组中国矿业大学数学建模协会

    跳转到指定楼层
    1#
    发表于 2004-9-27 14:26 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta |邮箱已经成功绑定
    <>如何自动登录linux[转载]</P>
    4 h& ^) l- s; O: k<>本文以redhat 8.0操作系统平台为背景,阐述如何实现启动级别为3时的自动登录,及自动运行相应程序,并简要介绍了如何在redhat 8.0下自动登录X window(系统启动级别为5),并自动运行指定的应用程序。
    8 v6 E! N% B2 e5 |0 }; S3 Y' K; t[b:804aea7097]一、启动级别为3时自动登录的实现[/b:804aea7097]
    9 L! G4 L  b7 b* q, R* J$ m$ z! e% a% m! \: K
    启动级别为3时自动登录的实现涉及两个软件包:mingetty-1.00-3.src.rpm软件包及util-linux-2.11r-10.src.rpm软件包。 $ e$ ], k  w0 g1 E# W* m8 T$ x: o

    ( h8 ?  [8 o- l4 A! E$ R(1)mingetty-1.00-3.src.rpm软件包  
    4 x5 h) L/ w  i/ i4 m) {4 p) I对于启动级别为3的自动登录的实现,仍然需要考察/etc/inittab脚本,  
    - d; g  Q1 v! u9 y5 l% F# {3:123:respawn:/sbin/mingetty tty3 2 n1 \; p4 b# z/ y% F

    / o0 f# ]0 y; s* s. y8 p$ }3 g
    6 n" b* s# N% J- T# D  
    2 T/ }- w% @0 r) W  o  Z6 g0 G0 {5 C* t# h& E1 \* e4 a
    ( H9 k  c* f' e9 e7 H
    因此,如果想在启动级别3的情况下实现自动登录,必须要了解mingetty的功能,甚至要修改mingetty的代码。用命令rpm -qf /sbin/mingetty 可知redhat 8.0版本的mingetty包含在mingetty-1.00-3.src.rpm软件包中,下载该软件包,安装源代码,缺省情况下,代码会安装在/usr/src/redhat/下,我们关心的只是mingetty.c源文件。mingetty.c约有五百行代码,主要实现如下功能:
    7 f, s0 ?- u# A& K5 c2 i* Q8 U, s2 Z# w/ V- _

    & e5 X3 _( |. i  d打开指定的tty(由参数指定);  7 x2 [# d2 y, U. q% U: ^, X4 m
    提示用户登录(login:);  & H5 U* f. r% s. g9 \3 F
    获得登录用户名;  
    * ?; a0 d- r6 k把用户登录名作为参数,调用/bin/login。  8 A" i4 G/ ^4 I2 B

    + y  b2 A! E+ d9 w我们所关心的部分实质上只有以下三行:   L$ j9 g& j6 U" K# l. w" M$ [

    + [. P; M# ~* v9 G9 Y1 ]- O3 b3 M, ^3 R9 v/ A
    ... ...
    3 N& G  f4 S( G1 i438 while ((logname = get_logname ()) == 0); //mingetty.c文件438行 : p7 R! f$ D- x' Q! l
    439 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); 3 X, T% L8 o( Z4 j# y# q
    440 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]); % a" j$ k0 q' K# M0 M  U& M+ G* i7 ~4 f
    ... ... 2 T  E. T. T* Z4 t+ T: J3 ?
    1 O* k/ H+ d) H0 W# r
      
    9 _& q0 K4 U# t7 a% }
    * `- a1 I4 P" O第一行的功能是输出login提示,并获得用户输入的登录用户名,登录用户名由logname返回。因此,可作如下修改
    1 b3 ^6 B# [: o& ^
    2 ]+ Z: C+ e3 D" Z8 ?! O
    ' [) c' s3 {- N/ Y, w# k' S& C$ }+ S... ...
    . w( t; {: n# U438 // while ((logname = get_logname ()) == 0); //注释掉本行,不再提示login: + U7 m% h! e/ `* H( t- q
    439 logname = "root"; //添加本行代码 5 K1 w8 I4 e( p* U/ P0 m
    440 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL);
    4 K0 }9 v, K% v5 _441 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]);
    $ y/ K& w* ]! b! T0 @- F' c... ... $ k+ ?4 Q* {- [8 z4 D( ], u

    # h& a2 F2 [0 \# w  e  
    ; t$ T, }: f0 J  K2 F. w
    2 q3 V) J$ a0 d, R+ @注意,这里假定用户以超级用户身份登录。 : W, Y7 k( Y9 b: W- Z1 c. O

    - v1 }- y; ^% r8 R第二行以用户登录名为参数,调用/bin/login程序,进一步实现登录。因此,要想实现自动登录,还应该了解/bin/login的功能,必要时还应修改其源代码。
    - V' D9 S6 y9 e1 l1 _+ p# T: ]
    ) C; w. W1 |# h- l% t) @第三行为出错处理。
    - F3 V* [( A) r
    " B* h9 J2 P' y' _' [7 h* J3 k(2)util-linux-2.11r-10.src.rpm软件包  
    0 q7 a7 _/ Z6 Y4 u采用同样的方法,查看/bin/login所属软件包(redhad8.0版本的login包含在util-linux-2.11r-10.src.rpm软件包中),下载并安装util-linux-2.11r-10.src.rpm,login可执行文件有几个源文件编译而成,我们最关心的是login.c源文件(大约1500行的代码)。下面简要分析一下login要实现的功能,并对相应部分作必要的修改。
    ( {$ A9 r& [8 K9 V5 n$ ^& D8 Y9 r5 N7 o$ j2 g6 e
    Login程序主要可以分为以下几个主要部分: " k3 O# b. [4 ?5 ?- a3 k
    ) l6 m+ M* @) H9 g* ^0 U
    1.Login首先检查登录者是否为超级用户,如果不是超级用户,并且存在/etc/nologin文件,则输出该文件内容,并中止登录过程;主要由checknologin()实现;  
    ( J$ W+ D$ y9 B2 Y& s5 y4 H( _2.如果登录用户是超级用户,那么login必须在/etc/securetty/中指定的tty列表中实现登录,否则将导致登录失败。同样可以不指定/etc/securetty文件,此时,超级用户可以在任何tty上登录。  
    8 T, c. L& u1 l' k3.经过前两步测试后,login接下来将提示输入登录密码(由getpass()调用完成,有兴趣的读者可参考其手册页面),并进行验证,如果密码不对,则提示重新登录。  6 p! o- W& d$ d* y% i
    4.顺利经过密码验证后,login还将检查是否存在.hushlogin文件,如果该文件存在,则执行一次"quiet"登录(所谓的quiet登录指的是,登录时不再提示邮件mail,不再显示最后一次登录时间,不输出任何消息。启动级别为3时,正常情况下输出这些信息)  8 t) H4 a5 J4 w0 A9 y2 J; U9 e
    5.login接下来设置登录tty的用户ID和组ID,并设置相应的环境变量,包括HOME、PATH、SHELL、TERM、LOGNAME等。对于普通用户来说,PATH缺省被设置成/usr/local/bin: /bin/usr/bin:;对于超级用户来说,PATH被设置成/sbin: /bin: /usr/sbin: /usr/bin:  4 j3 {( A# O  x
    6.login的最后一步是为用户启动shell。如果在/etc/passwd中没有为用户指定shell,那么将使用/bin/sh,如果在/etc/passwd中没有给出当前工作目录,则使用"/"。    M  l  M( I7 q8 \
    至此,一个完整的登录过程就结束了。
    9 Q; W: S, G% I! n. A0 J4 W3 \6 Q" }
    从以上对login源程序分析过程中可发现,如果要实现自动登录,应该在第三步做文章,设法绕过提示输入密码以及对密码进行验证这一过程。实际上很简单,login源程序对是否要求输入密码设置了一个开关控制passwd_req,缺省情况下,其值为1(passwd_req = 1),即要求输入密码进行身份验证。把该行代码改为(passwd_req = 0)后,问题就解决了。即对源文件作如下修改即可: ) A% I. ~  e" U2 ?' _
    2 J2 m) q! G8 L+ ?

    " ^% ~+ o. T' x& C  }... ... & t# |' \, t$ @# T* Y4 I! {7 b
    402 fflag = hflag = pflag = 0; //login.c文件402行
    ' f% i$ N% g) I  z# k3 [+ T3 d403 //passwd_req = 1   //缺省时,要求进行密码验证,注释掉本行
    ( U1 L" p, Y2 m, Q404 passwd_req = 0 //添加本行 & O$ H, Q+ w% g6 Q
    ... ...
    9 Z9 Q7 j" K' E: Z; v! u% ]# z
    ! q7 D+ s- N# I- p# K: t- b  + e. T2 F- }* @. e) O

    * U3 T+ B/ ]/ E! D7 C修改后,可以直接使用util-linux-2.11r-10.src.rpm提供的Makefile进行重新编译,也可以自己对其编译:
    : p& i, S: ~" P" i
    / j0 t& P# k/ B- R1 C9 m8 m" u/ R, h8 c
    gcc -o login login.c setproctitle.c checktty.c xstrncpy.c -Wall -lcrypt注意包含后面的编译选项-lcrypt,否则会出问题。
    ' M0 `$ v- X) x. v. Z$ n% `2 d7 Q: ?$ S* A- X5 e8 L
      Y+ O) K9 ~/ Q9 h; L# O
    有了新版的mingetty及login后,拷贝mingetty到/sbin/目录,拷贝login到/bin目录,并将/etc/inittab中的启动级别设置为3,再重新引导系统即可(读者可以自己写一个脚本实现上述过程)。
    # V4 P3 Y1 e- m0 G2 S) B
      E, ^5 ?9 q* u5 n; ~( t1 l如果读者对mingetty或login代码的其他部分感兴趣,可以反复修改login.c或mingetty.c的源代码,测试一下代码的功能,这里要注意的是,在拷贝新版mingetty和login之前,一定要把原来的mingetty和login备份,同时还要准备系统引导盘(有系统安装盘亦可,这样读者有机会键入linux rescue),在测试新版程序前更应如此,如果对代码修改稍有不当,系统将不能正常启动。
    ) V8 C( v8 u% g, f, L9 f7 r1 X" _" k+ o5 h
    如果不想再作进一步的代码测试,只是按本文给出的方法进行代码修改,在系统启动上不会出现什么问题。 5 O; h7 b6 {. d3 P

    5 S' a! J% h. O% y* z2 }$ B[b:804aea7097]二、自动登录后,自动运行特定的应用程序[/b:804aea7097] % ]: m. Z% Q& k' s' G# Q8 V
    : ]; v0 c7 j7 z' K9 n0 R3 k
    在实现了启动级别3时的自动登录后,自动运行应用程序非常简单,把应用程序添加在/etc/rc.d/rc.local脚本中既可。(读者可以尝试一下把startx加入脚本中,看一看效果如何。在某种意义上,又增加了一种自动登录X window的方法) $ u8 s" s8 t% z, e8 B; Q
    ) b* i6 m% @0 _
    [b:804aea7097]三、对自动登录X window(系统启动级别为5),并自动运行指定的应用程序的补充[/b:804aea7097]
    5 m$ S2 C8 F' I; o7 c( }# U
    1 r9 Q. E, M: t  h  f) Q6 q. q在"如何实现自动登录linux"中,主要以redhat 7.2平台为背景进行阐述的,其中的自动登录部分可以直接用于redhat 8.0中,不需要任何修改。
    9 ]. S5 @; l- M. h8 T
    2 G& o  z. c* ~6 {( J但是,登录后自动运行应用程序的接口在redhat 8.0中有所不同,主要是登录gnome后,自动运行应用程序的接口有所改变:首先点击面板上的GNOME帮助(那个红色的小帽子),然后选择/其它/首选项/Sessions,在Session对话框的启动程序属性页中添加要启动的程序即可。
    # m( K3 q6 Y# h' T6 u" |0 r$ l! p- l( O6 P5 F, f: B& D0 @
    对于登录kde后,自动运行程序的接口没有改变。
    % q; q- L1 n9 H) T& f
    7 Y1 h, N0 \1 P[b:804aea7097]四、结论[/b:804aea7097] - S1 q/ x3 O, c2 t) W7 s5 B3 x# Q
    6 X+ @/ Q  K/ ?- Z9 N- W$ S2 s
    本文同"如何实现自动登录linux"一文,基本上解决了如何实现自动登录Linux,并自动运行相应应用程序的问题。对于两个最常见的启动级别(3、5),都给出了各自的方法。 9 m. F! V/ {! R1 |9 q; p

    / k' b3 {& O, W' Y1 P在系统初始化到mingetty及login这一阶段,内核实际上已经完成了引导过程,已经到了系统初始化的最高阶段,与内核没什么关系了。此时,主要是/sbin/init根据/etc/inittab的内容而相机行事。读者可通过(man 8 init)或者(man 5 inittab)了解更多东西。 # @5 f. f0 K; |$ X# ~9 }

    & a5 S4 K' t7 s% P; J在对文中提到的软件包修改时,请遵守GNU General Public License(GPL)相关标准,另外,替换login通常被视为黑客行为,应当谨慎行事。 & m% b& t0 k0 G9 J" z% {/ ?+ V9 K

    3 O+ V: ?* z5 C9 C; S
    # D0 Z, V+ L( X$ ]; j8 I+ A
    9 a" G, `1 b$ W6 N  r9 {1 K[b:804aea7097]参考文献[/b:804aea7097]
    2 n9 e8 N5 X. \) s( A
    ) W5 ?. y' t0 o, j1 q  d8 s. Y: l2 [
    1 i. M$ V) O( |6 H) G1.login手册页面  
    ; L- v# W/ |# `' Q; Y% Q, ?2.mingetty-1.00-3.src.rpm,在redhat 8.0的发行版本的源代码中,包含该软件包;  - `, O& p$ T! t/ v3 T
    3.util-linux-2.11r-10.src.rpm,  , r; _& w* H3 _0 ~6 |( g# @

    $ [2 [) \3 j# Z& h" f可在http://rpmfind.net/linux/RPM/redhat/8.0/i386/util-linux-2.11r-10.i386.html处下载,注意下载源代码包(..src.rpm)
    ; B* g, U" y/ v1 s2 g. A
    ( g+ {9 Q$ U/ n- }% W+ Q; s[b:804aea7097]关于作者[/b:804aea7097]  ! F0 R) D; V* x) I

    - E/ w/ g6 ?. L* z$ c* u郑彦兴,男,现攻读国防科大计算机学院博士学位。您可以通过电子邮件 mlinux@163.com和他联系& c% f3 A5 e# T' T% ~
    ( y5 V" T/ S  f. B+ f, g/ a
    </P>
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    数学中国网站是以数学中国社区为主体的综合性学术社区,下分建模、编程、学术理论、工程应用等版块。从2003年11月建站以来一直致力于数学建模的普及和推广工作,目前已经发展成国内会员最多,资源最丰富,流量最大的数学建模网络平台。我们始终秉承服务大众的理念,坚持资源共享、共同进步的原则,努力营造出严肃、认真、务实、合作的学术氛围,为中国数学的发展做出应有的贡献。

    1253

    主题

    443

    听众

    -516

    积分

    复兴中华数学头子

  • TA的每日心情
    开心
    2011-9-26 17:31
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    自我介绍
    数学中国网站(www.madio.cn)是目前中国最大的数学建模交流社区

    邮箱绑定达人 优秀斑竹奖 发帖功臣 元老勋章 新人进步奖 原创写作奖 最具活力勋章 风雨历程奖

    群组越狱吧

    群组湖南工业大学数学建模同盟会

    群组四川农业大学数学建模协会

    群组重庆交通大学数学建模协会

    群组中国矿业大学数学建模协会

    如何实现自动登录Linux (Runlevel 5) 8 K6 B+ T5 s, }2 `# L% ?8 Z$ A" {

    3 l: T1 i+ S4 }& {' J机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。 " \/ m  R+ @# K5 _! c
    一、linux启动的最后阶段的工作 * |' q: ^* C& Q% c) U5 x$ L

    6 F- Q' l. E' f2 L; alinux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有:
    , [2 B" Q/ o# \! z1 f1 l4 |! n, P. S2 M2 T" E
    运行xdm启动X window;  * b2 \9 m9 G4 R& {) ~2 T
    运行gdm,进入gnome桌面环境;  " e8 J/ c6 o6 D. X* I& Q/ O9 K
    运行kdm进入kde桌面环境;  ( s% y+ s, b9 _, y
    自动登录进入linux;  # W. U+ F4 w* q* u- Y4 F- w
    prefdm脚本框架大致如下:
    7 u4 K4 c  K& L) a/ ]5 d9 V5 ?2 G6 z9 f6 C/ S
    #!/bin/sh
    6 B  E! B( R6 k9 sPATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    ' J$ s( t; \$ f3 d" b$ `, Y) n! m$ A. /etc/profile.d/lang.sh 6 ?: y, Q% {0 L$ ]7 ?7 `
    # 第一步:查看是否为自动登录 # p- u! J$ c8 w' {
    if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then % ~/ U0 g3 u# s4 B( ~
    if /usr/sbin/autologin; then & _6 V- n4 N3 b/ [1 P
    exit 0 ( e7 x' J) w. G
    fi
    , a( U8 R* b4 G. l* W6 Rfi
    2 o, v! `* e$ I( G5 R) `) w0 Z/ `! W: x# ^
    # 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式 9 M, S2 Q+ T/ w: ]) h
    ...... / U% Q0 E, d# y
    # 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。
    8 @4 ]" e* R3 k+ w% [......
      [5 Q* K: }( n0 R5 A# U
    6 ^7 C: y- ^7 P( Z  
    " ~! v$ [/ q: l; j$ p- |
    + b6 l* e5 b& H# v: U2 Z" v* z% v& _1 D3 g) \* s6 E7 h% H& d5 K
    二、自动登录的实现(autologin的实现)
    7 s/ L7 z( a/ X* @3 K3 [+ p* K! Y- e" @
    在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。 9 U' t9 L; z: e1 |+ A; n/ R/ z  C

    / }2 F0 y$ k5 j4 U& g$ k% O自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。 + u4 D& Z  |9 X5 o" j- s, A% A
    ; i$ N% }/ R  S" j) _
    Xinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。  
    % B6 e% J" W2 Y" [; x9 }' J( k# F+ F实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。  
    ! M+ e- l! J8 u6 b. `startx脚本的最基本框架是:
    6 H  Y: h' n0 O0 f- M: e7 _, N) e) a* E* v
    a、 寻找.xinitrc,如果没有则使用xinitrc;
    + t2 L: ^& S  Z# o0 d# rb、 寻找.xserverrc,如果没有则使用xserverrc; $ L- }8 z9 r: y
    c、 根据找到的脚本确定xinit的参数;
    . @3 \' [) Z- D2 w6 y! o1 X/ w4 _( e' m# O' v) `
    由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录: & \. o/ I8 s* Y' u

    ) \9 Y1 W1 Z5 q8 }( {" A
    1 L3 l) s. d( d1 z+ \/ [9 i2 m#!/bin/sh 2 V9 M% s, E% w5 |- j
    PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    3 b6 p" N) V$ k  i! }! ^' }( w. /etc/profile.d/lang.sh
    , b; v- v- f2 B( r" G5 w& Q3 A# 第一步:查看是否为自动登录
    3 _8 q+ r* S. I4 C, u: ~#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then : \* x6 T3 j( @9 T( c/ }( l
    #注释掉上边的条件测试,直接运行startx + w3 H1 `  P6 s) b5 ^$ Q
    if /usr/X11R6/bin/startx; then
    " `. u5 Z0 Z' Uexit 0
      A. I, A; s; _% k* {fi / ?1 x  o+ N' E( f/ [+ o! C4 M; m
    #fi
    . [* b  t4 ?0 M; X3 a6 m4 ]+ Q5 Z6 [' c' T+ L% X
      
    # l, N1 }' `3 v" x* D5 J( _+ x$ W$ `/ t  h% P

    5 X1 C* J1 t; R7 V. t1 g$ ?当然,应确保/etc/inittab中的启动级别为5。 8 f1 b8 j% r0 N% U2 v

    0 |3 E+ c9 [% \重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。 ) a4 a. C; F) F! N- U# o( y6 S

    1 H2 J2 g+ h6 a6 X( ^) k* Z三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。
    * _, Z" Y; O1 L* O. O0 N1 U6 K8 g4 L
    ( d4 s: R* g+ T0 @5 p观察原来/etc/X11/prefdm脚本的自动登录部分:
    ! T" \; B+ A4 Z9 L1 j2 E& A& Z% B
    - Z$ s5 R, l8 P) _& Y' I6 D2 {( R* Y# y" R6 }0 I- j  m7 H- ~; {
    ...... / D$ e; m+ H5 R9 l% x: X7 Z$ ^
    # 第一步:查看是否为自动登录 4 R% i+ ]3 [0 y& s# Z
    if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then $ |0 j/ U9 `+ x! h5 Q
    if /usr/sbin/autologin; then
    " O, z: f' p1 m$ Gexit 0
    0 h4 Z3 _. g+ B- c5 `4 k% @fi 8 [1 s0 @- G, \) X
    fi 4 b. x5 y7 w+ ]% r
    ......
    % o4 e/ d2 z. t" G7 L7 i8 v' I& T1 x* ~: H8 r; a
      
      g4 [' Z) W7 L/ k. F0 Q+ |# H- d& s0 s

    , B9 h3 _* w" y2 y0 J不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。
    7 K2 t; j, \0 w  j5 s" |
    & J! j+ r" a( ~: M1、/etc/sysconfig/autologin配置文件的实现:
    & o4 y2 K; o- F* E- g- L
    - g/ n* b1 w8 G& F* D, V, O4 G! B; d/ S( R, o. I# S2 X6 }; q9 ~
    #config for autologin % c8 t2 `. F* [  |* @
    USER=root & Q0 E& v) |) ]; N6 ^6 D1 j
    EXEC=/usr/X11R6/bin/startx
    ! V8 E, r6 Z* h' D说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。
    % \8 [& Y/ ?; c
    / M" J% r$ m* Y4 {0 ~  
    - H9 {/ ]- g2 w8 g4 m* V4 F: _. c
    ( x/ U" s" c( F. v$ a- W9 O: H
    $ i- \  H8 S/ m+ o5 z2、/usr/sbin/autologin可执行文件的实现: # D$ F. m/ {: m$ o+ X: Z' K6 N8 K0 @& N

    , v; I. E. U+ b" H1 Y) o+ l! ]' |) \0 W4 m* m
    /********************* % s1 L1 |8 `; T7 H: V
    ****  autologin.c  **** & A, O( P6 p7 i) X0 c* J
    *********************/ 0 c1 i4 {; \8 l
    #include &lt;stdio.h&gt; " K5 M# W; I: ^% l: _( d
    #include &lt;unistd.h&gt;
    + B/ x6 }8 w  E: e#include &lt;string.h&gt; 3 g' S  W: Z. s7 X) m# H
    #include &lt;errno.h&gt; - t+ y# V6 ~: ^9 y9 `6 }" U* C
    #include &lt;sys/types.h&gt; , d$ a& F& d& y3 K+ x1 _# H* G
    #include &lt;sys/stat.h&gt; 1 L" Y1 U# v* T
    #include &lt;pwd.h&gt;
    " T! z8 U/ @# j' [) a: H* a0 M7 I8 l! l* G. f
    int main(int argc, char **argv)
    8 W; j% M9 ^; O4 b" w{
    3 e1 K. C8 K% Z; ~2 s2 wstruct stat st; 9 }3 E; d; w4 z  _( O/ z# E
    FILE *f;
    9 `) V% ^4 s8 S5 z% H; Pchar *cfg; . ?) P( g; Y+ U, t" g: m
    struct passwd *pw; 2 M8 w" L" C2 i  o) y+ i- P4 ?; M
    uid_t uid;
    / l+ |2 n0 Z5 i( R* i- P3 u6 W3 Ygid_t gid;
    * g  @' Y# P: R( _char *dir, *shell; $ N, H7 k( S" l! x
    char *user=NULL;
    3 x- b; ?! \, U2 M1 Echar *cmd=NULL;
    6 S" F/ |) W6 `) J: K1 z6 D+ C+ P1 n0 @' }6 N" Z
    user="root";
    7 m3 b% l  H0 y6 w/*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, " ~7 t% N& ^5 y$ j* O& z5 T
    登陆用户名应该从/etc/sysconfig/autologin中得到,
    8 P5 @  ?+ _3 }" Q1 x程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/ ! |: b- P: u9 n' x' a" H& [4 Q
    cmd="/usr/X11R6/bin/startx"; # M; {" Y% v- `5 y1 R/ m6 x2 C
    /*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/
    : y6 v+ I! }* s3 J2 X8 n  R+ Z  O7 x  o; E* H) I
    pw = getpwnam(user); + E! Z1 X& v7 N& ~( B3 z
    //getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。
    / t2 w1 O* n$ J1 i; ]: L( `if(pw) { : C' j, i0 N; T9 }- S/ R
    uid=pw-&gt;pw_uid;
    . l' ~! D( G4 d) |gid=pw-&gt;pw_gid; dir=strdup(pw-&gt;pw_dir); + G" i' q. X8 ]* ?9 B" ^
    shell=strdup(pw-&gt;pw_shell);
    / v0 }+ v* I3 \4 w! R}
    ! [2 }4 m9 @3 r" E9 M1 p$ v//获得用户相关信息
    ; i5 J+ b2 j1 J3 _2 v9 N* p else {
    , @9 f& G# ?2 }- p- @4 g; {+ Sprintf("ERROR: No such user %s!\n", user);
    0 x! X# h2 {1 h" ireturn 1;
    # H: ?4 v2 e+ A}
    3 o7 \( U3 U, f: H  q4 `) ?2 K, S* C4 x  s2 C) J1 s
    chown("/dev/console", uid, gid); 8 B; n! \, k$ e
    chown("/dev/tty", uid, gid);
    % O' I' n. m7 W8 B8 I//为控制台和终端设置用户ID及组ID
      ~& u' ^( E1 y& w9 E* R
      X2 W8 Y% B- i" H4 P! e6 b//下面是设置用户相关ID
    9 Z; T% M. }% R/ k4 b1 R/ O, s: ssetregid(gid, gid); 7 M4 L+ w0 X. I9 i0 I
    setegid(gid);
    & Y, W9 ~( w- Tsetgid(gid);
    0 {$ M3 @( ^! Y- v% W3 m& W$ S7 H+ xsetreuid(uid, uid); " `4 i2 i4 F4 n
    seteuid(uid); " d: q+ i8 C, c$ s; Y0 D5 o- `
    setuid(uid); 5 [! h! q" B: s3 {6 [0 W
    / t, U+ [- s* O. Q7 K! R
    setenv("HOME", dir, 1); ! v: [* X. C* {  {  ]
    setenv("SHELL", shell, 1);   J6 I, k1 s" e- \
    setenv("USER", user, 1); ! J8 K2 d& y6 m# v3 p6 Z: @
    setenv("LOGNAME", user, 1);
    / _1 j/ ?* Q! N* G//设置用户相关环境变量
    ) C# }, ?: k  n. d4 `! ]! m! e9 B" F0 q
    chdir(dir); 4 d# s  z3 e1 V& O, R) F5 @
    //切换到用户根目录
    ' W6 f8 m! p2 i, d4 vuser=NULL; 6 X4 ]0 g, L. q& m3 _

    - f: H$ G* C3 i' ~execvp(cmd, argv);
    . f' v  P. ^; {: {0 C' a- @/*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */
    * N3 c1 l& I( }8 Yprintf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno));
    9 n8 M5 {$ ?" Ureturn 2; 1 L3 R5 u* m) e+ J- @
    } # O( w2 c: q7 b( |) o* T4 S1 R5 z

    ) w3 ^, n) J( ~  
    & N% U# |$ M" r6 l3 D& N' a/ H3 _* R2 u- h# O4 ]1 t

    6 ~* H! D* i2 I8 t运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。
    & I7 r& p$ Q6 q6 H/ _, U
    # @! ~0 e  u: p. H& P如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下: 6 a. N# S6 ?4 ]4 y2 o
    ) ^# M. t6 e& P( ?' ^

    $ P$ K: w% X! Y" _6 k% Z. H& Z3 F...... 4 t- F" c2 }( |$ S+ D
    # 第一步:查看是否为自动登录
    ) C) G& R. o: g& eif /usr/sbin/autologin; then
    0 E, h* ?4 V  p  Q' Aexit 0 % ?4 D/ n& d" H3 x  S
    fi 5 v/ d' O3 v3 l' i* u1 T: G: R- m
    //第二步 ...... ) H, _6 G$ `+ I5 o
    ......
    1 Y. u" q# c- _4 m* ^/ D9 d- ~. h9 k2 Q$ ~2 Z5 M( L
      
    $ g$ v7 ?) M; i+ d
    : L; B6 G6 u3 L7 h% w
    ! w* G/ A0 d# M/ C( r( Z4 k即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。
    : g. c3 Z3 Z2 U& a3 M4 n
    % Y* V! B* e9 O" O/ v四、选择进入kde或者gnome,并自动启动X window应用程序
    ' c. V5 I2 }. B  [& V
    " ?' m- ]8 W. [0 x如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。  ! y3 d% l# [& X5 ]
    一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。  ; T  C( l3 ]6 A$ t# V7 f5 o

    : R" U* @4 a) X( c( n$ I* I* _0 I1 ~3 y  [& O+ e: J# Y
    http://www-900.ibm.com/developerWorks/cn/linux/l-tip-prompt/tip20/index.shtml
    数学中国网站是以数学中国社区为主体的综合性学术社区,下分建模、编程、学术理论、工程应用等版块。从2003年11月建站以来一直致力于数学建模的普及和推广工作,目前已经发展成国内会员最多,资源最丰富,流量最大的数学建模网络平台。我们始终秉承服务大众的理念,坚持资源共享、共同进步的原则,努力营造出严肃、认真、务实、合作的学术氛围,为中国数学的发展做出应有的贡献。
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-7-17 17:58 , Processed in 0.406654 second(s), 57 queries .

    回顶部