QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4254|回复: 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>
    7 e9 j. }9 N/ C5 x6 h<>本文以redhat 8.0操作系统平台为背景,阐述如何实现启动级别为3时的自动登录,及自动运行相应程序,并简要介绍了如何在redhat 8.0下自动登录X window(系统启动级别为5),并自动运行指定的应用程序。   A' R7 z% }3 @5 g
    [b:804aea7097]一、启动级别为3时自动登录的实现[/b:804aea7097] # F2 S& B! A; M3 w! Y

    ( w" |7 v6 d) M. Z2 |; w. w启动级别为3时自动登录的实现涉及两个软件包:mingetty-1.00-3.src.rpm软件包及util-linux-2.11r-10.src.rpm软件包。 3 Z8 [( h# g8 @! m( K, N
    1 _( R1 }. I( Y
    (1)mingetty-1.00-3.src.rpm软件包  
    & S# _9 M# f1 ?* C8 ?! q! m对于启动级别为3的自动登录的实现,仍然需要考察/etc/inittab脚本,  
    + _) ?4 ~+ d' c0 x8 q3:123:respawn:/sbin/mingetty tty3 & W7 M( W1 E% m. }/ `7 R5 S5 p
    7 W6 L( m4 A( C7 g4 g  E6 j+ f
    " [" d3 v4 p2 [/ P  N7 K9 \
      % P5 ?" N1 Y9 y5 Z& X& w3 }2 |

    ' X2 k5 A4 S' r9 T" l8 b, y; \# J: U: ^. ]$ `
    因此,如果想在启动级别3的情况下实现自动登录,必须要了解mingetty的功能,甚至要修改mingetty的代码。用命令rpm -qf /sbin/mingetty 可知redhat 8.0版本的mingetty包含在mingetty-1.00-3.src.rpm软件包中,下载该软件包,安装源代码,缺省情况下,代码会安装在/usr/src/redhat/下,我们关心的只是mingetty.c源文件。mingetty.c约有五百行代码,主要实现如下功能: # q2 Z( R  U- j' v
    - G6 P$ R$ t% w

    6 K( j- ^. ]( g* O" B4 [8 h6 P打开指定的tty(由参数指定);  # s( [  C1 k# C0 v
    提示用户登录(login:);  . j2 L% u: D& K" n0 @5 O# q
    获得登录用户名;  # r8 {* |5 o0 ?$ k( s( j
    把用户登录名作为参数,调用/bin/login。  
    $ I0 S2 C! N: i3 A* U
    4 t6 v2 r0 f, `* w; S  P) e( ^, w我们所关心的部分实质上只有以下三行: ; ?# [! `. U# K- g$ Y) b

      f$ l9 c! R: _  Y3 I& Q2 j( j! E; v+ S
    ... ... 9 \- W3 E2 w( ~* O5 j) L4 [
    438 while ((logname = get_logname ()) == 0); //mingetty.c文件438行
    , e7 {8 E3 {* D( Q5 j% d4 U439 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); - O) m& I! v8 v* b) r, l& x
    440 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]); ! z& C. O; x6 l) l: }$ C
    ... ...
    3 m; N/ y* y6 [5 b9 s& L( t; j: u- K
      % u# D  V0 V( v

    # n9 M* s. S& h" [第一行的功能是输出login提示,并获得用户输入的登录用户名,登录用户名由logname返回。因此,可作如下修改 $ ]/ _- |4 o3 H4 ]
    7 r$ K+ N3 g8 v" _# {9 r. @( M

    8 c( n" u+ h7 l* d/ f... ... 0 z% R/ g- b, Q) q$ c3 T. F
    438 // while ((logname = get_logname ()) == 0); //注释掉本行,不再提示login:
    1 V/ ^/ f7 C6 _# c  z2 i) ?439 logname = "root"; //添加本行代码
    5 A* w% y! @. i* s5 [440 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL);
    , O/ [8 P" k3 W& l441 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]); / z0 C) \, t3 C- u! m# N
    ... ... + |- I  ^% g! v4 C5 Z4 A% E
    : L! s$ v4 M3 D2 k: `9 {' I2 I  i
      
    " ~+ d0 H+ a& |) T$ K+ f$ g  v1 O; F% |4 H
    注意,这里假定用户以超级用户身份登录。   C* d7 V1 |+ ^) I/ ~5 h

    2 Q0 X6 C! w7 E7 Q第二行以用户登录名为参数,调用/bin/login程序,进一步实现登录。因此,要想实现自动登录,还应该了解/bin/login的功能,必要时还应修改其源代码。
    5 P- d) ?4 n* P3 _/ I' [) H% Q" `( T  N% R6 T! Y2 ?
    第三行为出错处理。 : ]6 U  z# h& m  Y

    & _1 ~2 q9 Q6 Q0 n(2)util-linux-2.11r-10.src.rpm软件包  8 J4 h' X* `- C- Y7 I8 r: F
    采用同样的方法,查看/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  A# |. x$ x, I
    3 z' _( P6 K/ \" p6 G! hLogin程序主要可以分为以下几个主要部分:
    ! S. g) `+ b  A& }" n: V; }+ H# ~% v1 \% R9 Q
    1.Login首先检查登录者是否为超级用户,如果不是超级用户,并且存在/etc/nologin文件,则输出该文件内容,并中止登录过程;主要由checknologin()实现;  . g! A3 k1 P7 @& o: E
    2.如果登录用户是超级用户,那么login必须在/etc/securetty/中指定的tty列表中实现登录,否则将导致登录失败。同样可以不指定/etc/securetty文件,此时,超级用户可以在任何tty上登录。  # f) h2 D/ _7 H
    3.经过前两步测试后,login接下来将提示输入登录密码(由getpass()调用完成,有兴趣的读者可参考其手册页面),并进行验证,如果密码不对,则提示重新登录。  
    % K( Z  x; q) N' R4.顺利经过密码验证后,login还将检查是否存在.hushlogin文件,如果该文件存在,则执行一次"quiet"登录(所谓的quiet登录指的是,登录时不再提示邮件mail,不再显示最后一次登录时间,不输出任何消息。启动级别为3时,正常情况下输出这些信息)  7 {0 [& m" T' W5 ~  {: ]: u9 Q
    5.login接下来设置登录tty的用户ID和组ID,并设置相应的环境变量,包括HOME、PATH、SHELL、TERM、LOGNAME等。对于普通用户来说,PATH缺省被设置成/usr/local/bin: /bin/usr/bin:;对于超级用户来说,PATH被设置成/sbin: /bin: /usr/sbin: /usr/bin:  ; n# d3 [3 I5 Q* e6 R/ ~* o2 e
    6.login的最后一步是为用户启动shell。如果在/etc/passwd中没有为用户指定shell,那么将使用/bin/sh,如果在/etc/passwd中没有给出当前工作目录,则使用"/"。  ; R+ l% V) z0 z' J# a
    至此,一个完整的登录过程就结束了。
    : N) ]2 q& A% u# ?  ^( ?0 @
    ' x1 u& l; T! Q8 N! G. q3 {从以上对login源程序分析过程中可发现,如果要实现自动登录,应该在第三步做文章,设法绕过提示输入密码以及对密码进行验证这一过程。实际上很简单,login源程序对是否要求输入密码设置了一个开关控制passwd_req,缺省情况下,其值为1(passwd_req = 1),即要求输入密码进行身份验证。把该行代码改为(passwd_req = 0)后,问题就解决了。即对源文件作如下修改即可: . y% J5 A; h0 L- [
    9 L/ s  L, {' C/ H; D8 ?

    . W" {: J4 ?  D' m... ... 6 Z+ m' f! T1 z2 Q1 ~  y. l
    402 fflag = hflag = pflag = 0; //login.c文件402行 : W0 i/ {: I- ?1 j/ [
    403 //passwd_req = 1   //缺省时,要求进行密码验证,注释掉本行
    5 R9 B" T  ?1 o404 passwd_req = 0 //添加本行 3 A' C- U7 z/ ]- I5 T
    ... ...
    ) b8 Z2 b3 b4 a# G( g! a/ c
    0 K0 T5 a. m( u  
    5 a1 d% m+ M# K" M! G0 {. J6 q" T' {8 F8 G" Y. ~  K- `% N
    修改后,可以直接使用util-linux-2.11r-10.src.rpm提供的Makefile进行重新编译,也可以自己对其编译: / @4 ?7 I" J. H- Q9 `( j* ~

    ( r1 a6 J- t! t4 k+ p1 V
    9 A: @9 T" X; d( n1 xgcc -o login login.c setproctitle.c checktty.c xstrncpy.c -Wall -lcrypt注意包含后面的编译选项-lcrypt,否则会出问题。
    ; a  e# X3 B) r$ C6 o3 E9 x
    4 u8 n* B, s( E# ?& N$ M+ ~/ a" o
    有了新版的mingetty及login后,拷贝mingetty到/sbin/目录,拷贝login到/bin目录,并将/etc/inittab中的启动级别设置为3,再重新引导系统即可(读者可以自己写一个脚本实现上述过程)。 , B+ k/ l" o3 v, O( ~9 P

    : H9 \: `9 Q3 A' v如果读者对mingetty或login代码的其他部分感兴趣,可以反复修改login.c或mingetty.c的源代码,测试一下代码的功能,这里要注意的是,在拷贝新版mingetty和login之前,一定要把原来的mingetty和login备份,同时还要准备系统引导盘(有系统安装盘亦可,这样读者有机会键入linux rescue),在测试新版程序前更应如此,如果对代码修改稍有不当,系统将不能正常启动。
      P6 p6 \# N5 f5 d4 O( I
    ( D- {/ M9 l1 g/ ]% Z2 a4 Y如果不想再作进一步的代码测试,只是按本文给出的方法进行代码修改,在系统启动上不会出现什么问题。
    6 k7 g% D/ j" C& f0 l1 w( J
    * w3 y! x$ B3 ?0 B5 Y5 W- Y& {: t[b:804aea7097]二、自动登录后,自动运行特定的应用程序[/b:804aea7097]
    9 Y% H; ?: K0 q
    . i! c& z7 x0 Z- L- A在实现了启动级别3时的自动登录后,自动运行应用程序非常简单,把应用程序添加在/etc/rc.d/rc.local脚本中既可。(读者可以尝试一下把startx加入脚本中,看一看效果如何。在某种意义上,又增加了一种自动登录X window的方法) - w. F- I; ^0 n0 m

    " }: @1 v% h' X0 \, i' |5 ]  F[b:804aea7097]三、对自动登录X window(系统启动级别为5),并自动运行指定的应用程序的补充[/b:804aea7097] - y1 U( K8 e0 _* U

    ' v9 |( P% n  o  P- K0 U在"如何实现自动登录linux"中,主要以redhat 7.2平台为背景进行阐述的,其中的自动登录部分可以直接用于redhat 8.0中,不需要任何修改。
      B& t/ y5 E, F/ V. T& y/ z3 q; Y) d. w5 k, |/ o6 n  }
    但是,登录后自动运行应用程序的接口在redhat 8.0中有所不同,主要是登录gnome后,自动运行应用程序的接口有所改变:首先点击面板上的GNOME帮助(那个红色的小帽子),然后选择/其它/首选项/Sessions,在Session对话框的启动程序属性页中添加要启动的程序即可。 9 H7 z- Y+ y1 V+ e/ S) D

    : b7 ]3 {! f% N对于登录kde后,自动运行程序的接口没有改变。
    % c# N$ e- M2 W$ ]# h
    , H9 R; S( z& e+ u) Q" t[b:804aea7097]四、结论[/b:804aea7097] & Q* |# s- j" \" C  s
    3 u- f$ {3 `0 w& t7 A6 O
    本文同"如何实现自动登录linux"一文,基本上解决了如何实现自动登录Linux,并自动运行相应应用程序的问题。对于两个最常见的启动级别(3、5),都给出了各自的方法。 ; r/ y  }# D6 z5 ]

    1 [& Z0 O7 X2 y( l3 |4 R% V3 {; C在系统初始化到mingetty及login这一阶段,内核实际上已经完成了引导过程,已经到了系统初始化的最高阶段,与内核没什么关系了。此时,主要是/sbin/init根据/etc/inittab的内容而相机行事。读者可通过(man 8 init)或者(man 5 inittab)了解更多东西。
    + B* z* S5 L, ]% j8 I% b3 Z
    3 ~$ f+ e$ o% u4 @3 |! E6 L在对文中提到的软件包修改时,请遵守GNU General Public License(GPL)相关标准,另外,替换login通常被视为黑客行为,应当谨慎行事。 ! T% R5 L) a+ v% y3 i, M

    ( R& m1 u. Q" d! v2 F! D/ k8 x
    . }$ o$ Q" O, u8 t& O# Z
    ' `# T, N( D& D[b:804aea7097]参考文献[/b:804aea7097]
    7 s1 v: N3 b6 o. w) x7 x+ h$ Q3 }) b6 E" V4 [9 r
    ( s$ W& r$ _& `+ e
    1.login手册页面  # s* i1 O2 ?: S8 i- I, `8 |
    2.mingetty-1.00-3.src.rpm,在redhat 8.0的发行版本的源代码中,包含该软件包;  # x: ~( |* d/ G' r& F
    3.util-linux-2.11r-10.src.rpm,  1 J. p$ ?6 P  @7 V  K- x: J$ Y

    / Z% ]8 f( r" _( b" X可在http://rpmfind.net/linux/RPM/redhat/8.0/i386/util-linux-2.11r-10.i386.html处下载,注意下载源代码包(..src.rpm) ( B+ e* w  k$ g! o. N. G2 F* }; G
    . q2 ]8 v, Y. ]  N; I" t8 |2 S
    [b:804aea7097]关于作者[/b:804aea7097]  3 t) t5 y( s; v
      W# ~/ x6 ]- K5 E  n1 \
    郑彦兴,男,现攻读国防科大计算机学院博士学位。您可以通过电子邮件 mlinux@163.com和他联系) f7 k1 L; Y* t6 I$ _$ c% u4 _8 @8 E
    ; s: Y$ r- `' J9 f
    </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) ) P4 D  I  O8 j$ B* K
    , q+ p) D% |6 k2 l4 y+ M
    机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。
    # i  C# |# K) r. j4 M( k  ]( G1 y一、linux启动的最后阶段的工作 / k* k& h( k* V  f7 L) Z; x

    : y' b" P" Q5 }5 A- Slinux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有:
    + b  O/ n6 L4 a- v$ M4 Q/ ]$ w, [4 F; {
    运行xdm启动X window;  5 M1 ~8 h8 F' |$ x# C/ ~' y
    运行gdm,进入gnome桌面环境;  
    ; B/ J3 h# n+ G4 o6 s; G- f) L3 {% h运行kdm进入kde桌面环境;  % R! q8 t. J0 o2 j) h2 p5 u7 D
    自动登录进入linux;  ' \8 H+ x- l( r( d: q$ k6 x; z' p
    prefdm脚本框架大致如下: 9 X) ^* L8 T2 ]9 M1 {2 f

    1 }% ?" N' c9 h) U( G#!/bin/sh # I6 X' S, e9 U7 }# U7 n% M% A3 ^# o
    PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    * G! d) H: A" |( k: F. ~. /etc/profile.d/lang.sh ! l, ^; i' y9 W: f
    # 第一步:查看是否为自动登录 # w+ L/ `4 C5 e
    if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then 7 O& a  Q* c6 M3 S) q$ n
    if /usr/sbin/autologin; then & {! c# \. Y$ M
    exit 0 4 o1 F4 M" w7 O9 Q
    fi
    2 o; m( t( }  P9 v1 hfi ; A; q% E' N! _6 H
    # B* q& z* ]  {% v( X
    # 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式
    * q* l% U2 `* L......
    3 _& C8 t2 C  X3 P# 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。 5 A4 q0 r! \# K: ]8 D
    ......
    * Y  s  @3 }7 P2 v( N+ A' P! N
    ; M) s* _" u! a1 \% a5 s; T8 B  
    5 e- v0 _8 q  O0 A) T
    3 g! R8 w$ c( i
    , q4 y, u$ w7 r7 ~) d" D, l二、自动登录的实现(autologin的实现)
    . O# |4 m" G$ w, Z) a+ K) D; C) I/ k" U
    在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。
    0 j, l6 o$ }: K/ W& C* s% }$ p9 B# D7 D8 {* T7 H
    自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。 $ m/ M0 Z/ ?0 z& Q
    9 \2 `! t$ o+ g9 B/ q8 y, `
    Xinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。  
    / b- b1 {7 Y0 ?) e/ T. k1 B7 X实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。  
    8 @+ {$ {; N: m# gstartx脚本的最基本框架是: & a9 I5 I, Q) S0 h6 L! V7 p9 h7 t& A
    / {- ?7 h# g1 a% H
    a、 寻找.xinitrc,如果没有则使用xinitrc; # I1 ?/ E+ m2 Y* `4 p2 ^9 D
    b、 寻找.xserverrc,如果没有则使用xserverrc; 2 Z( i! g! D5 p% E+ Z
    c、 根据找到的脚本确定xinit的参数;
    " N. x! p9 N/ |* M( |0 g9 _: \+ @9 [6 m! f
    由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录: - U9 ?# q, P' Y. M9 k$ ?
    7 S$ q! x& T$ P3 ?; x& U! z, K
    , D, t. A! C7 {  E! X4 @# K
    #!/bin/sh ! `7 {7 [/ k; W4 y1 j9 b5 W
    PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin 1 o" e2 {5 O; j8 h) J3 `, |- b
    . /etc/profile.d/lang.sh
    5 a( M' ^6 A& Q. ?1 r# 第一步:查看是否为自动登录 2 E* Q" G8 r" q9 Z5 H
    #if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
    ) I+ I# h+ E+ v#注释掉上边的条件测试,直接运行startx . p; |) ]# X& z& c- F( ?  ^2 e& v0 a
    if /usr/X11R6/bin/startx; then
    $ f' b. v! D: ~  ]$ y- Z6 bexit 0 2 V% A9 |! L5 W) R
    fi , n4 J% A8 @+ |9 c9 L$ T
    #fi
    ' H) c, f$ W- K1 F- d1 K* U; ?  r# k/ \: W5 z
      8 j: `7 S5 ^3 G" u
    & x- D3 C( y: X2 e2 \8 r) b" Y
    : _3 p; `7 T) W/ m8 J1 [
    当然,应确保/etc/inittab中的启动级别为5。 4 E4 Q2 ^) g% S9 @3 z4 s7 g7 d4 ?

      @  o2 i' n# I8 N! C. U6 H重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。
    & H4 H4 e. U6 u" s# o9 X
    / T: R5 S5 F6 O' k三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。 3 g6 g# c9 Q, y* k: l

    " C" ]3 g2 N. _0 f. }$ s( n观察原来/etc/X11/prefdm脚本的自动登录部分: 6 V: l; M- M! I$ ]
    + t+ H% ?8 H  Z: Y% t( f

    1 n$ ^# h$ e3 ]7 b) U) I: {1 d: R3 b......
    3 ^3 k5 |; f9 ~1 o# 第一步:查看是否为自动登录 & ^0 w9 @7 g" Y
    if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then % X: H" j$ j; K3 n# t
    if /usr/sbin/autologin; then
    # @& H- U7 W# _/ [1 B0 `) Aexit 0
    ) U9 n5 s1 ^1 Q- X: s( nfi
    / ?  f) c6 i' Z9 _8 Lfi
    & z0 o) q& A8 x# }0 G- {...... + Y" o" [5 B6 p4 q; g$ _

    $ G/ V& }) \8 V7 ^4 T/ Y  
    . x3 B& z) E9 Q  b
    $ Y$ U! Z* @3 f: f
    # q" ~' a0 z* ]! q; h$ d不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。
    . R4 M2 ^: H9 B
    2 R( G6 F; i, K* ^1、/etc/sysconfig/autologin配置文件的实现: , h" {6 ~! G1 d% G+ o4 A$ R) S
    ) y& W/ c8 e3 M" l
    ( [. Q/ F2 h5 @( L/ U
    #config for autologin
    $ j# `; ]% n3 j/ x$ y% WUSER=root 2 Z  W( O. s# K4 I6 w
    EXEC=/usr/X11R6/bin/startx 3 |* Z) O7 m* C8 p
    说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。
      O6 F2 f% _+ t0 v9 g6 v- i, A
      ^' f2 D4 z1 p% z* D# `  : l% U+ H; m: t- |0 h/ W  r

    ! e* `8 ^5 z4 T" u. t& O7 v$ t+ x8 J* T
    2、/usr/sbin/autologin可执行文件的实现:
    + F: p* a" f' j9 G# Y0 V
    3 K; ]  f7 x6 S8 T- f, K& }& t% u8 b2 x* h& b& e2 g
    /*********************
    , |( I7 v6 d7 R1 [  o$ r% s****  autologin.c  **** % C' L; g2 D( b: f
    *********************/ # {% w# `/ m4 p3 V0 P% O$ p
    #include &lt;stdio.h&gt;
    $ u: b7 t5 U) h7 ]! _; C#include &lt;unistd.h&gt; 7 r+ E) e& G' t' S) `( P9 {
    #include &lt;string.h&gt;
    + k0 F( w# [5 a& z#include &lt;errno.h&gt;
    6 Z4 w9 v3 E5 \/ p: v$ I0 z#include &lt;sys/types.h&gt;
    $ A* f: J& [6 X#include &lt;sys/stat.h&gt; % d# z9 }/ W2 z3 E
    #include &lt;pwd.h&gt; ) J! i$ @$ J! l$ R1 T  k3 Q

    6 N$ N% Z2 [* dint main(int argc, char **argv)
    0 i0 Q; K2 P" g; N{ 9 ~% l' }2 a' {8 X3 @
    struct stat st;
      s  ]( q# m# W7 h$ wFILE *f; * y: B' L6 K' Y5 r$ R$ I
    char *cfg; 5 l& d( l! |* H- R& ~2 u
    struct passwd *pw; " A5 H% c  q" L5 o4 U& c2 {4 Y
    uid_t uid;
    ( \6 B+ F/ }2 U. b4 _1 }gid_t gid; : }8 X: n1 B+ o" T" n
    char *dir, *shell; 5 Z; p9 i, n6 ]9 A: _& [
    char *user=NULL; & f& C* \2 I7 s5 F& E
    char *cmd=NULL; ; Z: F% T5 x$ c
    ! Z6 f- K! ^. k7 `6 p: N. w: l
    user="root"; ( j6 a0 e0 B7 ^3 }- N8 j* U; _, p0 G
    /*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, 9 y* z7 a2 P5 L9 Q* ]) b! \7 N
    登陆用户名应该从/etc/sysconfig/autologin中得到, ! y* z! Z, v+ S. e8 _
    程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/ * Z9 l& W8 {) n5 i# h" @' _3 K% P
    cmd="/usr/X11R6/bin/startx";
    9 s/ F. ~' C. B( a0 Z- p/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/ 5 g) J9 C: T3 g- u% n; g8 j; Q

    : ?6 |" Z* F0 }2 vpw = getpwnam(user);
      R% s$ Y" Q; Z8 ^+ S: X//getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。 % S7 ?9 P; z; t$ `. b
    if(pw) {
    / G9 L3 Q% z- Z1 Cuid=pw-&gt;pw_uid;
    7 M$ f+ h- e& L* J& _gid=pw-&gt;pw_gid; dir=strdup(pw-&gt;pw_dir); # w; z: V0 o+ r; [$ E. |& j/ c
    shell=strdup(pw-&gt;pw_shell); + L2 ~1 h6 i( I- p) G' u
    }
    ! N& E: q8 F& r) w//获得用户相关信息 % s0 @5 {; j0 [  L7 m7 t7 A9 j4 D6 e7 G
    else { ( P+ h' h* Q1 z3 M
    printf("ERROR: No such user %s!\n", user); 4 ?' N) O# m/ C- U% O( g# Z
    return 1;
    3 C) \1 r- j" m, w* g}
    ! H* O+ `! u* {& I* w, ^' f  O5 b, q( D: s
    chown("/dev/console", uid, gid);
    $ v3 n2 R9 M* U& s* T# X/ ?chown("/dev/tty", uid, gid); 3 b8 u6 B5 J. v( E* q7 l) F) w
    //为控制台和终端设置用户ID及组ID
    ; w; E/ d% T. Z! S* P0 T- @6 R& G) L; G. u. s+ j
    //下面是设置用户相关ID ' L2 {/ a- ]+ F. w: @  w; q& Q5 a
    setregid(gid, gid);
    $ E- U1 X: S0 c+ E2 @setegid(gid); - a& L  }5 @* L' |) S
    setgid(gid);
    # L. S' x' H3 g$ }6 k6 Ksetreuid(uid, uid); & |1 d) ~5 v( r8 G/ T9 l3 Y0 K
    seteuid(uid); % p0 k: ~" H7 o' R7 ?; Y' D
    setuid(uid); - D' ~. r$ R6 u

    8 |9 H7 H! H$ T. j6 ssetenv("HOME", dir, 1); - P; X! X$ }$ F( |
    setenv("SHELL", shell, 1);
    ; P% f4 D' V" w% Jsetenv("USER", user, 1); - {) g0 |+ M; u! \9 I
    setenv("LOGNAME", user, 1); % t2 t8 \  d+ u+ L% G0 V  S5 g6 m
    //设置用户相关环境变量 8 h& c4 @# V+ s7 b

    + w6 s% b: }  @( Y) \" ?# Pchdir(dir);
    & V; R- c4 p( q1 a8 [//切换到用户根目录
    # U# ~6 h$ K" W7 ]user=NULL;
    6 |# I" A. q* ~& A, s( X) v7 Q% A2 A1 A. e: k! A% z  M
    execvp(cmd, argv); " Z) j! h9 X2 R4 ~# L9 B
    /*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */ ) t$ [1 F* h- v8 F
    printf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno));
    8 |! b: l. q: Breturn 2; 8 V; h* ^" O& \' X
    } / O. D/ l; k& Z, K  z* Z1 z
    ; K; K" Q* u+ X, A" G
      ( B" V- z1 t7 f2 S6 K- x' W3 w
      D$ s  Z3 ]3 U6 E1 O+ t/ u
    9 X% C/ _' x. o; s" t6 }
    运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。
    $ Q% ?: z, X) C* u, \1 f
    6 C$ r% X' |" b7 b1 g如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下: ) k: b/ x3 L4 e/ ^: v

    7 i4 e' \% J# V3 M: O) l7 \. w) f) s8 n. G  {
    ......
    " M& F+ Q: b1 R4 r  H6 Y9 u0 |# 第一步:查看是否为自动登录 ' q" w) t( I1 J9 Y% g9 [' R' L; C
    if /usr/sbin/autologin; then
    ' h/ P- ^0 T) d2 |& ~exit 0
    & Y1 l* h3 l' P5 R% c  pfi - D: a/ n0 M# m: d7 ?) B
    //第二步 ......
    ! ^/ F2 f% U% J* k......
    . u; a6 U; O" Z. P5 b) w! i) m( y
      1 L; w5 \; [3 j$ q4 x7 s8 Z
    * f$ a, r& ]% j) t) Q' `

    $ j- v9 c* ?& H' h+ p& s% _即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。
    ( ~4 V8 b$ v/ P, U: g8 c6 n( f
    ) v  I5 h0 t6 ^2 `' b四、选择进入kde或者gnome,并自动启动X window应用程序
    ) T. \* o  T. m9 `2 J9 |* h' q/ n8 b  p+ K2 P8 A9 D5 K* A
    如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。  + c& }. F; w) g3 h  Y: K  l
    一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。  : }7 Y8 \7 a$ f2 L) n% \8 M+ D) v0 V

    ; n/ M: Q1 R  ]' X& _5 ?
      Q8 E8 Z* u! j( p/ w# B. [/ Yhttp://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-6-17 18:05 , Processed in 0.632229 second(s), 58 queries .

    回顶部