QQ登录

只需要一步,快速开始

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

如何自动登录linux[转载]

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

1253

主题

442

听众

-586

积分

复兴中华数学头子

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

    [LV.2]偶尔看看I

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

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

    群组越狱吧

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

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

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

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

    跳转到指定楼层
    1#
    发表于 2004-9-27 14:26 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta |邮箱已经成功绑定
    <>如何自动登录linux[转载]</P>
    ( _  A" g7 Z/ Z! X<>本文以redhat 8.0操作系统平台为背景,阐述如何实现启动级别为3时的自动登录,及自动运行相应程序,并简要介绍了如何在redhat 8.0下自动登录X window(系统启动级别为5),并自动运行指定的应用程序。 - N: D# W. [1 ^6 S  \
    [b:804aea7097]一、启动级别为3时自动登录的实现[/b:804aea7097] 5 V2 _5 ^/ ~/ u: Z: K. y
    ; o# C2 K( W% a+ o1 R
    启动级别为3时自动登录的实现涉及两个软件包:mingetty-1.00-3.src.rpm软件包及util-linux-2.11r-10.src.rpm软件包。 # \, j7 m; M; j4 u+ ^

    $ [- n2 _6 v) K8 @9 s: Q5 _! I(1)mingetty-1.00-3.src.rpm软件包  " u* i' `1 X% g3 I8 a' R
    对于启动级别为3的自动登录的实现,仍然需要考察/etc/inittab脚本,  
    * Z& m" \/ [" D3:123:respawn:/sbin/mingetty tty3 % }7 h4 G- _% W3 p& H+ }# M8 ]
    ; k! F6 x/ k- v2 a+ Y8 t  E# d) C
    6 ~# P$ s- O* a8 R+ v. ^
      
    ; o+ y+ _! P* r0 v. R
    " |% Y6 L8 F. J7 r/ c* B: ]$ f/ H, R4 n- F, M5 ]( b! c: x
    因此,如果想在启动级别3的情况下实现自动登录,必须要了解mingetty的功能,甚至要修改mingetty的代码。用命令rpm -qf /sbin/mingetty 可知redhat 8.0版本的mingetty包含在mingetty-1.00-3.src.rpm软件包中,下载该软件包,安装源代码,缺省情况下,代码会安装在/usr/src/redhat/下,我们关心的只是mingetty.c源文件。mingetty.c约有五百行代码,主要实现如下功能:
    ) K. v9 |; c1 L
    % l$ S( }9 [4 A9 m# M
    # F0 h6 R* K8 t* A4 t5 P  |. n打开指定的tty(由参数指定);  8 t( f9 Z5 f: s, h2 l
    提示用户登录(login:);  
    ( v, i9 w5 W5 }/ O; v& [获得登录用户名;  
    * S4 V; ^3 \5 P- `5 k把用户登录名作为参数,调用/bin/login。  
    ; y  u% _& P( }; }0 `6 d" }+ T! x$ @% _; p& f2 M# i$ D
    我们所关心的部分实质上只有以下三行: . n' A! Z- I: l! w+ T; ]% D& s) K
    7 r( f% E) Y' o0 Z& j

    , a- q8 p( Q3 Z5 m8 B+ g... ... # L% _& X5 z8 n3 X; `. L# q% Y
    438 while ((logname = get_logname ()) == 0); //mingetty.c文件438行 5 a2 \- C& X8 G+ U* p- O- c
    439 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL);
    + w  q6 |3 m- A5 o" p) Q3 ]440 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]);
    0 y( t, F& |# I0 |/ }2 H# n* I% f... ... ! n  A" X+ k# U  b9 m
    6 @- n0 R! c; K7 n, t9 |
      
    ( Y3 E) s6 I1 [- ^8 C% ^
    - s/ G/ j1 {+ V* C+ d第一行的功能是输出login提示,并获得用户输入的登录用户名,登录用户名由logname返回。因此,可作如下修改
    3 L' R! T3 q( P) U. b8 H& ]( B
    # }1 m" {/ c) _* t/ w* y
    ... ...
    ' m0 ~4 I. u  [438 // while ((logname = get_logname ()) == 0); //注释掉本行,不再提示login:
      r( S7 k0 J. v. e: K9 M. Z439 logname = "root"; //添加本行代码 # j9 W3 ^7 z6 O4 Y  A; W
    440 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL);
    8 `6 G( N* t! r( C; k7 d441 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]); # Y" D+ h3 q1 G+ a' O: {
    ... ...
    9 O" T+ A/ k* _
    + u9 U# W3 |1 S# q0 I  ' w+ m. V8 h/ n: X& A

    5 l2 ]2 j+ X: z注意,这里假定用户以超级用户身份登录。
    - l$ n5 }' a- p9 h, t7 U" U- l& o1 p
    第二行以用户登录名为参数,调用/bin/login程序,进一步实现登录。因此,要想实现自动登录,还应该了解/bin/login的功能,必要时还应修改其源代码。
    8 K* B; s$ V0 Q6 [( J! R  ^
    . X+ ?/ n5 K& o4 U' g) N第三行为出错处理。 2 c  u% J9 i+ o& ~+ n) b
    ! F7 c8 Z6 \# ?/ Y7 E
    (2)util-linux-2.11r-10.src.rpm软件包  
    ' a/ _8 p, L) a% W9 [( 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要实现的功能,并对相应部分作必要的修改。 ! h* J' U. r3 f# m  B7 K, n+ p
    / ~$ @& ~( d- [5 H+ @! e7 u, G+ C% U
    Login程序主要可以分为以下几个主要部分:
    5 f+ G4 J! @1 ^+ z6 Q' ]0 o( w. S; m9 M8 w9 ^) P! z1 M+ N% S1 A
    1.Login首先检查登录者是否为超级用户,如果不是超级用户,并且存在/etc/nologin文件,则输出该文件内容,并中止登录过程;主要由checknologin()实现;  
    + x# p# u( U/ D  M# p3 c2.如果登录用户是超级用户,那么login必须在/etc/securetty/中指定的tty列表中实现登录,否则将导致登录失败。同样可以不指定/etc/securetty文件,此时,超级用户可以在任何tty上登录。  
    9 B$ l6 X2 a& X; B4 C3 C3.经过前两步测试后,login接下来将提示输入登录密码(由getpass()调用完成,有兴趣的读者可参考其手册页面),并进行验证,如果密码不对,则提示重新登录。  
    , D7 z& d$ s2 m; F, C4.顺利经过密码验证后,login还将检查是否存在.hushlogin文件,如果该文件存在,则执行一次"quiet"登录(所谓的quiet登录指的是,登录时不再提示邮件mail,不再显示最后一次登录时间,不输出任何消息。启动级别为3时,正常情况下输出这些信息)  
    : T! f3 E/ g5 C/ U5.login接下来设置登录tty的用户ID和组ID,并设置相应的环境变量,包括HOME、PATH、SHELL、TERM、LOGNAME等。对于普通用户来说,PATH缺省被设置成/usr/local/bin: /bin/usr/bin:;对于超级用户来说,PATH被设置成/sbin: /bin: /usr/sbin: /usr/bin:  ; C+ x9 w" ~9 X% \0 t! f/ _$ D" U
    6.login的最后一步是为用户启动shell。如果在/etc/passwd中没有为用户指定shell,那么将使用/bin/sh,如果在/etc/passwd中没有给出当前工作目录,则使用"/"。  
    9 l. |$ s2 Z" D5 Q' p3 {至此,一个完整的登录过程就结束了。 * _! z' D% `9 Z9 ]7 M

    ! @; ]3 x) N, ~$ y7 L2 u) s" J从以上对login源程序分析过程中可发现,如果要实现自动登录,应该在第三步做文章,设法绕过提示输入密码以及对密码进行验证这一过程。实际上很简单,login源程序对是否要求输入密码设置了一个开关控制passwd_req,缺省情况下,其值为1(passwd_req = 1),即要求输入密码进行身份验证。把该行代码改为(passwd_req = 0)后,问题就解决了。即对源文件作如下修改即可: 7 W# C3 P3 y+ Q  A, L. d

    ) u9 z6 A+ k9 l- j
    ; Z  l5 d! P6 m. H+ P... ...
    # u) D- ^' [5 {1 w) y- @402 fflag = hflag = pflag = 0; //login.c文件402行 ! R6 Y+ k; \! A) h0 D
    403 //passwd_req = 1   //缺省时,要求进行密码验证,注释掉本行
    4 w3 }% ~* n" }% B7 j; ~, u4 D404 passwd_req = 0 //添加本行
    . e% W" _# O9 i7 I... ...
    / ?% @5 {  G& Y* z8 t# f
    + ?+ M6 @$ d1 d* O; h! R  
    7 Y( c) s& R) f% K
    * S+ ^+ q! C& o* x修改后,可以直接使用util-linux-2.11r-10.src.rpm提供的Makefile进行重新编译,也可以自己对其编译:
    - S1 O" z' J# L1 F4 I2 N* a$ D# N4 G; ^' v4 f! J3 Y0 f5 @' w

    7 j6 W1 g, N3 y/ n1 Ggcc -o login login.c setproctitle.c checktty.c xstrncpy.c -Wall -lcrypt注意包含后面的编译选项-lcrypt,否则会出问题。
    " N8 U' ]% E: O" q' j& Q3 b: s- O+ N) K6 e* v0 f3 _; K+ r* Q) T
    7 ^. M  x) N7 j5 e) a& g
    有了新版的mingetty及login后,拷贝mingetty到/sbin/目录,拷贝login到/bin目录,并将/etc/inittab中的启动级别设置为3,再重新引导系统即可(读者可以自己写一个脚本实现上述过程)。   l0 C! M8 ~  q4 ?) ~. y: x. W% \; u
    ( {3 _; X: s3 ]  \
    如果读者对mingetty或login代码的其他部分感兴趣,可以反复修改login.c或mingetty.c的源代码,测试一下代码的功能,这里要注意的是,在拷贝新版mingetty和login之前,一定要把原来的mingetty和login备份,同时还要准备系统引导盘(有系统安装盘亦可,这样读者有机会键入linux rescue),在测试新版程序前更应如此,如果对代码修改稍有不当,系统将不能正常启动。
      p' M  @+ t8 s
    7 V( A1 f0 S' [% {9 H4 y2 R1 d如果不想再作进一步的代码测试,只是按本文给出的方法进行代码修改,在系统启动上不会出现什么问题。
    ' y! h. J" i+ |7 @' `! u4 E5 i6 R5 H
    [b:804aea7097]二、自动登录后,自动运行特定的应用程序[/b:804aea7097]
    # T  s4 P9 q) T8 @  w
    3 }$ x2 E" ]1 [$ `& C在实现了启动级别3时的自动登录后,自动运行应用程序非常简单,把应用程序添加在/etc/rc.d/rc.local脚本中既可。(读者可以尝试一下把startx加入脚本中,看一看效果如何。在某种意义上,又增加了一种自动登录X window的方法)
    ; L9 J$ I. i, x( t6 I$ E
    % r" Q4 ~2 y6 R5 ][b:804aea7097]三、对自动登录X window(系统启动级别为5),并自动运行指定的应用程序的补充[/b:804aea7097] - @: D) V2 `7 z5 l
    ) Z/ y& |& G  F  V1 N
    在"如何实现自动登录linux"中,主要以redhat 7.2平台为背景进行阐述的,其中的自动登录部分可以直接用于redhat 8.0中,不需要任何修改。 + c" W, ?/ B% J' a- |& a8 \

    ) E' E, a: D) D# W但是,登录后自动运行应用程序的接口在redhat 8.0中有所不同,主要是登录gnome后,自动运行应用程序的接口有所改变:首先点击面板上的GNOME帮助(那个红色的小帽子),然后选择/其它/首选项/Sessions,在Session对话框的启动程序属性页中添加要启动的程序即可。
    ) e- z1 A3 F8 R9 I! M# x  Z2 R9 t( R& y% o, g; j* }
    对于登录kde后,自动运行程序的接口没有改变。
    ; O# c9 S: b0 g( c4 j) i8 T
    ' D$ X- q5 o& k: {4 J# M[b:804aea7097]四、结论[/b:804aea7097]
    1 P$ B' r- ?& O; n: o$ K; N9 B  ?8 K- C' o. v' L+ m! Q
    本文同"如何实现自动登录linux"一文,基本上解决了如何实现自动登录Linux,并自动运行相应应用程序的问题。对于两个最常见的启动级别(3、5),都给出了各自的方法。 1 {; x5 b* C; x5 \4 Y" _8 H) V
    : L) k, |  ?) B9 M
    在系统初始化到mingetty及login这一阶段,内核实际上已经完成了引导过程,已经到了系统初始化的最高阶段,与内核没什么关系了。此时,主要是/sbin/init根据/etc/inittab的内容而相机行事。读者可通过(man 8 init)或者(man 5 inittab)了解更多东西。
    % s+ Y" G' Q( r. V, }! ]6 X
    * r  M: `6 [5 X5 [在对文中提到的软件包修改时,请遵守GNU General Public License(GPL)相关标准,另外,替换login通常被视为黑客行为,应当谨慎行事。 2 i! }5 K& V7 v! p, z2 x5 m

    6 {# j' K$ k3 T8 e! t( l
    8 X# Y+ P9 `0 \/ q: T9 u$ @/ v7 J" J* K
    [b:804aea7097]参考文献[/b:804aea7097]
    & [% k# Z7 `/ S+ y. }) V7 X) D
    * m1 `! E3 _2 I& `- R  c
    0 _2 {  f4 j# G1.login手册页面  
    3 G1 s$ O& P$ k. g1 {2.mingetty-1.00-3.src.rpm,在redhat 8.0的发行版本的源代码中,包含该软件包;  2 A! ^8 M8 F3 a1 V' M
    3.util-linux-2.11r-10.src.rpm,  
    : }  ^; e2 D6 G7 d7 W. v( T7 ?' a0 K! t* v  L7 h0 q# }1 v9 x
    可在http://rpmfind.net/linux/RPM/redhat/8.0/i386/util-linux-2.11r-10.i386.html处下载,注意下载源代码包(..src.rpm)
    2 s  W. y6 Z1 F2 P% Q- b# V* M4 y: I1 S; @# l" s( ]( e7 {& x
    [b:804aea7097]关于作者[/b:804aea7097]  
    + Y- ~6 s) `, w/ p1 S+ }" Q0 l7 J+ D8 U5 J/ @& ?2 v0 r" x
    郑彦兴,男,现攻读国防科大计算机学院博士学位。您可以通过电子邮件 mlinux@163.com和他联系
    + s' y8 I% U4 b4 d: e
    2 d# o9 h: _* P& F% E</P>
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    数学中国网站是以数学中国社区为主体的综合性学术社区,下分建模、编程、学术理论、工程应用等版块。从2003年11月建站以来一直致力于数学建模的普及和推广工作,目前已经发展成国内会员最多,资源最丰富,流量最大的数学建模网络平台。我们始终秉承服务大众的理念,坚持资源共享、共同进步的原则,努力营造出严肃、认真、务实、合作的学术氛围,为中国数学的发展做出应有的贡献。

    1253

    主题

    442

    听众

    -586

    积分

    复兴中华数学头子

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

    [LV.2]偶尔看看I

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

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

    群组越狱吧

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

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

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

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

    如何实现自动登录Linux (Runlevel 5)
    ( U; b  V# x  Z" ^" Z# {% Q4 p4 `# W
    机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。
    $ V% x  D6 z& l, N! t一、linux启动的最后阶段的工作
    5 J* M; I3 s( J+ h
    4 R. [9 l: F) a# r! T$ glinux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有:
    1 B4 y1 _* o7 ~9 Z+ Q$ M7 ^4 K: h" K% P! e
    运行xdm启动X window;  5 k3 _5 W/ T- c
    运行gdm,进入gnome桌面环境;  - t' B# ^4 H0 t2 C. f
    运行kdm进入kde桌面环境;  ( U, Q( F, v, U. Y+ p- ]
    自动登录进入linux;  * `& m% {2 }8 x6 x" L
    prefdm脚本框架大致如下: 4 d0 Q" j# j- d0 S
    : A) H' z( {  A# @0 ?2 |( U9 `7 d
    #!/bin/sh % R' |! _% J1 o+ O3 M" g9 G
    PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    + Y# [5 ]8 Z" t: n0 t6 H. /etc/profile.d/lang.sh
    9 c: A( i9 S1 q  t# 第一步:查看是否为自动登录 & |& r( [6 H. ~- B1 Y, i
    if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
    % u8 g7 A" n0 C2 @+ W$ Vif /usr/sbin/autologin; then
    % j8 s) W# C, zexit 0
    4 c, f9 }! z) h: n4 a3 m( \; C' ^fi # ^  \! G' i# G; ?
    fi ! m9 v: n6 l1 q6 P- F% p2 X/ c) W
    4 K, ?/ [( E% Q4 J% Z( z
    # 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式   E1 v( l6 n4 D2 K% d
    ......
    $ h# ~' j9 z  ]3 m; ~) T# 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。
    $ I, a5 F: \% H1 f2 W5 j......
    ' u0 Z5 I" F& o+ S1 N
      i: Y4 `: P% n. r5 E3 A. N  
    - v2 i6 k2 S$ g( D0 C6 `  m1 h0 x
    2 o2 H. K- K8 B( |1 u% \8 V! Q8 x
    2 u4 Y4 V* C0 C" @5 [二、自动登录的实现(autologin的实现)
    : r. Z  @  d0 e/ V/ P/ j$ z  ]8 _; Q* J. H$ R
    在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。 - o) }: g# t' S/ `

    " _+ s' ~- w5 y, w# W4 ~自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。 , Z! `) c" P& l8 P9 C

    1 r! f+ a$ ], B3 `Xinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。  / q5 x, `- F( m: ]* L
    实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。  
    ( X$ C' ^! p1 K  Q' Q# hstartx脚本的最基本框架是:   }) P" l: {7 ^1 b
    ( l5 b9 ^* [7 w) N9 [' v
    a、 寻找.xinitrc,如果没有则使用xinitrc; 3 G/ N: g, S5 Z/ B& k7 x& Y4 H
    b、 寻找.xserverrc,如果没有则使用xserverrc; 5 m( A: c! A3 M
    c、 根据找到的脚本确定xinit的参数; 6 c. X/ x4 Z, J9 S: _
    8 `" y* \4 I0 V. q6 R5 ~+ J
    由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录:
    1 @9 J! Q$ ^$ X3 b, S5 z/ A& [4 ?" x# K
    ) D/ T+ h0 p' N" g" \
    #!/bin/sh
    9 b: H! }" Y  {# \( D; x/ J+ T) aPATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin 5 z" e6 i0 x' t5 J0 u
    . /etc/profile.d/lang.sh # T& x  N/ ]/ A: \6 v
    # 第一步:查看是否为自动登录
    3 S  _! n. s0 Z) \+ \) F#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then / x+ G, a4 r9 y7 p
    #注释掉上边的条件测试,直接运行startx
    * ?* \1 H) u! l! xif /usr/X11R6/bin/startx; then   q$ P& b7 M* h; M) B% p
    exit 0
    ) m" Y) [( D- kfi
    2 C" n# U0 }3 P! g#fi ; W8 |* V4 F2 S/ [* P4 s+ K2 s
    7 [. D3 }" o+ B. Q1 l) }
      8 @2 y7 ?% c+ |- |
    ' L- g6 Z& P6 F

    % y& P& g- X, t. {当然,应确保/etc/inittab中的启动级别为5。 5 {; ]- f) G8 A; m( H) I) c

    7 K8 B4 v: j( R7 ~重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。
    / M) k# W9 J' w% C2 Y4 V2 ?' h6 l! K1 L" k2 U' d. U6 G
    三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。
    7 B' V0 M( e6 t( R& ~* c7 ]7 c# ?5 e4 L( M! }5 m
    观察原来/etc/X11/prefdm脚本的自动登录部分: ' X5 C0 L* u$ |6 L' V8 u# K% g% I+ ^( b

    + Q* _7 q7 Y/ J5 s9 l
    & _) i& s& k1 p5 _% ^/ f# {......
    8 o" ]. I$ M, S# P# f# U- ~: k# 第一步:查看是否为自动登录
    7 W4 J0 Z, E  a; w6 B8 rif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
    , I; e# M2 s7 l" ~! uif /usr/sbin/autologin; then
    9 z) {! e+ S6 Z3 Y8 \exit 0
    5 O1 u. K: K3 _+ c& nfi 6 T# z2 B3 X# y; D3 n
    fi / t" P) W& C) f
    ...... 3 {* \) z; H  r" J* t: v& e! U

    2 Y, \; v; l3 i! R  ; [" r; \1 a6 X! w( b

    ' M: M% D0 k5 t3 H! x8 X
    1 V1 A0 f' l( u% {不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。 4 K. s/ z; D/ k2 E% Q/ d9 a

    6 u* g2 Q& w3 M" t; N+ e1、/etc/sysconfig/autologin配置文件的实现:
    * v8 c8 A5 Y2 V" ^/ Y7 L7 N% g; f8 X# ^3 N7 F$ h4 m5 f
    6 ~  q( R* N( `& t% l$ I
    #config for autologin
    3 h5 z* X; o; \2 q: e  ^USER=root
    5 i5 M2 z/ e- V& X, w8 JEXEC=/usr/X11R6/bin/startx
    9 v# `4 O% K; C5 _1 K' I% y说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。
      D6 w/ X  B: j% L% c# {8 G5 v" O4 z1 ?7 w
      
    # H) z! q  u4 g$ M3 W$ |7 g
    ) z! p+ t5 ~% ]* {. z3 b  A5 @* J) h$ _/ D/ {
    2、/usr/sbin/autologin可执行文件的实现:
    9 D, w* [0 T( L! c/ M
    * V# R* z8 ^, y1 x# O; w1 b% L0 X0 \/ k* n/ Z! O) u) G
    /********************* . T% R" [1 I) E
    ****  autologin.c  **** 6 R% J8 P: ^% b# |  u- y* R+ v
    *********************/ ! M2 s5 Q4 n. F, t! N
    #include &lt;stdio.h&gt; 9 y$ p) V2 L$ B" x  R( L' Z
    #include &lt;unistd.h&gt; " c% @, M9 A3 G$ K, |9 r9 h
    #include &lt;string.h&gt;
    ( O3 T. T8 T( `# J4 [#include &lt;errno.h&gt;
    % d8 ~9 j& E+ {( f#include &lt;sys/types.h&gt;
    " f3 t- j, o* r  S; F$ T1 M$ O; T#include &lt;sys/stat.h&gt; % N9 j5 T5 l2 f1 `4 z( ?1 w
    #include &lt;pwd.h&gt; - X3 N# S+ n" c1 t/ q& N  O
    ; M, v8 e7 t' w$ {
    int main(int argc, char **argv) $ J" J1 Q+ L+ O1 ?9 J/ |) U( G
    {
    0 ~& v9 s; a7 A. `! J' ]struct stat st;
    1 d, c( m+ D9 t( f! d& a& h4 C' R( ~FILE *f; ; s4 u, X, ?3 Y0 Z8 w
    char *cfg;
    ) i, ]; V1 Y% D) ]8 M+ Y' Wstruct passwd *pw; % f, K3 m) d' T& q6 |5 X' ]  d
    uid_t uid; : T5 L$ |2 q0 x
    gid_t gid;
    # L6 R% F! L0 r8 K0 Ichar *dir, *shell;
    1 R- w; w8 N1 K( Q2 U  {char *user=NULL; ; x3 \- T& x: c  k" u+ ^. Z5 P& X  |, E
    char *cmd=NULL; . {0 ]8 f/ d2 K3 C5 ~

    % j6 H$ \/ [% f  G/ r: huser="root"; , x: a! M' y) J- D3 b* ?1 k
    /*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, / k) j: d0 ~; G' }. ~1 c4 r1 L& i
    登陆用户名应该从/etc/sysconfig/autologin中得到,
    " s. K' x6 D' ^3 @; W  j程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/ : _0 q( f! f. h* m7 T, \
    cmd="/usr/X11R6/bin/startx";
    . t- T$ e) J- O/ D7 I5 o/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/ 6 `0 n& K2 W: d# i) W3 A

    : T8 V7 ]1 B! L  U4 H5 h- T( M+ xpw = getpwnam(user); # }! d6 d' V3 y( T* y
    //getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。 9 x  {6 ^* T- K) Y$ [
    if(pw) {
    1 |" z3 D0 ?9 m2 Uuid=pw-&gt;pw_uid;
    ) i. \. l0 \' }7 Ugid=pw-&gt;pw_gid; dir=strdup(pw-&gt;pw_dir);
    * X8 c$ l2 y" s" ishell=strdup(pw-&gt;pw_shell); 1 x3 t$ |* m$ Y- }9 b. t3 W
    }
    / j# o. [" k2 W//获得用户相关信息 $ g+ K, a% m$ x* W
    else {
    4 B* l% ~" b- @printf("ERROR: No such user %s!\n", user);
    * l* t* V+ F/ E! c! b9 y( m( qreturn 1;
    1 f6 F0 f( l' Y6 b" L# B, C} 4 u: A6 F# b* t) z

    & A5 T, z+ `7 N9 _chown("/dev/console", uid, gid); - u8 W% m5 {4 n7 z) J2 X4 ]: i" u
    chown("/dev/tty", uid, gid);
    / ?4 ^: Z4 L0 U- F9 I' r. @5 a9 Z//为控制台和终端设置用户ID及组ID 8 y; M+ G9 J9 f/ P5 m1 ~# i: \

    1 X" u( R% C5 ]1 m/ p//下面是设置用户相关ID
    + |$ a' k/ u4 {9 b+ V- h( ~setregid(gid, gid); , `/ @8 ?9 v0 }- C
    setegid(gid); , m' y) w' n2 n" J5 x7 W' v
    setgid(gid);
    " b# y" X% S2 c/ G+ S3 P) Nsetreuid(uid, uid); " K; h  `' F8 ?" n& e: G
    seteuid(uid); & E7 O/ _# Q, @4 D
    setuid(uid); ( P( N8 D8 r3 K
    5 M* V( r6 E/ y7 Q& @+ T6 x
    setenv("HOME", dir, 1);
    * F8 W$ z% e2 Y( R2 |5 [- Usetenv("SHELL", shell, 1); ( b( }$ E; o7 R* I  L2 X
    setenv("USER", user, 1); 6 T$ y& \. t2 V/ }6 M- X+ E' h
    setenv("LOGNAME", user, 1);
    ; s+ m; q8 e% H//设置用户相关环境变量
    2 T# e9 N7 N* Y% K' k0 y/ M% E* z. T
    chdir(dir); + W9 L5 q' _1 D, @  ]0 `* z; F6 b
    //切换到用户根目录
    4 x* x4 R# P' {( \9 ruser=NULL; + L/ D2 V0 V: f6 t
    $ d' [, A9 R& u/ e
    execvp(cmd, argv); + @2 S3 W8 ]3 y3 J. k1 q  w
    /*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */
    5 H5 c! d" {$ Jprintf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno)); 6 c) K% a9 z0 ~) @& C
    return 2;
    6 n/ ^/ w/ A  ?}
    5 T% X; J7 M  {1 `, e5 j& g  r8 B3 ^& a+ |
      
    * Z* n; W  t+ H! Y% t6 E
    . S9 T9 B/ v8 m9 t. m  D8 L6 R, C8 }) e' p
    运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。 5 w/ U: _  ~/ v8 I& k* U
    $ d4 t7 ~- ^2 @0 V6 a
    如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下:
    ' i# |* q+ l) F8 R
    % J% P7 G' I" D9 k$ J7 d3 G
    $ G3 Q' ]* _( f7 `9 x...... ! r7 A& O* }9 V5 S2 i
    # 第一步:查看是否为自动登录 3 D- j' C+ a. L, u4 L6 R2 X
    if /usr/sbin/autologin; then   R+ {+ r) d: d  w& U
    exit 0 ; [: r$ j1 d$ p" L; V/ m9 l; h/ X8 v
    fi 9 A+ n7 o$ ^! I( b' r
    //第二步 ......
    . @) p$ m& z7 U. e+ z......
    , D2 G- i1 x" M  l/ C, o& D7 d/ S' Z4 a  _+ S. q  A
      3 k6 m, k0 q; r. v+ Z
    : m9 t4 K! U4 T0 a

    $ K. |3 J) v, X, r( I6 `即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。
    % [8 t" s: r9 x9 U7 u8 m- @+ K3 K$ ?: t5 ^0 m+ F7 `: q
    四、选择进入kde或者gnome,并自动启动X window应用程序   Y- I6 |  e1 ?8 I$ e
    8 n6 v$ t" J8 j& f
    如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。  , z5 I/ ]/ f- d; W. I  d" S& g8 l
    一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。  2 u: q2 m/ c& F: [/ N! `
    9 Q7 o! j) d4 Q- E7 K7 X
    ! _: s- h6 p7 r# _3 ?& Q
    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-4-19 05:51 , Processed in 0.358525 second(s), 57 queries .

    回顶部