QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3961|回复: 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>
    # c6 \* t( j# a) T! [9 ~, l/ }<>本文以redhat 8.0操作系统平台为背景,阐述如何实现启动级别为3时的自动登录,及自动运行相应程序,并简要介绍了如何在redhat 8.0下自动登录X window(系统启动级别为5),并自动运行指定的应用程序。 " C, M+ b; D0 M5 \% I" t7 ^
    [b:804aea7097]一、启动级别为3时自动登录的实现[/b:804aea7097] 2 t8 {- L! S+ b$ x3 T& a' b7 ?
    ! Q- `- v* Z# G5 J( O/ e9 ]
    启动级别为3时自动登录的实现涉及两个软件包:mingetty-1.00-3.src.rpm软件包及util-linux-2.11r-10.src.rpm软件包。
    $ D# n9 u/ g8 ^2 h4 E0 l5 s- V- p, t& ]8 R* x# c, @1 I
    (1)mingetty-1.00-3.src.rpm软件包  5 e: S: O% U* A, F# E) I% {" s" {
    对于启动级别为3的自动登录的实现,仍然需要考察/etc/inittab脚本,  
    8 F( U* _) o/ e( a0 o3:123:respawn:/sbin/mingetty tty3
    ) c# ]1 U/ a1 l2 W( G0 O! R4 [# Y
    8 `4 E+ V2 W$ A+ J, o
    . z3 s2 P9 J% ]  & ]  ~1 @8 ~( ~
    2 Y( j8 ]. L0 X: V1 ~6 P& L1 ~3 A* F
    , V$ x0 q! M: Z5 [1 V
    因此,如果想在启动级别3的情况下实现自动登录,必须要了解mingetty的功能,甚至要修改mingetty的代码。用命令rpm -qf /sbin/mingetty 可知redhat 8.0版本的mingetty包含在mingetty-1.00-3.src.rpm软件包中,下载该软件包,安装源代码,缺省情况下,代码会安装在/usr/src/redhat/下,我们关心的只是mingetty.c源文件。mingetty.c约有五百行代码,主要实现如下功能: 9 p* P- J3 m+ D
    " I3 a% B* \8 M8 p- A, M  X0 }
      D8 h/ |5 [# K9 Z* |1 t
    打开指定的tty(由参数指定);  
    . p3 u  ^- r4 K- y提示用户登录(login:);  
    / v) q: \) ~: N: U9 T* c获得登录用户名;  
    # P  U" p$ h3 k* s把用户登录名作为参数,调用/bin/login。  
    ! V5 p9 N/ ~9 {# B2 a
    / O% t& n  _" d0 w7 B( H, i( K3 h我们所关心的部分实质上只有以下三行: 1 }* R% j, g/ \% @
    / b' G) s7 D  Z4 U# N9 c
    ' s" e; [3 ?) y" F3 N* y9 j8 @
    ... ... 2 Z' ?  D, N% U. Y
    438 while ((logname = get_logname ()) == 0); //mingetty.c文件438行 ' S) Q  ^: N! N9 D$ q
    439 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); 7 h7 n6 [% a" }) T
    440 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]);
    8 I1 g4 p' [, F8 Z+ b2 I3 [0 h% O' n... ... 6 g! H4 K( K# }7 ]9 u) M

    & d+ s* L- V: o  3 f% [1 S5 S! d. ?
    # L0 P( m) v) ]: b' ^0 z& o/ e
    第一行的功能是输出login提示,并获得用户输入的登录用户名,登录用户名由logname返回。因此,可作如下修改
    ; B# \5 H( \, a9 Z* f9 Y; X, `2 H

    : Q& J3 U0 a7 J0 U: p; |5 E* B- F... ... , p3 J; r8 Z& V: U5 b
    438 // while ((logname = get_logname ()) == 0); //注释掉本行,不再提示login:
    & Z4 k; b/ T! G, R, x. k( T& l439 logname = "root"; //添加本行代码 ) ~- O/ \" F* |$ ^: F" u% h, {* l
    440 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); 5 [5 t( `2 P9 d9 o/ x  I# W/ U
    441 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]); 7 G- a/ U2 g7 l
    ... ... 3 N- j; z/ }% @: F! X6 K
      M, v5 h7 M" `" v% e2 r
      - z. w: P- _) y. J8 \/ T
    0 o% I5 D- @% s' p
    注意,这里假定用户以超级用户身份登录。
    ' a  A6 k8 R" U% K7 ?9 K) G, }7 ~5 n
    - u* i9 A, Z1 f) u3 t% }% L第二行以用户登录名为参数,调用/bin/login程序,进一步实现登录。因此,要想实现自动登录,还应该了解/bin/login的功能,必要时还应修改其源代码。 $ @, G2 ]1 r6 C8 S- T

    3 J/ q% ^4 z2 J5 p: w! G! X4 T3 M第三行为出错处理。 + a" J0 j' I5 l( Z5 _$ U
    1 j; I8 c: `! d2 e7 i
    (2)util-linux-2.11r-10.src.rpm软件包  ; ~8 J- z/ ~. E0 a
    采用同样的方法,查看/bin/login所属软件包(redhad8.0版本的login包含在util-linux-2.11r-10.src.rpm软件包中),下载并安装util-linux-2.11r-10.src.rpm,login可执行文件有几个源文件编译而成,我们最关心的是login.c源文件(大约1500行的代码)。下面简要分析一下login要实现的功能,并对相应部分作必要的修改。
    % Z+ z+ `: g; c6 b# f
    2 f. `8 l# j  JLogin程序主要可以分为以下几个主要部分:
    - q+ }1 B: s: j( v! S; F& S
    , v- {, ^& i& A- z7 H, r. O. H1.Login首先检查登录者是否为超级用户,如果不是超级用户,并且存在/etc/nologin文件,则输出该文件内容,并中止登录过程;主要由checknologin()实现;  . z% n7 w7 o6 }5 b$ W
    2.如果登录用户是超级用户,那么login必须在/etc/securetty/中指定的tty列表中实现登录,否则将导致登录失败。同样可以不指定/etc/securetty文件,此时,超级用户可以在任何tty上登录。  
    3 q) X: A8 X% b. R0 R- p! [3.经过前两步测试后,login接下来将提示输入登录密码(由getpass()调用完成,有兴趣的读者可参考其手册页面),并进行验证,如果密码不对,则提示重新登录。  
    6 Y. f% t8 J5 A# _4.顺利经过密码验证后,login还将检查是否存在.hushlogin文件,如果该文件存在,则执行一次"quiet"登录(所谓的quiet登录指的是,登录时不再提示邮件mail,不再显示最后一次登录时间,不输出任何消息。启动级别为3时,正常情况下输出这些信息)  : E- _  U( f4 |  C
    5.login接下来设置登录tty的用户ID和组ID,并设置相应的环境变量,包括HOME、PATH、SHELL、TERM、LOGNAME等。对于普通用户来说,PATH缺省被设置成/usr/local/bin: /bin/usr/bin:;对于超级用户来说,PATH被设置成/sbin: /bin: /usr/sbin: /usr/bin:  
    5 N; p$ u: F$ P6.login的最后一步是为用户启动shell。如果在/etc/passwd中没有为用户指定shell,那么将使用/bin/sh,如果在/etc/passwd中没有给出当前工作目录,则使用"/"。  
    ! o0 N, ~% m. D3 X- b! w: [至此,一个完整的登录过程就结束了。 8 p& o5 j/ _' p! h' D. Z" Y1 A
    : e. d- n$ g: o# l
    从以上对login源程序分析过程中可发现,如果要实现自动登录,应该在第三步做文章,设法绕过提示输入密码以及对密码进行验证这一过程。实际上很简单,login源程序对是否要求输入密码设置了一个开关控制passwd_req,缺省情况下,其值为1(passwd_req = 1),即要求输入密码进行身份验证。把该行代码改为(passwd_req = 0)后,问题就解决了。即对源文件作如下修改即可: 9 A: {% C) R5 {1 Y% j
    ; l* u, Z) M, M  {; \6 ~

    # G- @* Z0 u3 ]6 B... ...
    : ^) Z# Y$ W' ^  i% |+ j402 fflag = hflag = pflag = 0; //login.c文件402行 1 l3 T& P3 b1 f4 X6 p+ s9 J
    403 //passwd_req = 1   //缺省时,要求进行密码验证,注释掉本行 ! i1 d3 {5 F& @9 t( b4 `3 H
    404 passwd_req = 0 //添加本行 ) C# C5 @6 p# _/ k' c$ n
    ... ...
    6 `  k6 i# M6 M7 S0 w+ y# ]. V/ L0 M* J7 d2 l
      
    ' q" g! @, [% @7 S* }" A9 s
    7 r0 q/ J. }2 ]8 M修改后,可以直接使用util-linux-2.11r-10.src.rpm提供的Makefile进行重新编译,也可以自己对其编译:   g+ e# U! i9 x+ v

    , ^' m: v6 B' _$ L8 J. b9 r/ m, b2 w( `; ]
    gcc -o login login.c setproctitle.c checktty.c xstrncpy.c -Wall -lcrypt注意包含后面的编译选项-lcrypt,否则会出问题。 / J2 N3 J5 B1 ^# R- K; A9 e

    $ h) C& r/ I0 V2 {' Y0 \9 B5 _' U4 e' e$ L$ I
    有了新版的mingetty及login后,拷贝mingetty到/sbin/目录,拷贝login到/bin目录,并将/etc/inittab中的启动级别设置为3,再重新引导系统即可(读者可以自己写一个脚本实现上述过程)。
    / m4 x! e, [7 u) C) P1 f+ O2 t8 y1 ?4 P  i9 M' v: h( A
    如果读者对mingetty或login代码的其他部分感兴趣,可以反复修改login.c或mingetty.c的源代码,测试一下代码的功能,这里要注意的是,在拷贝新版mingetty和login之前,一定要把原来的mingetty和login备份,同时还要准备系统引导盘(有系统安装盘亦可,这样读者有机会键入linux rescue),在测试新版程序前更应如此,如果对代码修改稍有不当,系统将不能正常启动。
    $ l: @9 O. p' |( V* d, c# _; E* ?6 X' a' J" f  Z; g
    如果不想再作进一步的代码测试,只是按本文给出的方法进行代码修改,在系统启动上不会出现什么问题。
    , m' }+ @2 B" Z# T* x
    * v" X6 j1 B, }' s+ g  ?( r[b:804aea7097]二、自动登录后,自动运行特定的应用程序[/b:804aea7097]
    0 |- x) P2 w1 y* ~7 j' _
    " [2 ~- U1 O. u; S; Y& b在实现了启动级别3时的自动登录后,自动运行应用程序非常简单,把应用程序添加在/etc/rc.d/rc.local脚本中既可。(读者可以尝试一下把startx加入脚本中,看一看效果如何。在某种意义上,又增加了一种自动登录X window的方法)
    0 P+ b/ B1 [+ L4 G
    . h7 j9 E" t' ?. j- Z" s[b:804aea7097]三、对自动登录X window(系统启动级别为5),并自动运行指定的应用程序的补充[/b:804aea7097]
      D9 A9 j$ c! y9 u! O7 }# X) `2 q/ t5 z0 b( t4 c8 v4 y
    在"如何实现自动登录linux"中,主要以redhat 7.2平台为背景进行阐述的,其中的自动登录部分可以直接用于redhat 8.0中,不需要任何修改。
    4 _1 l5 ~$ P. ?6 a5 c. @4 F
    # I# z# G" B3 w2 W9 D* N但是,登录后自动运行应用程序的接口在redhat 8.0中有所不同,主要是登录gnome后,自动运行应用程序的接口有所改变:首先点击面板上的GNOME帮助(那个红色的小帽子),然后选择/其它/首选项/Sessions,在Session对话框的启动程序属性页中添加要启动的程序即可。 % _4 `  Z3 I! }% ^1 H

    ) X/ d: M" h( h6 X对于登录kde后,自动运行程序的接口没有改变。
    9 `& |2 J% Y. F& U/ e
    1 `! o3 q# a7 [7 B[b:804aea7097]四、结论[/b:804aea7097] 7 z0 R! b& V3 Y" u2 }- T$ j5 n7 @
    4 R% b. K5 h8 R6 N/ i
    本文同"如何实现自动登录linux"一文,基本上解决了如何实现自动登录Linux,并自动运行相应应用程序的问题。对于两个最常见的启动级别(3、5),都给出了各自的方法。
    ( r0 L4 }# w1 D+ u& |, I* ?
      l; d  d1 Y' J在系统初始化到mingetty及login这一阶段,内核实际上已经完成了引导过程,已经到了系统初始化的最高阶段,与内核没什么关系了。此时,主要是/sbin/init根据/etc/inittab的内容而相机行事。读者可通过(man 8 init)或者(man 5 inittab)了解更多东西。
      ~+ k9 U7 m+ p5 \+ |4 m
    $ X9 h2 N( R3 i9 w5 q3 k+ A在对文中提到的软件包修改时,请遵守GNU General Public License(GPL)相关标准,另外,替换login通常被视为黑客行为,应当谨慎行事。
    $ e, A. f" o/ ?3 V( y! q6 K! B* [: g1 `1 N+ b
    % L4 S7 N2 B2 [+ `( J. U+ W

    # ~8 {. L3 ~3 U[b:804aea7097]参考文献[/b:804aea7097]
    9 m* Y; I" i4 g7 Y9 t1 D' o; R; M% b' d' ~$ a7 l1 v
    3 _0 E$ S7 C( {+ k; [$ f4 f
    1.login手册页面  ' W6 M1 V- R; ~0 D, g. P" A
    2.mingetty-1.00-3.src.rpm,在redhat 8.0的发行版本的源代码中,包含该软件包;  1 q/ p% n  n& V$ n) `1 X( d
    3.util-linux-2.11r-10.src.rpm,  ) u4 m/ t, K# o2 b" m* f2 J

    ! ]1 K7 `- o2 A3 r5 {  W5 S可在http://rpmfind.net/linux/RPM/redhat/8.0/i386/util-linux-2.11r-10.i386.html处下载,注意下载源代码包(..src.rpm) 6 D2 M' c$ U9 n) e
    5 k. \- \/ P# b* S6 c7 t- E
    [b:804aea7097]关于作者[/b:804aea7097]  
    8 T( d0 q5 b# U
      H2 i" X+ d7 G9 E) W  R郑彦兴,男,现攻读国防科大计算机学院博士学位。您可以通过电子邮件 mlinux@163.com和他联系
    $ C/ h# h: a1 t" V0 ]) T
    0 Z0 P9 K. k" i</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) ! J; V: j4 q0 Z9 F
    # A7 V* a8 C7 D1 u9 \
    机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。 * z2 Q7 f. c/ J
    一、linux启动的最后阶段的工作
      {( [, [5 N/ G) F" V9 W5 q; e
    0 h* \; f7 _1 P& clinux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有:
    " p) s. W* }. Z* ?) ]! O9 b7 c/ U; T. }5 z3 U. f$ A3 z
    运行xdm启动X window;  
    + {1 ^5 n, P$ T# j  @: z' C, g+ v运行gdm,进入gnome桌面环境;  
    % C$ P. ]" @- B- I运行kdm进入kde桌面环境;    A$ s, S, n6 K+ \7 Q% T' m, M* l
    自动登录进入linux;  $ Q  x7 l$ P" \) @: L, ]; y, r
    prefdm脚本框架大致如下:
    : r! R& G" r7 O: C4 s4 t! E. r  b
    2 [5 \- y! P) k#!/bin/sh
    4 R$ g1 K! n1 ^6 b' Q7 xPATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    0 U+ K5 ]( R4 Y. _. Z  a: i. /etc/profile.d/lang.sh
    ' f5 H# e6 J+ y( A% A; ?% S# 第一步:查看是否为自动登录
    ) J0 q/ F, ~; b# E; l! K, {if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
    9 ~6 X& @0 k, j6 S' W- sif /usr/sbin/autologin; then ) r# V& U. w- \* s$ Q+ j
    exit 0
    ' Q4 N6 O( Q1 A: b, i  nfi 1 ^  d! x( @8 n% ~3 j2 H+ c- Z* Z  ~3 P
    fi
    % _5 I2 z  W! M5 e; T$ N6 B" Z) B) K4 t
    # 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式 " ^+ L% b& @' _& H# z
    ...... # y5 f. p$ I) V0 h& I
    # 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。
      x3 {" t) O! c...... ( p, |% m" C) J4 M. t
    ; T. X9 h; }7 m0 G
      1 Q- f0 x. _" I  l

    1 s8 X' a' g! A5 ]" v. F, w
    - s6 G; c/ I1 @3 C+ j二、自动登录的实现(autologin的实现) % o4 @# k+ ?+ @" q, o$ U) b

    ! e6 c$ x- c% ?  @) n4 N在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。 5 V: z; F! @; {3 z) x% z: F  N
    ; C& H4 y1 F3 P6 n
    自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。 , @7 o: ^$ F0 j; p! p# z

    ( J$ k& \4 g! BXinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。  + F3 `4 P3 n( i. X
    实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。  
    1 e. O8 Z0 e6 f, O) z2 jstartx脚本的最基本框架是:
    7 _6 B/ O6 ^; W
    ' D1 E7 K1 h. g' {; Ia、 寻找.xinitrc,如果没有则使用xinitrc; % D$ M5 R# ]' D' R
    b、 寻找.xserverrc,如果没有则使用xserverrc; 8 U3 n7 R+ ^4 X
    c、 根据找到的脚本确定xinit的参数; & r; P8 M) J% Z

    + ]* `+ R! [' w: e7 {) \9 I由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录:   O) q7 E, G1 D% `: E7 Z( o
    0 J$ B8 p9 m  K, H* p$ M/ p
    , d, Z& l; l0 B9 `
    #!/bin/sh # v& L! s9 q2 b" d, O! W
    PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    % N! k! V- e2 E$ c. /etc/profile.d/lang.sh & C0 `3 g! @9 @& l" S0 H9 Z1 O
    # 第一步:查看是否为自动登录
    4 m/ a% o" t6 V: E#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
    / o' x$ o: R. A9 B, d0 h( w5 X+ [#注释掉上边的条件测试,直接运行startx ' z8 O% t6 M3 @& M. j8 e& ~
    if /usr/X11R6/bin/startx; then
    : i5 o! M$ L& O' H( K( R1 kexit 0 5 r0 g0 h  S) ?" [5 s3 g
    fi
    % Z+ C/ b8 w) U0 C+ z3 I#fi 1 ~/ I: Q- L7 s+ C; [2 b
    $ f3 c( Y/ I' j% S) @! A+ F( J
      
    % q" z4 \- d9 b. l% m
    & [# B' i  y" o" L0 N$ {+ a( H" y4 O* ], @9 ~# W5 B' q
    当然,应确保/etc/inittab中的启动级别为5。 - O6 `+ `* V) D: n& L
    * P6 y' w( [9 v! c6 @
    重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。 ! i; |" Q9 L+ r+ M1 |6 Y9 X

    5 `9 h( b7 m4 B7 j8 y  m三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。 + ]7 ^( F* ]3 X# X/ Q$ Y3 y
    8 _4 O8 z" x$ P
    观察原来/etc/X11/prefdm脚本的自动登录部分:
    8 `$ J1 ?' @0 {. ^* Q( f1 d1 Z* a& T$ z: I, f3 O0 P

    ! B# e& F/ w: k6 [' C4 \7 U...... $ e% J% f, \$ A% W
    # 第一步:查看是否为自动登录
    6 ?$ r5 n( F: J% W& ?if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
    , M& \4 z, G7 Pif /usr/sbin/autologin; then % [' v; k- t& r$ z  k. ]
    exit 0 : p' K6 K3 p# s* [
    fi 2 t8 |8 k+ A) `3 u- I! v- V* o
    fi ) s* N* H8 S" ]; u& |7 ^, H7 h
    ......
      Q8 _2 G; A  Q1 H- x1 ~
    : X5 |# P( O/ M! @# F: V: Z  O  $ T# n, I4 ]0 L2 h

    ! F7 P, ]4 d! Y/ s: N+ t$ g+ [5 N! V$ I* V
    不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。
    4 {) D' i1 E) s/ N5 q6 `1 ^; S2 F# _
    3 v, Q6 F* y5 a! z1、/etc/sysconfig/autologin配置文件的实现: * [6 \9 Z5 q4 R& L) A* _

    : T: B5 v; A+ Z* C7 h! f8 F$ e7 G- s4 u) `
    #config for autologin # C6 ?" i5 W9 \
    USER=root
    " u; o* S5 F5 d( [EXEC=/usr/X11R6/bin/startx 1 H, S1 B& i* p% F$ f4 Q
    说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。
    6 I. f6 Q& X+ _! Q' W# H2 g- E5 n! ?) |, q! p. s3 _2 i. \+ N" Y
      # Y# M% a6 }+ M, {1 D" Z; x& P; b

      q! o- w# q8 g9 J
    ; J/ ?3 S5 a5 Z* V7 d* B2、/usr/sbin/autologin可执行文件的实现:
    4 Y) L$ N8 x0 ]! X
    / O) G# o. m; z/ k
      J  A% e& {7 K# L4 p/********************* ' y* B7 f) z0 m$ @( V
    ****  autologin.c  **** & n& z" D$ E0 _. H: \! G/ S5 ]/ s; Z+ H
    *********************/ : J, M2 b; H1 u' W3 J* ~3 [0 O
    #include &lt;stdio.h&gt;
    ' h9 @0 W% C# P' j; g( s#include &lt;unistd.h&gt;
    : [1 f$ ]9 _/ ?) R- N3 f/ C#include &lt;string.h&gt; # ?, z5 N3 [; B4 l
    #include &lt;errno.h&gt;
    % q. P3 `2 w* H! ~; }/ }#include &lt;sys/types.h&gt; 3 p# J0 q/ l9 @6 s
    #include &lt;sys/stat.h&gt; * }) j2 F( g4 a
    #include &lt;pwd.h&gt;
    ' N7 H9 L2 d7 }) ]- P" d9 ^& [9 X# f1 ]( B8 \; `" {3 C5 s
    int main(int argc, char **argv)
    & p! Y  o0 c) F( Z: }* U{
    9 P$ x7 z; p4 D3 L: _1 l. Istruct stat st; % _0 Z0 ~$ f; h) F
    FILE *f;
    ) P# |: g  c2 V0 S. @char *cfg; 5 b+ z6 x/ I& ~4 g+ @
    struct passwd *pw;
    0 j8 i6 e3 y) Q1 m; x! J: Luid_t uid; 2 g- H4 z, s( q5 |
    gid_t gid;
    ( B0 X, H! v# n( hchar *dir, *shell;
    / d5 y* \9 j8 {7 o$ I9 R2 Schar *user=NULL;
    / K- {  u! S( L8 W3 b* y4 I% `* E. uchar *cmd=NULL; % k! E% Q  c( x) [& d5 M
    ' T$ Z0 n) P( `' q, A2 [
    user="root";
    6 z. e) f1 w/ c/*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上,
    . j" y6 f& O# P$ J" k登陆用户名应该从/etc/sysconfig/autologin中得到,
    3 w+ c6 ~6 F4 @$ U1 \' i% {程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/
    ; @3 `0 `. Z& Ocmd="/usr/X11R6/bin/startx";
    " j7 A1 B( \+ a/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/ + x7 X! @8 t! r9 p
    3 O: H3 f4 H7 J( D# z
    pw = getpwnam(user); 9 D. T$ @7 i7 N+ f! w- J' q/ m
    //getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。
    ) h2 \) n3 N6 H5 }6 h* X! v, K6 Xif(pw) {
    - {4 o& w( o0 {uid=pw-&gt;pw_uid; % H" E8 b  M% q% F% S
    gid=pw-&gt;pw_gid; dir=strdup(pw-&gt;pw_dir);
    ; K& L3 Q) C2 w: W7 rshell=strdup(pw-&gt;pw_shell);
    5 ~8 A0 \. ]6 T8 e8 Q} 9 R. k- L2 z5 Y9 a6 ]
    //获得用户相关信息 / I; f' M0 R. ^# k8 s
    else {
    - z/ X; c" `8 sprintf("ERROR: No such user %s!\n", user); 3 ~( i- x( A7 n* O# F! O
    return 1;
    ) H) V6 L3 i8 j2 P+ M1 |- Y' i+ E} # R5 ^. }4 s! P  ~9 u* t; ]

    1 \! t9 a* p+ D! {) Q4 U, Tchown("/dev/console", uid, gid);
    & Z) C. h* S5 }, @" O2 B3 N  Cchown("/dev/tty", uid, gid); ( k: p" e9 D8 C  |
    //为控制台和终端设置用户ID及组ID
    & S% v, g% V3 O* y# O* x" X  Q$ h. N( Y, I
    //下面是设置用户相关ID $ p: u1 q  m" s$ D% e" B. z& s
    setregid(gid, gid); ; w  c: Q5 A( n
    setegid(gid);
    5 O! L7 X! M# Z6 j7 s: o: l7 y2 isetgid(gid);
    5 c' z' O7 t# S" Bsetreuid(uid, uid);
    0 Z+ o  r; n* h/ Y+ L5 dseteuid(uid); 9 R8 `) F4 D% p; O- P5 f5 m; [
    setuid(uid); 4 u; C9 r# r& V0 I6 s6 G/ S

    $ F$ \. ]- k8 L9 V& q, v5 Dsetenv("HOME", dir, 1);
    * i; V+ h" u, l, Y/ @5 msetenv("SHELL", shell, 1);
    % _3 J9 C! T8 f% C/ w" O% ksetenv("USER", user, 1);
    6 m7 ^/ \4 Q+ k0 vsetenv("LOGNAME", user, 1);
    & A0 L* i2 r3 \: H+ R  u//设置用户相关环境变量
    3 Y' J& R' e3 ~+ v5 h+ A# H- r7 }$ q- D- N9 T: ]2 D0 o2 u: S
    chdir(dir);
    2 P% Y, t7 I' Q//切换到用户根目录 3 s) M$ Q* A* `6 n+ d( h; z
    user=NULL;
    - |  M9 U1 j" K) Z8 @% ~; ?0 D
    ( M$ {1 R" T# Z  i- p9 r$ j; ]execvp(cmd, argv);
    ' |' x! j9 ?8 B* r/*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */
    8 T) \7 Q9 W5 P8 n! d8 ^printf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno));
    8 ?! p( o) [' d3 z- C  g9 jreturn 2;
    + D5 U- y3 l. K& A% }}
    + m/ A$ e6 T1 J7 Z. A/ |  g; v" K  s: q* i$ ?; u( o7 R
      . t  V5 O0 h/ ~8 T) e& \( }

    & ~" @/ }+ p! H1 c; A
    # q% k; _  E5 }. e- @% S& K运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。 ; i/ b- ~$ b4 o0 u
    ; S/ P: _3 E1 |( y" V1 f
    如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下: ( C8 A1 r; w+ M% S4 {2 T

    9 i; h4 q& f2 R) t. ?. Y; m
    , g% v# ^( M! Y! T; K- x...... 6 m4 ]1 r# N' D2 W. k- z9 G+ |
    # 第一步:查看是否为自动登录 $ ]0 {) i1 ?" S2 A# z
    if /usr/sbin/autologin; then
    + r/ m: d; ]2 @exit 0 & z6 P: H" j  P6 ], G! u
    fi # E; z# ~- N% L. X' {3 w
    //第二步 ...... ) j" t8 w( q6 c
    ......
    * s# F0 d4 a' j5 v- W
    + z9 h4 g" W4 j/ D% o" I  
    + D7 l0 P$ g/ ~$ `, H$ e; T4 D, x7 t; B, u& F& d2 t5 a2 K0 b0 ]

    / k, s& j, R  `即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。
    2 b3 a' \# S! k# T! ^, F3 y6 X2 s9 `' N  s! {2 l
    四、选择进入kde或者gnome,并自动启动X window应用程序
    % |$ J% Z" Y: `4 ~+ L7 H$ Y$ ~( T% l2 T% i3 ?, S
    如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。  9 F$ m, m1 K: B; n  R9 M
    一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。  4 k8 L. P$ {1 A$ V/ O2 c
    - j* k) T( j# H& c: }5 e( e
    $ [! T0 {. b3 b+ p" 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, 2025-8-20 08:54 , Processed in 0.498275 second(s), 56 queries .

    回顶部