QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4278|回复: 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>
    3 i! K  I% i/ c* K0 l* _& f+ V<>本文以redhat 8.0操作系统平台为背景,阐述如何实现启动级别为3时的自动登录,及自动运行相应程序,并简要介绍了如何在redhat 8.0下自动登录X window(系统启动级别为5),并自动运行指定的应用程序。
    6 X( t, N8 u. ]* ]1 T0 m[b:804aea7097]一、启动级别为3时自动登录的实现[/b:804aea7097]
    2 d5 p5 Q' w. H
    / u# k) g6 W( {0 p8 f启动级别为3时自动登录的实现涉及两个软件包:mingetty-1.00-3.src.rpm软件包及util-linux-2.11r-10.src.rpm软件包。
    & ?' v0 `: g" y3 R) D5 j( W8 x& V  T7 Q* \) }( h* T" o
    (1)mingetty-1.00-3.src.rpm软件包  
    8 f( F0 a0 G* |. N; j8 j" V对于启动级别为3的自动登录的实现,仍然需要考察/etc/inittab脚本,  
    . }1 |1 H5 d* ]  F, P  j$ V% M6 j6 L3:123:respawn:/sbin/mingetty tty3 / w9 L5 M! W, `! ?: q; T

    ! |. k& v9 c( H' d
    , m7 a! G. G7 G  
    : j; x6 T* d- ]% @
    " X% d3 }9 Q+ @6 e! b# z! `8 S8 j/ U9 I+ U9 ?& {: Y) h/ a
    因此,如果想在启动级别3的情况下实现自动登录,必须要了解mingetty的功能,甚至要修改mingetty的代码。用命令rpm -qf /sbin/mingetty 可知redhat 8.0版本的mingetty包含在mingetty-1.00-3.src.rpm软件包中,下载该软件包,安装源代码,缺省情况下,代码会安装在/usr/src/redhat/下,我们关心的只是mingetty.c源文件。mingetty.c约有五百行代码,主要实现如下功能:
    / n9 E/ ^& {% V; j0 {5 y4 n" @0 O
    4 m3 ?+ B5 w: w0 A; l9 s" N
    打开指定的tty(由参数指定);  
    " o; ^0 n+ I0 O5 M/ ?$ I提示用户登录(login:);  8 r& l1 K* w+ ]' y
    获得登录用户名;  
    4 u! G! U: e4 K. o# s8 ^5 X2 t9 u把用户登录名作为参数,调用/bin/login。  $ Q7 \  a% U! F! j
    % g  G2 @) @( c1 {+ e& Z
    我们所关心的部分实质上只有以下三行: 2 B2 t/ S! u, d) ^% n
    3 Z3 T4 }4 Q& [  m& @* C7 e
    0 P1 ?+ z- G% P' v
    ... ... + P9 S) h* E" e, ]1 U- ]: L
    438 while ((logname = get_logname ()) == 0); //mingetty.c文件438行
    . H# b: b9 F3 S$ N$ Q; F439 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); , A+ ^  d* z; o* b% C
    440 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]); / \/ Z% V' g3 {3 {( K* R3 ]3 l
    ... ... & F. y7 }# }2 [. `
    / q& `) D1 D+ I8 g. o
      " K9 d5 ]7 G9 U2 O0 r" S

    0 s; J% I- J$ B( n# ^5 l, y1 ~第一行的功能是输出login提示,并获得用户输入的登录用户名,登录用户名由logname返回。因此,可作如下修改 : Q3 ]% y9 C- A* h' w

    5 @% S2 v- L; ]1 c% R* A4 X
    ; O1 l# N/ r& I1 ~; i( h... ... , V4 T& y3 K1 w0 Z$ U
    438 // while ((logname = get_logname ()) == 0); //注释掉本行,不再提示login: # R" M6 N7 k% o) X
    439 logname = "root"; //添加本行代码 / i3 K/ ^3 S+ m! \1 n% [) |
    440 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL);
    ) X/ O- z& t: }0 J/ i) P441 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]);
    9 q1 K7 i4 E. T7 C6 u6 z! m... ... ( K- C! O+ ^5 b+ |7 I

    3 s- m7 C. w% i/ [0 ~, U' G$ {' P  ; ]5 ~( `, C* ~# j3 j
    + h* _" h+ M& L4 N
    注意,这里假定用户以超级用户身份登录。 " i. y. |/ ]5 m3 n* \9 O
    ' Z2 y9 J; N8 o/ `- |6 n! _
    第二行以用户登录名为参数,调用/bin/login程序,进一步实现登录。因此,要想实现自动登录,还应该了解/bin/login的功能,必要时还应修改其源代码。
      k. N' P0 r/ S9 b: R& M: D7 b5 ?- T  ?" i2 [3 I& l2 Z, e/ r6 O
    第三行为出错处理。 9 `0 c5 s( c, p4 {
    1 n3 G- [" T6 }' I! x& m3 c) k5 y! w
    (2)util-linux-2.11r-10.src.rpm软件包  & O. l! |$ \5 o& B# h
    采用同样的方法,查看/bin/login所属软件包(redhad8.0版本的login包含在util-linux-2.11r-10.src.rpm软件包中),下载并安装util-linux-2.11r-10.src.rpm,login可执行文件有几个源文件编译而成,我们最关心的是login.c源文件(大约1500行的代码)。下面简要分析一下login要实现的功能,并对相应部分作必要的修改。
    ) [8 o& a* \# w7 X# w* Z  n' j1 ^
    Login程序主要可以分为以下几个主要部分: % q5 r) I, L6 ?

    5 r$ E. f* B3 N) F4 l1.Login首先检查登录者是否为超级用户,如果不是超级用户,并且存在/etc/nologin文件,则输出该文件内容,并中止登录过程;主要由checknologin()实现;  
    # f$ }/ f1 P$ J3 k/ q' v0 e* w2.如果登录用户是超级用户,那么login必须在/etc/securetty/中指定的tty列表中实现登录,否则将导致登录失败。同样可以不指定/etc/securetty文件,此时,超级用户可以在任何tty上登录。  ' V- e) B) A7 d
    3.经过前两步测试后,login接下来将提示输入登录密码(由getpass()调用完成,有兴趣的读者可参考其手册页面),并进行验证,如果密码不对,则提示重新登录。  $ ~$ q- h$ \- l
    4.顺利经过密码验证后,login还将检查是否存在.hushlogin文件,如果该文件存在,则执行一次"quiet"登录(所谓的quiet登录指的是,登录时不再提示邮件mail,不再显示最后一次登录时间,不输出任何消息。启动级别为3时,正常情况下输出这些信息)  
    ! Z& O0 p$ A3 C/ w% S9 J5.login接下来设置登录tty的用户ID和组ID,并设置相应的环境变量,包括HOME、PATH、SHELL、TERM、LOGNAME等。对于普通用户来说,PATH缺省被设置成/usr/local/bin: /bin/usr/bin:;对于超级用户来说,PATH被设置成/sbin: /bin: /usr/sbin: /usr/bin:  
    3 u; V, j/ `: a( O: y6.login的最后一步是为用户启动shell。如果在/etc/passwd中没有为用户指定shell,那么将使用/bin/sh,如果在/etc/passwd中没有给出当前工作目录,则使用"/"。  
    - |" @; y9 _) D6 w6 v" }9 Q$ ]( j# a至此,一个完整的登录过程就结束了。 " o& g7 s% g& U4 Z" L6 X/ |: e

    / p9 e' _: u! ]1 B* u! _4 e3 n从以上对login源程序分析过程中可发现,如果要实现自动登录,应该在第三步做文章,设法绕过提示输入密码以及对密码进行验证这一过程。实际上很简单,login源程序对是否要求输入密码设置了一个开关控制passwd_req,缺省情况下,其值为1(passwd_req = 1),即要求输入密码进行身份验证。把该行代码改为(passwd_req = 0)后,问题就解决了。即对源文件作如下修改即可:
    8 {7 r+ `$ Z) y' w, d. {& ?
    ' A9 }+ d7 @1 x8 k9 z# ?$ Z% e2 ]$ N* u, g# d2 y# x% r8 H2 c
    ... ... ) u3 @+ y# E: W$ w2 Z
    402 fflag = hflag = pflag = 0; //login.c文件402行 4 S" d, J# C* @: j. L
    403 //passwd_req = 1   //缺省时,要求进行密码验证,注释掉本行
    ( p/ e& A; e& c: g% P! u404 passwd_req = 0 //添加本行 / W7 w% S" K( K+ A- K
    ... ... ! D: w( |* r3 [/ Q
    ) [5 m0 r  Q2 M0 l. t  k2 m4 f
      . h/ R& T, j7 \7 s/ q

    9 V2 t- U. G1 I4 \4 `9 c修改后,可以直接使用util-linux-2.11r-10.src.rpm提供的Makefile进行重新编译,也可以自己对其编译: & `* [8 {& T0 `8 W

    1 y. s' C9 D7 T, V/ {. K
    ( h# B) G. @# q! Ygcc -o login login.c setproctitle.c checktty.c xstrncpy.c -Wall -lcrypt注意包含后面的编译选项-lcrypt,否则会出问题。
    " G& _; Q# N& F2 M6 k! i* S/ c6 @

    ' z) D; K$ s) D! G3 L* `有了新版的mingetty及login后,拷贝mingetty到/sbin/目录,拷贝login到/bin目录,并将/etc/inittab中的启动级别设置为3,再重新引导系统即可(读者可以自己写一个脚本实现上述过程)。
    " P2 M8 z3 C8 V7 u- O* W3 C
    6 w$ D- Z. m7 q: F. T如果读者对mingetty或login代码的其他部分感兴趣,可以反复修改login.c或mingetty.c的源代码,测试一下代码的功能,这里要注意的是,在拷贝新版mingetty和login之前,一定要把原来的mingetty和login备份,同时还要准备系统引导盘(有系统安装盘亦可,这样读者有机会键入linux rescue),在测试新版程序前更应如此,如果对代码修改稍有不当,系统将不能正常启动。 + {8 N9 b* V) V: W

    + Q. L; E! O& m) `; y如果不想再作进一步的代码测试,只是按本文给出的方法进行代码修改,在系统启动上不会出现什么问题。 , D4 }; y8 l- B# \7 L# u
    * N2 F( O9 z* M
    [b:804aea7097]二、自动登录后,自动运行特定的应用程序[/b:804aea7097] ) l$ o6 ~; u5 @5 I, a

    8 F4 a' g; e0 p4 B! p在实现了启动级别3时的自动登录后,自动运行应用程序非常简单,把应用程序添加在/etc/rc.d/rc.local脚本中既可。(读者可以尝试一下把startx加入脚本中,看一看效果如何。在某种意义上,又增加了一种自动登录X window的方法) 7 g/ f/ H5 `9 B" e9 G! E  E

    : x) H' d0 J/ Z9 ^$ p% M[b:804aea7097]三、对自动登录X window(系统启动级别为5),并自动运行指定的应用程序的补充[/b:804aea7097]
    # `, p) K7 W9 E& L4 e0 F$ K2 P' _! F
    & m8 A  O! @  X4 P9 @; C在"如何实现自动登录linux"中,主要以redhat 7.2平台为背景进行阐述的,其中的自动登录部分可以直接用于redhat 8.0中,不需要任何修改。 , r. t, @( u3 s( B

    ( O& `. J6 [3 x4 ?7 G, {但是,登录后自动运行应用程序的接口在redhat 8.0中有所不同,主要是登录gnome后,自动运行应用程序的接口有所改变:首先点击面板上的GNOME帮助(那个红色的小帽子),然后选择/其它/首选项/Sessions,在Session对话框的启动程序属性页中添加要启动的程序即可。 * ?3 b. m- O6 K& u3 M, I

    ( e  I( q& m) W3 |5 E6 E' V( ?对于登录kde后,自动运行程序的接口没有改变。
    ) ^: o7 P4 b& L  D
    5 q! |8 C$ C, a% O. d/ m[b:804aea7097]四、结论[/b:804aea7097]
    ; J" Q1 C' w: p. X5 \$ [/ Z! C) |/ B! e2 @6 a0 u% e& Q5 K9 L- A  Z. l
    本文同"如何实现自动登录linux"一文,基本上解决了如何实现自动登录Linux,并自动运行相应应用程序的问题。对于两个最常见的启动级别(3、5),都给出了各自的方法。 * u) F. `: ?; m
    $ h$ @( `% s  c+ v4 f6 c
    在系统初始化到mingetty及login这一阶段,内核实际上已经完成了引导过程,已经到了系统初始化的最高阶段,与内核没什么关系了。此时,主要是/sbin/init根据/etc/inittab的内容而相机行事。读者可通过(man 8 init)或者(man 5 inittab)了解更多东西。
    ) W6 @9 ^3 Q. U" J
    ) n: V, X. ^8 l9 B在对文中提到的软件包修改时,请遵守GNU General Public License(GPL)相关标准,另外,替换login通常被视为黑客行为,应当谨慎行事。
    + ~) G. b* p8 N% s& ~' @( _
    / w- J- d% I- o+ P$ c
    - w+ H, f8 i" P4 U+ E4 S" q+ `9 O) a" F0 Y! e) L
    [b:804aea7097]参考文献[/b:804aea7097]
    1 C4 G7 c- _" M, y: o/ J( V
    6 [# j# c* `1 }; y. q
    - P. Q- Y9 j- Q1 A# D" z% @0 E" W1.login手册页面  
    7 C* m0 o$ s1 V2 o2.mingetty-1.00-3.src.rpm,在redhat 8.0的发行版本的源代码中,包含该软件包;    @9 S  l4 z4 \" G* ^5 L
    3.util-linux-2.11r-10.src.rpm,  , ?& p, I7 s2 @4 w2 G
    1 b: l# C$ _5 D8 g  c* ]9 O
    可在http://rpmfind.net/linux/RPM/redhat/8.0/i386/util-linux-2.11r-10.i386.html处下载,注意下载源代码包(..src.rpm)
    ( D+ @% k! V6 R/ x' R. R  U' [7 ]7 Y$ X' X
    [b:804aea7097]关于作者[/b:804aea7097]    q" S. V7 }, G% p% t3 ~* C% Z

    ' E: f1 n* c4 T; N0 W' a郑彦兴,男,现攻读国防科大计算机学院博士学位。您可以通过电子邮件 mlinux@163.com和他联系: w/ ~: p, X) u5 Q% b1 z- l

    5 G+ W: ?  P' N# }4 T6 V</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)
    5 G5 o+ a2 s  _' G$ b3 [% b8 L
    3 o# u( P; F" G3 `" ~( W* j机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。
    1 o5 i/ b8 j% Z( d6 D一、linux启动的最后阶段的工作
    ( J6 y: ]8 s3 D* ?9 O; ~( B( z: h( I, C  u9 x
    linux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有: , @7 e) j/ ^% Z* Q' X; g) b1 k& s
    4 J4 c& [- J7 C4 L
    运行xdm启动X window;  * _, Y* C  L% x4 Z3 b
    运行gdm,进入gnome桌面环境;  ' Q- A, W' b4 {! X# P7 k& |# A! Y# e
    运行kdm进入kde桌面环境;  
    1 G; G3 R9 l7 ^' w7 G$ O; n: b  k# H自动登录进入linux;  
    # q. q; ?' F' X$ q- aprefdm脚本框架大致如下: 6 S8 M6 D4 F% {0 b- [. r* p( L, Q
    1 I0 G! N9 q) A7 t' Q& s
    #!/bin/sh 6 ^; s  r/ K" ]
    PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    ! ]7 M* C- l& C5 g$ v( A. /etc/profile.d/lang.sh
    7 x0 f, ], L# A# 第一步:查看是否为自动登录 + M# I' g4 t) L/ x8 D" \) u2 {& V
    if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then ) m0 H6 j2 v; |5 G5 R
    if /usr/sbin/autologin; then 8 T& d0 N7 l/ z1 M
    exit 0 # s$ W. ^8 }! i' |! H* H
    fi / r/ B. M  K& o& Y
    fi
    : M3 s! W2 B  I. N, v
    1 `( A& R! y7 x1 ]. }4 m, C& s# 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式 " b9 B& l4 g+ Z, S
    ...... 8 \& o% a4 |: u
    # 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。
    5 ]7 p3 G/ ]' e4 D: e& w......
    $ d& ^  d! J9 _# U
    ! G- Z& ^* D9 a4 u  4 N) _- N0 _/ S& p3 o

    8 X0 o% V8 A8 O
    2 F& H  \+ T9 t二、自动登录的实现(autologin的实现)
    & [& H0 l5 v" l5 A* Y
    $ F( I& N; T% e% q* `在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。
    / C) B$ ^. u- k  M- b& N* x/ \1 L0 G3 g9 w7 M0 \  H) h
    自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。 9 z% J8 Q. ^; f" Q; w

    - {$ |0 J4 @' M& h( q$ eXinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。  
    ) V2 c4 m; D4 z" Z实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。  
    2 X% p; a. @! pstartx脚本的最基本框架是:   d6 n, D8 _' C) f$ z$ T+ M" P" X

    / l, V3 {  v9 ?9 }( m) \% x" Ha、 寻找.xinitrc,如果没有则使用xinitrc;
    3 e7 ?* w3 n3 I# A9 eb、 寻找.xserverrc,如果没有则使用xserverrc; 4 {) p# z( E: A- [2 l
    c、 根据找到的脚本确定xinit的参数; ( W& g( T9 g9 L4 U& l7 N- H

    . S  U* F9 z4 t9 l由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录: , \' {# }8 {4 ^* ]% E1 k4 W

    ! i/ E4 H  ]% ^5 {7 h1 C
    ' [1 n) L1 |; d& q! B#!/bin/sh ; |. |1 j5 B. O6 G
    PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    9 G4 Z( S3 ~0 S3 }. /etc/profile.d/lang.sh : u, T+ g8 O4 b+ \" w. A% S
    # 第一步:查看是否为自动登录
    4 L3 i' R. V* w2 ~" Q! q#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then ) y( C0 _1 g8 i
    #注释掉上边的条件测试,直接运行startx % A9 c) m- a( v: V) L
    if /usr/X11R6/bin/startx; then
    % F0 [3 s* ], s9 [1 \exit 0
    6 t4 h8 L: F) c% \% z! Lfi
    , h6 p: x& s5 T1 j#fi / u+ m: Q! C/ i2 O5 n, w

    ) u  L9 D# I" i  9 ^9 \0 @3 m* k( w, K

    ( C! `3 G0 n) D8 b# I; s. N# |
    3 n( t3 ~) L1 H* z. D当然,应确保/etc/inittab中的启动级别为5。 ( d# S8 O# z* Y7 Q) |* a
    " L8 E* f9 v- I; h- V
    重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。 1 m: i* O- \. Q/ b; X

    + H- m0 M0 m0 t$ r2 Y三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。
    2 |% X, a# t. A) g" J; R
    + T3 R1 x- p  S3 r, ^# K观察原来/etc/X11/prefdm脚本的自动登录部分:
    & ~, N! }( o$ z% J6 N8 t- i& X8 e$ k4 F

    0 L, E. Y  p9 E  k# h: n# Y; B( @......
    4 T* k2 s( `2 x# 第一步:查看是否为自动登录 ) ]2 x! u+ ?2 U0 m
    if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
    0 ~2 @4 z/ H& hif /usr/sbin/autologin; then 7 h: g3 i% S. j6 t' g+ a- E. r" f8 c1 e
    exit 0 1 Q, c$ r' s2 ~& P
    fi   i6 x' ]+ w$ r2 N, L
    fi
    * A& C5 h7 X: C  u; k......
    9 ?4 W! i! ]0 E* Q' J5 d' D' r% l( r0 i' [; p# P! b
      + \2 X1 P: F9 S+ e

    9 {/ i& H, c8 [% g" F3 B/ m- C
    4 r# h* b  `! z4 d& Q6 y+ I9 K" `' v不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。 8 P( @) P0 e8 I, s* q9 F; p- t

    2 Q4 J! y$ V. V: a1、/etc/sysconfig/autologin配置文件的实现: * K0 X1 x4 E4 _- @1 y
    5 z" I) C( s$ e& r
    2 k4 v- F- ?/ N5 b' H0 A! i
    #config for autologin 7 D& _* W# z- y$ X
    USER=root & d. @4 [, G) I4 x# j4 V% T; `
    EXEC=/usr/X11R6/bin/startx 2 a* y6 a! W; a1 r0 ~2 g
    说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。
    3 ]( n. r( }; H, E# k+ E9 y$ t4 |
    9 ?5 a3 c: D: w3 m5 Z  
      F: J* G/ B" w) p$ I* Q
    & {0 [/ |) x' V; X& u
    + @! n8 H: J: P5 W; _2、/usr/sbin/autologin可执行文件的实现: ; o1 [' K/ ^% `1 p) T3 V- c

    & L5 p! r; c% ~- Y8 h- m/ L0 Q7 d
    5 F. R+ z  ~  o7 w, e8 X0 T/********************* ; g' ?& o$ ?) X6 `4 m
    ****  autologin.c  ****
    / q+ Y" D/ B( n/ ?*********************/ . s6 J" C8 x  L$ K# j
    #include &lt;stdio.h&gt; ; m6 |; `# s3 S5 o, ]! u
    #include &lt;unistd.h&gt; ' j, B2 z; V9 d: V2 g
    #include &lt;string.h&gt; / @. o* U, M& x5 g' r: V7 K
    #include &lt;errno.h&gt; + V2 i' D3 }$ D4 z% H
    #include &lt;sys/types.h&gt;
    : r3 X$ M! n! a5 l* l% }* g3 v#include &lt;sys/stat.h&gt;
    5 m) z0 @% ^1 p" U5 w. e' E0 _#include &lt;pwd.h&gt; # {& h- w. Y, k9 b' s! T
    / X, t) `' L- t: ^1 f
    int main(int argc, char **argv) ( F2 j4 d, _) L/ p3 D
    {
    1 O$ j# F( K2 I0 q4 Mstruct stat st; & M, T5 ?5 L$ K, W6 i9 |
    FILE *f; 6 m4 L8 C/ _' i
    char *cfg;
    6 ^& H! ?4 B9 A% S" c2 estruct passwd *pw; 0 |; z$ b+ R" z' o$ w+ w
    uid_t uid; * y9 }$ V- j: y0 R7 m5 y' S) P" I
    gid_t gid; : \9 O- @$ J3 U3 U' \( c; R2 b, B
    char *dir, *shell; ) s- A* ]3 }* t4 r: F1 ~3 w1 B$ F- J6 P
    char *user=NULL;
    ! l6 C) [' [5 p/ ^" N3 P6 w6 Mchar *cmd=NULL; 9 f3 i6 w8 R; W8 W2 d$ @, T( k7 |
    1 g) |( h( ^* f3 T4 T  ~- h1 W4 ^
    user="root";
    ! _) ?0 d( _* v8 R( v& ?/*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, 8 r% ^2 R, y9 k9 C. r
    登陆用户名应该从/etc/sysconfig/autologin中得到,
    . H# w( w0 x2 l程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/ + g( P7 g7 g# S) |- p& X
    cmd="/usr/X11R6/bin/startx";
    4 o8 U4 H( n  `8 D+ Q/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/ 2 F/ f1 s8 v" X3 l) u2 n2 m. d& k

    . Q6 t2 M4 g5 R: I8 Ppw = getpwnam(user);
    4 G3 A' G! e/ o2 D- N3 f4 a//getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。
    * |9 k/ i/ j0 B8 [' }; qif(pw) {
    ( c7 Q' y7 ?( l4 a4 \: kuid=pw-&gt;pw_uid;
    6 |( j8 ], K0 J7 ?2 ?8 ]gid=pw-&gt;pw_gid; dir=strdup(pw-&gt;pw_dir);
    ) @3 Y5 U4 y# d: v- L; d) J: _$ P( }shell=strdup(pw-&gt;pw_shell); ! B9 s7 N% B3 ]; X0 `1 A1 \7 J5 `
    }
    & N. u7 }% t+ }& P0 d  w2 g8 U. r# C5 D//获得用户相关信息
    , z: ]+ t* l7 h9 t( E! K+ r0 A7 ? else {
    # _" d9 r/ M. qprintf("ERROR: No such user %s!\n", user); : P9 ]# _8 i3 P- d# L* ]% z& y
    return 1; # x- M: P/ `: c% q5 W1 [
    } 0 W% A4 r' p/ S3 p: u$ I; b' P( o
    % |9 ^  x, g+ p8 @) E6 L7 t
    chown("/dev/console", uid, gid);
    4 e8 o5 N4 }8 g4 Pchown("/dev/tty", uid, gid); ( T, c  P( e: m1 }' ]1 y1 Q
    //为控制台和终端设置用户ID及组ID
    ' B- N) ^! H# [% E4 g, |9 Z
    / H( ?6 d/ z1 }/ g6 y//下面是设置用户相关ID 5 ~9 {- f8 `3 ]: a) {6 m! i
    setregid(gid, gid);
    , Z" L! T5 G. y+ I& D" [setegid(gid); ( D: M1 W$ K. p. V* o  u) ^+ ]+ S
    setgid(gid); 5 y$ o( l' S( L
    setreuid(uid, uid);
    4 i; x5 G) I2 a( o% D+ k* y+ @- {. L7 Iseteuid(uid);
    ) r9 ^3 {! U5 y; }. v/ Ksetuid(uid);
    9 ?" Y) Z3 g! Q( ^4 a. u. m- m3 F& M" _$ G0 f8 t
    setenv("HOME", dir, 1);
    5 {& F/ q# ^, w* ~- ~6 u. zsetenv("SHELL", shell, 1); . J9 r) e' z2 e( n% [. X: \
    setenv("USER", user, 1); % R! `0 m0 r& J2 r3 E
    setenv("LOGNAME", user, 1); 7 S3 {3 n! i9 e7 A
    //设置用户相关环境变量 6 P& o4 `6 o' \1 `3 |+ o4 p$ h5 E9 l

    0 I8 c: u' _3 f) cchdir(dir); 3 z; J4 m3 q/ M* ]0 l% \
    //切换到用户根目录   e8 i" Y% q6 g/ v+ Y4 j2 ^/ @
    user=NULL;
    + }/ w1 B8 U8 ]7 k/ J7 G) b
    6 @' ]. @. d/ T% nexecvp(cmd, argv); 6 y6 Q2 v- s0 u% k. X
    /*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */ 0 ~6 ?! {% Q9 w9 ?( z- _9 P: `
    printf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno));
    , u4 L' s) l; {0 p) areturn 2; ( o$ D. N4 b% }8 o9 ?
    }
    ( K* [, k, P! S3 W
    # \$ n$ L+ J" t3 A- E6 k  o: n  " A; z4 q! l' i' @5 T/ t5 h

    9 c" L# ~$ e7 g( h& E
    4 r4 }9 B! W# s运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。 + Q3 z8 L8 i$ a7 ~& L) R
    3 W+ T2 z6 \2 `  r9 G; _
    如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下:
    6 s- M- }3 v# }6 B3 I! t" J
    ( j; D7 K4 d; c( q2 A; b1 w4 @3 {* C% z9 w  S
    ......
    + V, u( q5 E5 _4 [# 第一步:查看是否为自动登录
    ; n9 u5 l: v: xif /usr/sbin/autologin; then 9 o( \' j. q' Q9 o. ?% o2 [+ s
    exit 0
    2 y8 P# @. {1 {; f- ~3 U$ C/ }fi 5 I2 Z/ x3 l4 v" {
    //第二步 ......
    1 O3 i" x7 q) v+ ^...... ' X4 C; t5 M! J! @  q, z8 |
    9 Z% {8 N$ }9 _% q( \* |
      - z  N1 r  L  R4 `. O3 t

    ! n3 ]& q& b3 h6 O
    0 }1 y, E' H3 M+ M' v, M& r/ a# v即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。
    2 \2 \6 x# {3 N, m( w$ H. C, u
    $ {* a. _* D% [* x6 y四、选择进入kde或者gnome,并自动启动X window应用程序
    ! b8 X* q2 i* \( W) t+ o2 P$ }% l. R* A- s2 \7 x
    如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。  ; J! Z2 ?8 }3 q: L* ~; X
    一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。  
    * T& j; u6 y$ J, e' M# D
    ( A6 v. I4 f. x" W6 R  t4 ^* o: v& [% q( C) `
    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-9-1 16:33 , Processed in 0.278841 second(s), 57 queries .

    回顶部