QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4161|回复: 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>
    ; f4 @) Y) u% q<>本文以redhat 8.0操作系统平台为背景,阐述如何实现启动级别为3时的自动登录,及自动运行相应程序,并简要介绍了如何在redhat 8.0下自动登录X window(系统启动级别为5),并自动运行指定的应用程序。
    ! |- I% C; B6 b[b:804aea7097]一、启动级别为3时自动登录的实现[/b:804aea7097] 0 |9 H0 g0 d- R+ q' V( i

    4 t6 V# a+ D- g$ {; h- g$ u启动级别为3时自动登录的实现涉及两个软件包:mingetty-1.00-3.src.rpm软件包及util-linux-2.11r-10.src.rpm软件包。
    ; h- o8 D! K- d1 P) Y
    * |6 N1 Y: f. M  l& x(1)mingetty-1.00-3.src.rpm软件包  * p3 t/ h4 X: I
    对于启动级别为3的自动登录的实现,仍然需要考察/etc/inittab脚本,  
    / c0 N. b- r& ~" \$ A3:123:respawn:/sbin/mingetty tty3 4 M; w, G/ B# i0 k2 V' `; A
    # P- z' o% ?9 Y
    ( s. ?9 V+ i7 L( T8 s+ \
      / V' u0 {, v" S5 n' v
    1 w6 M' u! y2 e6 ~8 G7 N

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

    0 v: X0 G8 O5 a# S+ o% l) F
    & ^% r6 o% W# `  E打开指定的tty(由参数指定);  + m% W. Y4 D4 M4 `) Z4 g( @
    提示用户登录(login:);  
    1 p% v, w& x$ z5 }/ `. I获得登录用户名;  
    % p3 a% h0 X6 b) G把用户登录名作为参数,调用/bin/login。  / P7 v; _( e2 V5 s0 s$ t

    . ?( u4 b! @* n" B5 Y我们所关心的部分实质上只有以下三行:
    $ `" }) R" f  z/ h+ }5 ]( C% [  W; n1 h4 \1 S0 M' z& D. ^

    . ?, T  N  r$ Y9 l... ... # P9 H! \# u; j6 {/ |2 [7 i
    438 while ((logname = get_logname ()) == 0); //mingetty.c文件438行 " W8 d2 o  A( V
    439 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); 6 q7 u5 K. O8 J7 x8 U# `
    440 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]);
    " d4 y6 Y. c9 o( D9 y/ X; B" [... ...
    2 J$ a" v( T0 ]: R
    0 F+ d9 N: L+ n# H5 Q: s  
    7 d1 m0 m; _5 E0 r9 l2 P# G; ]
    1 }8 {$ g- ^& r; b) m# s# i第一行的功能是输出login提示,并获得用户输入的登录用户名,登录用户名由logname返回。因此,可作如下修改
    3 L9 A1 ^  l: x6 h4 x9 ]9 `; V2 v6 ^" h$ I+ u
    8 z7 j0 J3 r( [
    ... ...
    % \" f: U4 `8 u6 ]438 // while ((logname = get_logname ()) == 0); //注释掉本行,不再提示login: * X5 T5 |9 Q& F8 M0 i( x6 `
    439 logname = "root"; //添加本行代码 : L7 f% ^; o- r2 V" L9 p0 S
    440 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); $ x1 ?6 S4 b- r- r
    441 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]); 1 J# m! E2 _; q# o, V
    ... ... " U" J, W. j' u" a1 ]* ^9 L

    ! ]0 J# ?; B2 W& g% A  
    1 e2 s% d4 u# U% E) y3 Y" d% i  Y4 `" {) n& ~$ R
    注意,这里假定用户以超级用户身份登录。
    1 W; Y' x6 m: g) [
    / ~6 I+ Y* q- R) k2 b& {# ?8 D- s" n第二行以用户登录名为参数,调用/bin/login程序,进一步实现登录。因此,要想实现自动登录,还应该了解/bin/login的功能,必要时还应修改其源代码。 + l9 a  y7 Y% ~/ d! l. U- B# S
    5 s3 F6 l# g8 N5 r" E
    第三行为出错处理。 ; h( w- n) P! Z* K8 x0 f
    " M# ~) B& k7 H, @6 H
    (2)util-linux-2.11r-10.src.rpm软件包  7 h$ ~% ~& Z' 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要实现的功能,并对相应部分作必要的修改。
    7 `& ?9 j. M6 A( A8 z) z7 F& O* X" i
    - E6 x, d4 k# Y& ?6 g5 c* ?6 \Login程序主要可以分为以下几个主要部分: 0 J, O8 ?) M* E7 r* `

    1 c1 G/ v( Y. {+ ]4 n8 c1.Login首先检查登录者是否为超级用户,如果不是超级用户,并且存在/etc/nologin文件,则输出该文件内容,并中止登录过程;主要由checknologin()实现;  ; p' K& B0 h5 w' I% a; y
    2.如果登录用户是超级用户,那么login必须在/etc/securetty/中指定的tty列表中实现登录,否则将导致登录失败。同样可以不指定/etc/securetty文件,此时,超级用户可以在任何tty上登录。  
    $ c6 \0 A7 ?, S2 a: M3.经过前两步测试后,login接下来将提示输入登录密码(由getpass()调用完成,有兴趣的读者可参考其手册页面),并进行验证,如果密码不对,则提示重新登录。  
    " R* M! Y6 P( j+ D4.顺利经过密码验证后,login还将检查是否存在.hushlogin文件,如果该文件存在,则执行一次"quiet"登录(所谓的quiet登录指的是,登录时不再提示邮件mail,不再显示最后一次登录时间,不输出任何消息。启动级别为3时,正常情况下输出这些信息)  ( q% v! ]+ x% G
    5.login接下来设置登录tty的用户ID和组ID,并设置相应的环境变量,包括HOME、PATH、SHELL、TERM、LOGNAME等。对于普通用户来说,PATH缺省被设置成/usr/local/bin: /bin/usr/bin:;对于超级用户来说,PATH被设置成/sbin: /bin: /usr/sbin: /usr/bin:  " P1 ^; `0 H  D1 P. @
    6.login的最后一步是为用户启动shell。如果在/etc/passwd中没有为用户指定shell,那么将使用/bin/sh,如果在/etc/passwd中没有给出当前工作目录,则使用"/"。  
    : O9 d. Q) I4 V5 D0 A4 j2 d至此,一个完整的登录过程就结束了。
    # j3 j/ A/ X$ |; K
    5 i# C4 \) n, A9 n从以上对login源程序分析过程中可发现,如果要实现自动登录,应该在第三步做文章,设法绕过提示输入密码以及对密码进行验证这一过程。实际上很简单,login源程序对是否要求输入密码设置了一个开关控制passwd_req,缺省情况下,其值为1(passwd_req = 1),即要求输入密码进行身份验证。把该行代码改为(passwd_req = 0)后,问题就解决了。即对源文件作如下修改即可: 4 g& v' `5 x% w* l) O& G; \

    6 U0 _0 a& _, E5 J/ Y" W, |
    5 {6 t, K) f* U; t9 o# w... ... $ }4 t& A% W7 @# w* Q2 y8 j/ ~2 t
    402 fflag = hflag = pflag = 0; //login.c文件402行
    7 i& S' k, ^& k( h) \403 //passwd_req = 1   //缺省时,要求进行密码验证,注释掉本行
      J' p" \# o! _2 g. E8 ]  `404 passwd_req = 0 //添加本行 % L! i  [& n) M& O4 A1 ~: w8 o7 o
    ... ... : t+ S7 X& o$ f  x4 D- o* q# [5 ?+ D
    ! s0 Y# |6 p. h4 d/ J' G; m2 N
      
    & ^. u; a( o3 K# ~4 P
    3 V. d+ [/ q$ e. H" ?/ |* ]$ c修改后,可以直接使用util-linux-2.11r-10.src.rpm提供的Makefile进行重新编译,也可以自己对其编译: - y3 u( X6 q8 g' V) h$ _
    3 Y/ Q5 Y+ c* \$ F3 [
    : T( x& s6 m; G8 D
    gcc -o login login.c setproctitle.c checktty.c xstrncpy.c -Wall -lcrypt注意包含后面的编译选项-lcrypt,否则会出问题。 7 f7 |8 m! D8 D5 i. |* m; P
    * q+ s" s$ m3 y1 U+ i, v

    3 i# T# ^& q, j3 D! z6 D有了新版的mingetty及login后,拷贝mingetty到/sbin/目录,拷贝login到/bin目录,并将/etc/inittab中的启动级别设置为3,再重新引导系统即可(读者可以自己写一个脚本实现上述过程)。
    2 z$ z& A; M. j  o6 Z1 V  i( U; M7 y7 [, |# \
    如果读者对mingetty或login代码的其他部分感兴趣,可以反复修改login.c或mingetty.c的源代码,测试一下代码的功能,这里要注意的是,在拷贝新版mingetty和login之前,一定要把原来的mingetty和login备份,同时还要准备系统引导盘(有系统安装盘亦可,这样读者有机会键入linux rescue),在测试新版程序前更应如此,如果对代码修改稍有不当,系统将不能正常启动。
    , F$ p3 P) X' i% F* k5 N9 f# h; n5 |3 g; F' y# H
    如果不想再作进一步的代码测试,只是按本文给出的方法进行代码修改,在系统启动上不会出现什么问题。 / e! k5 j5 K& a5 [: z
    8 E+ s) o2 x+ G2 ?7 n1 d
    [b:804aea7097]二、自动登录后,自动运行特定的应用程序[/b:804aea7097]
    - V! b+ u) `* u/ V9 P: D2 s* y) x, B& H$ f, [% C+ @! d
    在实现了启动级别3时的自动登录后,自动运行应用程序非常简单,把应用程序添加在/etc/rc.d/rc.local脚本中既可。(读者可以尝试一下把startx加入脚本中,看一看效果如何。在某种意义上,又增加了一种自动登录X window的方法) " n- X$ o# e% _7 J" ~) `

    - T. Q0 q  F6 E" t9 j6 r* T[b:804aea7097]三、对自动登录X window(系统启动级别为5),并自动运行指定的应用程序的补充[/b:804aea7097]
    + ]. t% J3 ~  }' n- S
    # C: ?" F4 r! L! V, q7 K在"如何实现自动登录linux"中,主要以redhat 7.2平台为背景进行阐述的,其中的自动登录部分可以直接用于redhat 8.0中,不需要任何修改。
    ' J  f0 Q7 ]. \8 W( T9 _; u1 O! ?
    1 [" E; x5 x6 F+ ]! p; t但是,登录后自动运行应用程序的接口在redhat 8.0中有所不同,主要是登录gnome后,自动运行应用程序的接口有所改变:首先点击面板上的GNOME帮助(那个红色的小帽子),然后选择/其它/首选项/Sessions,在Session对话框的启动程序属性页中添加要启动的程序即可。
    2 w! A5 D" @; _& G4 H8 t8 u/ d, }  t5 q
    对于登录kde后,自动运行程序的接口没有改变。
      s0 [" m. A8 R& J* ~& q2 e- d5 X+ u- `& }
    [b:804aea7097]四、结论[/b:804aea7097] & Y5 s! m; v  |, V: v) V

    6 l4 o/ K4 s/ K9 _8 f6 [本文同"如何实现自动登录linux"一文,基本上解决了如何实现自动登录Linux,并自动运行相应应用程序的问题。对于两个最常见的启动级别(3、5),都给出了各自的方法。 , O  k# t. s. L0 s" T% }

    $ g% b+ |# W7 N* ?在系统初始化到mingetty及login这一阶段,内核实际上已经完成了引导过程,已经到了系统初始化的最高阶段,与内核没什么关系了。此时,主要是/sbin/init根据/etc/inittab的内容而相机行事。读者可通过(man 8 init)或者(man 5 inittab)了解更多东西。 ' ?( z; H4 m  O% Z& P
    & i; }4 f2 _# j- T5 l9 H
    在对文中提到的软件包修改时,请遵守GNU General Public License(GPL)相关标准,另外,替换login通常被视为黑客行为,应当谨慎行事。 6 h. }8 A/ D1 i) ]

    $ ^8 ]& J, G4 Z) L' A; ~% @$ a0 ~6 P" R( ?5 Q* y- Q; q% h
    6 J6 l4 S0 ]0 `" D" K( L  n
    [b:804aea7097]参考文献[/b:804aea7097] 9 j7 Y+ I/ g3 K2 I) Q5 `6 |
    7 |- [' z/ u3 c$ Z
    $ e. E; u) ]; C  |, ?
    1.login手册页面  
      h$ b- x2 h/ s, I2.mingetty-1.00-3.src.rpm,在redhat 8.0的发行版本的源代码中,包含该软件包;  / p3 z$ H  T" t' B0 d* J
    3.util-linux-2.11r-10.src.rpm,  ! z1 e# R$ ^" _) N* e' U# `& E

    6 R+ G) A" y: S3 [0 L3 ]. O+ t5 w可在http://rpmfind.net/linux/RPM/redhat/8.0/i386/util-linux-2.11r-10.i386.html处下载,注意下载源代码包(..src.rpm) 3 F7 Q* m, {$ _; [( U

    3 x. ~! L" k" A; g2 \/ A) E( V, k0 ?[b:804aea7097]关于作者[/b:804aea7097]  
    8 G: i. z" h$ R+ I6 D
    ! E& ]6 w  X2 {" r- J1 P郑彦兴,男,现攻读国防科大计算机学院博士学位。您可以通过电子邮件 mlinux@163.com和他联系- u" T. J/ N6 J1 J# g8 G

    . S6 z% N9 i; a& E: Q</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)
    , p/ n$ N% W: H0 _. h8 v7 B4 N, u! r- _
    机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。
    1 P/ O2 b; V  G一、linux启动的最后阶段的工作
    # Y# t6 f. T4 T7 O7 H" B
    ; b1 i0 c' T* Y! ^. D( Rlinux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有: # @  G+ i7 E, [/ Q

    % R3 m5 E! s% L( o# M; O运行xdm启动X window;  , g' s/ k  W8 v
    运行gdm,进入gnome桌面环境;  
    " u& @. O5 i- i4 \3 z运行kdm进入kde桌面环境;    X/ o7 i$ T5 z  g0 }: K4 v: y
    自动登录进入linux;  7 p! k: v5 C% W. z) z0 e3 T
    prefdm脚本框架大致如下: 0 y" c6 [( v3 {1 o& G4 Z: Z

    7 O- j0 P( I1 l1 R% @#!/bin/sh
    ) p' G1 J7 Z$ g8 d: ~PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    % G6 }' ^3 S( U( S8 M4 \6 `. /etc/profile.d/lang.sh
    7 |+ k5 K5 _5 B# d- t( B# 第一步:查看是否为自动登录
    2 ?6 v) }) `$ Y& ^. g( t- Y( }2 ?2 kif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then   V/ w8 _5 }# W, Z! p" @' g
    if /usr/sbin/autologin; then 2 A: B. T6 W$ u6 Y; G% l
    exit 0
    # J$ l$ n4 o- s: m+ Q* Y3 Q: jfi # V% d& P0 c! ]8 i/ H2 P
    fi
    / Z1 g$ ^' `5 Y/ k# S0 C& m( ^5 u9 w
    5 M+ P8 g, B; \, y1 i7 C. s5 k# 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式
    - |: I0 H2 n+ K6 U......
    0 l$ v. D( p2 z. Q* B3 M# 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。 7 K3 t& w$ [6 k5 {* B7 H
    ......
    ) K# W; C5 c8 X; F* L; e5 ~7 l1 O" W3 t0 a) t+ T
      
    3 {2 _% G& S+ }4 b& T4 X, j# e
    * F- p+ `+ q. E- c& v- r
    ; ]. a$ a$ u" P! t  k& B" q二、自动登录的实现(autologin的实现)
    # K$ Z2 }/ g" b7 o0 P2 P$ H& V% f- F4 Z2 O+ d7 d5 @$ z; t
    在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。 $ A$ I( I8 W; V2 v

    / T7 y6 y, d1 R' @- Q3 k自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。
    ( F  R5 W! \3 z6 B2 D  G* ]. L. k( i# p& m) b
    Xinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。  2 A7 p" c3 r% u8 z7 j6 ^2 F% ?- I
    实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。  
    ; O- K1 J* }$ r/ R% i0 Pstartx脚本的最基本框架是:
    + d/ Q5 }& J( m3 V" I7 P5 v: t' y( H6 ]: {
    a、 寻找.xinitrc,如果没有则使用xinitrc;
    . v3 ^  E; u8 r* ?b、 寻找.xserverrc,如果没有则使用xserverrc; ; r4 `' T( t( }! U" @
    c、 根据找到的脚本确定xinit的参数; 6 s# k0 o7 }0 b! B' }+ m4 S
    0 X8 K& ^1 S! `; q+ C- A
    由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录:
    2 Y% I) x( F- _; }6 f5 y1 L8 n5 |2 g5 }
    : l6 V: G8 y  v4 J) u2 z
    #!/bin/sh 1 S! `1 K) t; h
    PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    ; z! i/ G# p' X. ]: U% @. /etc/profile.d/lang.sh . w9 L8 D! z6 U; ^0 [/ ~
    # 第一步:查看是否为自动登录 ) ~; R& @* S- e( x  K; F
    #if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
    6 P" W# R2 J$ _3 N6 d2 T$ v, o( H#注释掉上边的条件测试,直接运行startx
    / Y. V1 o2 B9 G8 D/ v* b! f7 uif /usr/X11R6/bin/startx; then
    * t# D* r* r1 @# K" Mexit 0 # @6 Q$ r- n+ r: O2 D$ l
    fi / M( a1 N8 ]. h& n" ~# o9 Z
    #fi 3 i* h- }% _+ F( R& F: z( ?7 a
    5 B+ p, Z& x# A4 m( V% ~7 J
      - Q: O% ]/ q+ e1 p/ ?6 ~7 A
    ( Q3 B  Z4 o& D2 H0 N
    8 K9 u$ P" a% ]' d# k7 o, |
    当然,应确保/etc/inittab中的启动级别为5。
    0 b- U' i" i" p0 _/ T, @1 m0 j
    , \' J& l2 T! q7 @重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。
    , q+ s) G, H3 k% j6 C7 Q; Y" ~  z$ N9 m5 W
    三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。
    8 p9 F% |2 W5 `. S1 j; |" h7 j/ M( _) A/ _3 `3 B
    观察原来/etc/X11/prefdm脚本的自动登录部分:
    $ A0 m8 T) v  m) ^8 n, K+ n7 [! k. V0 e* _& _

    % ^% }8 t" U3 B8 ~...... 3 T- r& k5 k% O1 v7 N( V; Q
    # 第一步:查看是否为自动登录
    3 T2 G$ b: J8 S, gif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
    5 K" F  ?$ y9 ^! lif /usr/sbin/autologin; then : [7 m- x# g/ _' Z9 l$ J
    exit 0 : \8 n; {+ u+ V( m+ U: I* H
    fi ' g# k% b! H+ S; |4 ^, ]- @
    fi - ^% ]: D4 `2 M8 [" Y* n
    ......
    9 K* o, r" I  \6 E6 p/ X3 V+ p
    4 T( G, d7 t/ u8 C  * P* Q2 Z7 j+ v3 b! P( `  u7 m% }0 }

    & i- f; k% z8 G* d5 ^- @" J$ \$ J9 }
    不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。 , z0 ~+ {( B# ?8 ~
    8 ^/ x; S' p% V2 }9 ^- k; w& o0 E
    1、/etc/sysconfig/autologin配置文件的实现: " y7 i% U/ G! r' t* a

    / Y' S/ g1 P/ k- ?  y! p0 L* a5 y* X0 }
    #config for autologin / {7 ]5 h! I' S- C* j3 Y9 f- o5 w7 j
    USER=root
    / ~) g& E' Y( ]; |* UEXEC=/usr/X11R6/bin/startx
    # v9 ]! X6 X3 n说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。
    # P# c! J& c# s+ D+ H, Q
    $ |5 T- n3 Q6 ?1 E8 Q& I: u  7 g' P3 N0 m$ o- N/ {6 ], L" H
    ' c! U5 f6 c; m
    0 ?3 S2 C: f8 G
    2、/usr/sbin/autologin可执行文件的实现:
    , s2 z+ l5 ^3 _* E- u* E1 G% {9 ^- j

    : R3 m4 V. g8 I( x) f) M' P+ u8 Y% K/********************* " K0 t( x  a6 Y" I- v, [/ ^; S; l
    ****  autologin.c  ****
    $ P8 m# E1 Q1 r! G3 U9 G0 @*********************/
    * j) E5 N2 r# `9 j0 ~! B( D#include &lt;stdio.h&gt;
    1 k9 z/ N* g. c5 j#include &lt;unistd.h&gt;
      s/ w) [: Y" E0 f#include &lt;string.h&gt; 7 j" c) E, n- c' X! n
    #include &lt;errno.h&gt;
    ) d$ J0 N" G. ]- e& r# }8 z) b#include &lt;sys/types.h&gt; 9 T9 M5 B  @3 _/ s, x
    #include &lt;sys/stat.h&gt; & V) t( D- ]+ A
    #include &lt;pwd.h&gt;
    $ y+ G% O  e5 r" N9 q
    9 k2 E% O. \- U) o/ Jint main(int argc, char **argv) 8 {/ [* t' E, r$ n/ F' l6 q$ t0 P# G5 ]
    { - P& a# K4 O% Y. s$ T
    struct stat st;
    + p" E  q5 g' R: w7 L# FFILE *f;
      J; Y* K9 N! s3 }# x1 ^char *cfg; 3 U& D. z$ K. A
    struct passwd *pw; . T; Q+ Q: e1 G8 K) P
    uid_t uid; ' q: ^5 `7 }2 y8 M' S, e4 {# \5 V4 @
    gid_t gid;
    % l' V9 S8 G" F/ s. f' dchar *dir, *shell; # H  k7 ?  e5 R
    char *user=NULL; 5 k6 a1 k# M2 w0 i/ J6 j9 u% i3 p( o
    char *cmd=NULL;
    . a# X9 T6 O3 }5 g* P5 u/ ^: ]. e* Q+ D" N: r
    user="root"; ) e$ n: d+ z; {8 B) B  r: X
    /*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, & Y# Y1 f8 q' ^0 X7 c
    登陆用户名应该从/etc/sysconfig/autologin中得到,
    : w( W& ?; `! L3 M2 f程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/
    ! J7 `% H8 t9 ?8 p. u% F: y2 _1 Vcmd="/usr/X11R6/bin/startx";
    2 k: e# }1 g+ Q; l( k3 G6 d8 `/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/
    0 M( J/ [( C4 q! ^, |$ }
    6 R) y5 O5 x4 T+ P4 m, O! {pw = getpwnam(user);
    7 r1 e) c9 A; ?; M% @; ^4 }' c+ p7 W//getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。
    " e- h4 y# j: _4 R  _' Y! Wif(pw) {
    ) i% z; x& q& ]% z9 b8 j' e3 d, q% ^uid=pw-&gt;pw_uid; 3 @1 A% A) [  j$ ^* a# H* R* e
    gid=pw-&gt;pw_gid; dir=strdup(pw-&gt;pw_dir); + j' N* x, Q2 {9 M& O/ @& b
    shell=strdup(pw-&gt;pw_shell); # M$ Z4 O( _$ J5 z# e2 a
    } % D) J, u+ Z# ]/ m& I* ?( h
    //获得用户相关信息
    ) U/ h; ]8 Q$ X- n* _- F else { 7 u) P" D5 [) ]; D  r
    printf("ERROR: No such user %s!\n", user);
    * }0 |! T3 ?2 b- yreturn 1; $ q0 ?0 X7 z1 d  r7 `
    }
    5 Q" T3 j: K: j7 R( M
    4 D' J: I% p0 S2 v$ P% Vchown("/dev/console", uid, gid);
    3 f8 O. O4 n6 M  achown("/dev/tty", uid, gid); 0 `: ?7 U  a! F7 {+ p. e* ~
    //为控制台和终端设置用户ID及组ID # J2 \  O* F# n
    6 G& z1 i% ]2 n9 T
    //下面是设置用户相关ID ' K9 R! N& K, e# P' a0 Q
    setregid(gid, gid); 9 H# F6 J. D/ ^) w- h, m& ~9 \& Z" O4 ~
    setegid(gid);
    , m; v7 Z9 p4 [5 ~& g! Wsetgid(gid); : o1 k' M- j7 u3 i* m3 p. V
    setreuid(uid, uid);
    - S6 \% q& R6 b. I1 ^. p) xseteuid(uid);
    . }' p+ S/ l$ i- x- rsetuid(uid); # L# \% n: y* k: B# n8 U$ ~
    * L6 b" z1 j5 F1 V$ M
    setenv("HOME", dir, 1); 9 X7 Z+ F6 ~3 ~# V  V: s
    setenv("SHELL", shell, 1); & c7 y9 y7 X! Q, a
    setenv("USER", user, 1); 7 T3 k4 D* ^: O2 X
    setenv("LOGNAME", user, 1); ( T7 t1 U% k7 m% v0 \1 h/ Q  E6 i
    //设置用户相关环境变量 2 s5 @) ^5 Y  }/ G

    # k: s! j- A4 k7 \" z) Bchdir(dir);
    , |" h* d+ R% j, \0 L& q//切换到用户根目录 & v$ Y" `% _% b  O; X
    user=NULL;
    5 _* C& ]7 ^- O$ S9 t# O$ ^( h- D
    % b% p5 ]7 b8 bexecvp(cmd, argv);
    5 x0 p+ F7 F& O6 ]0 z: E3 c/*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */ $ ^# [" U* U4 D$ w: g- K0 h: ?
    printf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno)); 6 G( y2 _5 w  i$ A
    return 2; / o0 v$ O; I# R/ o
    }
    " y0 d/ J4 t, o" @0 n. g, F
    0 k/ _  q4 g. n( o; p  
    2 F8 [1 p# |9 v+ R. d) V
    6 \3 W) |* H4 z7 V4 t6 X  u+ D( T) t& H7 \
    运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。
    / Q/ T- Q: p5 ?1 T
    ; ~/ I0 \8 E5 \1 M; W如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下:
    2 y  c8 f' i$ T5 h: S% p0 }' x/ K. k* g, m6 m
    8 K" V! o( ]: K
    ......
    + G( p$ g% D5 P9 e7 Q0 j6 H# 第一步:查看是否为自动登录 ! G; M# A  r+ V6 i
    if /usr/sbin/autologin; then ( ~4 M' F% K/ P. ~8 p
    exit 0 % ]5 X; L$ I; z; c% i- Y, K4 `
    fi 4 i! H. D( v9 n0 p- d
    //第二步 ...... : {( K1 K9 u1 x; r; l2 H
    ......
    0 K' Q$ Q! {; x3 X" p- }, J; |" j( {4 p! ?: L4 R4 l1 {9 m& B
      . d7 h. Q. d" a

    & _' X3 l0 S% ^9 p+ V. K8 l& d+ i5 J( e5 e/ O. p, h
    即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。 & m) ?- |6 Y0 R. l) z. A
    * o8 S( x) ?# U3 f
    四、选择进入kde或者gnome,并自动启动X window应用程序 ; o- I/ y( @& t! D& p6 N

    6 C- z! J6 p8 T如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。  
    + r* R- U6 Y  f% \- h一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。  
    & E5 U( \+ b$ C4 e* J2 Y- L* C0 \3 [" F8 X
    ) L3 G( s* J, ?& c4 g; f7 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, 2025-12-28 16:57 , Processed in 0.770458 second(s), 56 queries .

    回顶部