QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4208|回复: 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>5 d, r4 w2 R! J! {
    <>本文以redhat 8.0操作系统平台为背景,阐述如何实现启动级别为3时的自动登录,及自动运行相应程序,并简要介绍了如何在redhat 8.0下自动登录X window(系统启动级别为5),并自动运行指定的应用程序。 7 ^9 q$ h3 [! }* I" k+ }, f8 q0 g2 V
    [b:804aea7097]一、启动级别为3时自动登录的实现[/b:804aea7097] ' a( `8 U" G/ ?2 v

    ; w" J8 p( ~- P* r' p; k启动级别为3时自动登录的实现涉及两个软件包:mingetty-1.00-3.src.rpm软件包及util-linux-2.11r-10.src.rpm软件包。
    2 N1 T& R; I  {6 i& O) I
    . [. R# ?$ d1 {  j2 p9 P(1)mingetty-1.00-3.src.rpm软件包  
    $ N2 h; C7 v5 P8 l/ L* f7 n对于启动级别为3的自动登录的实现,仍然需要考察/etc/inittab脚本,  
    ( u7 f3 C3 H# V' [- ~) @) P3:123:respawn:/sbin/mingetty tty3
    6 l2 C* s: m9 ?& W0 b; E0 J% T8 l
    4 ~% }% O8 ]; P; x* ]
    ' b4 x1 i) X. C  . m4 {& S+ \7 z5 h/ n0 b4 V

    ) z2 c( Z9 `- g& V7 W7 K& Y# n. {8 `* e( C- W; B
    因此,如果想在启动级别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 K8 G" ]8 w! K% ]

    " o1 j8 u; O. ^# d. V* V) z/ M) }* D# a
    打开指定的tty(由参数指定);  , |/ o$ o' e  g$ o
    提示用户登录(login:);  
    $ H" X4 M) C3 |获得登录用户名;  ) a; c- l; [- K  W) L
    把用户登录名作为参数,调用/bin/login。  ) Z, j; \! p/ ^- y' A9 z, d, P2 s
    5 g9 y: H1 X* }
    我们所关心的部分实质上只有以下三行:
    7 R. y& |' L4 X& Y* v' S
    2 S+ {, I6 @0 z" e6 z$ q: @6 y& g6 C5 z6 k1 ]  G
    ... ... & d/ R. a8 r- f$ a% ~
    438 while ((logname = get_logname ()) == 0); //mingetty.c文件438行
    ! I% |% n/ E+ D8 h/ p8 V439 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL);
    6 l3 A; Z$ T4 s440 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]); % _, n4 J- h* k
    ... ...
    0 h4 s3 F+ L& ?+ g* `9 ]/ K$ g. U2 |& d; x; U9 _# B6 v
      5 d. T: K. P1 |$ r- Y4 |
    5 w( x$ m/ b4 r- _6 j* Z
    第一行的功能是输出login提示,并获得用户输入的登录用户名,登录用户名由logname返回。因此,可作如下修改
    , ^) h8 I. ^  s  c& e  F, y. @4 `0 v: c9 m  z

    & T9 a& }, \' t% z( A3 ^... ...
    8 S5 W/ q% G: V438 // while ((logname = get_logname ()) == 0); //注释掉本行,不再提示login: 6 F6 D! L/ G: t
    439 logname = "root"; //添加本行代码
    # Z6 V0 V- _) W8 Q1 ~: v, `9 H440 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL);
    - p5 B/ ~8 o/ t( ^441 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]); 2 Y- s6 P9 q! V+ Q1 f: G
    ... ... : T- s9 O( b9 K+ e9 F$ D
      t$ e& }3 P+ R! ?" F
      , I1 {% k: n3 s" d
    . u5 f# [) o! q- z" N6 [" I7 D
    注意,这里假定用户以超级用户身份登录。 % k2 Q  D2 [7 C+ F( K. X0 N

    2 o7 \$ f  j1 ~  a第二行以用户登录名为参数,调用/bin/login程序,进一步实现登录。因此,要想实现自动登录,还应该了解/bin/login的功能,必要时还应修改其源代码。   C/ H5 d3 R- m, m
      O! Y5 i- q; b! S6 N5 `3 ^
    第三行为出错处理。
    3 \0 m3 M( d  _( S4 p7 I5 ~. i  b# @7 H3 h1 @2 M
    (2)util-linux-2.11r-10.src.rpm软件包  ) c6 w$ K: A. e' 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要实现的功能,并对相应部分作必要的修改。
    4 {) R0 [5 U5 V- m8 L+ b- J+ K
    Login程序主要可以分为以下几个主要部分:
    ; U1 |  ~. [* p/ E0 _6 j6 F
    , O1 _) G8 Z/ _, h- a1.Login首先检查登录者是否为超级用户,如果不是超级用户,并且存在/etc/nologin文件,则输出该文件内容,并中止登录过程;主要由checknologin()实现;  8 @; i: h& H" V6 K
    2.如果登录用户是超级用户,那么login必须在/etc/securetty/中指定的tty列表中实现登录,否则将导致登录失败。同样可以不指定/etc/securetty文件,此时,超级用户可以在任何tty上登录。  
    5 c- _* }8 {3 P( V3 R3.经过前两步测试后,login接下来将提示输入登录密码(由getpass()调用完成,有兴趣的读者可参考其手册页面),并进行验证,如果密码不对,则提示重新登录。  
    & p# ?; Q$ @$ K0 O& k4.顺利经过密码验证后,login还将检查是否存在.hushlogin文件,如果该文件存在,则执行一次"quiet"登录(所谓的quiet登录指的是,登录时不再提示邮件mail,不再显示最后一次登录时间,不输出任何消息。启动级别为3时,正常情况下输出这些信息)  
    ( {$ e2 r  Z( v0 ], M8 b5.login接下来设置登录tty的用户ID和组ID,并设置相应的环境变量,包括HOME、PATH、SHELL、TERM、LOGNAME等。对于普通用户来说,PATH缺省被设置成/usr/local/bin: /bin/usr/bin:;对于超级用户来说,PATH被设置成/sbin: /bin: /usr/sbin: /usr/bin:  
    0 ^9 I9 s( C3 z! v+ l" S+ z6.login的最后一步是为用户启动shell。如果在/etc/passwd中没有为用户指定shell,那么将使用/bin/sh,如果在/etc/passwd中没有给出当前工作目录,则使用"/"。  
    2 o) D6 C3 v  J6 Z# \' ?$ [至此,一个完整的登录过程就结束了。 : i" |; I. ~9 X3 X- S
    ) ]1 a1 E0 q- U' J* P% w+ T
    从以上对login源程序分析过程中可发现,如果要实现自动登录,应该在第三步做文章,设法绕过提示输入密码以及对密码进行验证这一过程。实际上很简单,login源程序对是否要求输入密码设置了一个开关控制passwd_req,缺省情况下,其值为1(passwd_req = 1),即要求输入密码进行身份验证。把该行代码改为(passwd_req = 0)后,问题就解决了。即对源文件作如下修改即可: 1 X7 k, g# U8 z4 I5 q9 l( e7 a& Y

    9 J5 L$ S6 r+ o% s% j; W" |7 m, `$ Q
    ... ...
    # R+ x3 i% P2 |6 B. p1 `) }402 fflag = hflag = pflag = 0; //login.c文件402行 ' U  {( X" l: O  v* q* N
    403 //passwd_req = 1   //缺省时,要求进行密码验证,注释掉本行 , i+ p% M1 ^$ @  k9 j7 c
    404 passwd_req = 0 //添加本行
    ' u& l6 U/ \, \5 y... ... ; y: O/ q+ p6 k! w; r
    , o: d' a# q. h5 j( D4 M# X' G& \3 i+ z
      . l) G2 ~+ e3 c
    . t5 h7 V( s7 z% M* b" r/ ]/ n
    修改后,可以直接使用util-linux-2.11r-10.src.rpm提供的Makefile进行重新编译,也可以自己对其编译:
    . F2 @7 e& D3 \3 X. t3 y
    7 `: |/ \; a: i+ @; j( b7 n& k0 n
    , M9 p" W5 i. ^; r% }6 bgcc -o login login.c setproctitle.c checktty.c xstrncpy.c -Wall -lcrypt注意包含后面的编译选项-lcrypt,否则会出问题。
    , \8 M4 T; o- c
    ! d! c% H* |6 g+ L
    9 A7 c8 y0 q3 C有了新版的mingetty及login后,拷贝mingetty到/sbin/目录,拷贝login到/bin目录,并将/etc/inittab中的启动级别设置为3,再重新引导系统即可(读者可以自己写一个脚本实现上述过程)。
    # A! r/ h$ _2 i% e  R/ _! o# j9 S7 r7 b; q
    如果读者对mingetty或login代码的其他部分感兴趣,可以反复修改login.c或mingetty.c的源代码,测试一下代码的功能,这里要注意的是,在拷贝新版mingetty和login之前,一定要把原来的mingetty和login备份,同时还要准备系统引导盘(有系统安装盘亦可,这样读者有机会键入linux rescue),在测试新版程序前更应如此,如果对代码修改稍有不当,系统将不能正常启动。 % c1 w; N+ }: L
    $ u# G5 u# p1 C6 M$ B! Z; j& l
    如果不想再作进一步的代码测试,只是按本文给出的方法进行代码修改,在系统启动上不会出现什么问题。 ) p# S" m. J4 _9 u; |0 B
      n/ t# J' k" h  {; T) O
    [b:804aea7097]二、自动登录后,自动运行特定的应用程序[/b:804aea7097] 9 O. v9 r# k9 ^; q6 I1 S% f
    " c$ j# _; X8 w" {1 E7 I
    在实现了启动级别3时的自动登录后,自动运行应用程序非常简单,把应用程序添加在/etc/rc.d/rc.local脚本中既可。(读者可以尝试一下把startx加入脚本中,看一看效果如何。在某种意义上,又增加了一种自动登录X window的方法)
    2 f# @/ f" `' g3 L- @" f6 E* X& d  p# e+ l& o6 b
    [b:804aea7097]三、对自动登录X window(系统启动级别为5),并自动运行指定的应用程序的补充[/b:804aea7097]
    & v, Q: t5 n# v0 @! _
    2 V4 u" ~7 Q0 o+ N' _% {1 I在"如何实现自动登录linux"中,主要以redhat 7.2平台为背景进行阐述的,其中的自动登录部分可以直接用于redhat 8.0中,不需要任何修改。
    7 p. ]. B7 u! ^% n- ]0 B- Q! [3 ^" t# _7 Z8 f1 S
    但是,登录后自动运行应用程序的接口在redhat 8.0中有所不同,主要是登录gnome后,自动运行应用程序的接口有所改变:首先点击面板上的GNOME帮助(那个红色的小帽子),然后选择/其它/首选项/Sessions,在Session对话框的启动程序属性页中添加要启动的程序即可。 * W' V& w$ _& m- S) N
    " n. I* N+ ~! L& Q6 P& ]- |
    对于登录kde后,自动运行程序的接口没有改变。
    & ?) b1 ?6 A# j- b$ e& u4 {
    1 z; @) E1 ~2 o! |" y4 e3 K  h[b:804aea7097]四、结论[/b:804aea7097]   @4 y# p# G# O6 l

    ) k% U4 x. G$ |0 t6 z本文同"如何实现自动登录linux"一文,基本上解决了如何实现自动登录Linux,并自动运行相应应用程序的问题。对于两个最常见的启动级别(3、5),都给出了各自的方法。 8 T, F5 X$ \) W+ ^0 N" r6 w

    4 m( q' V$ A% ?7 R$ I1 H在系统初始化到mingetty及login这一阶段,内核实际上已经完成了引导过程,已经到了系统初始化的最高阶段,与内核没什么关系了。此时,主要是/sbin/init根据/etc/inittab的内容而相机行事。读者可通过(man 8 init)或者(man 5 inittab)了解更多东西。 # t: Z/ v  L. x4 t; C$ a
    0 O9 T- `1 e7 }
    在对文中提到的软件包修改时,请遵守GNU General Public License(GPL)相关标准,另外,替换login通常被视为黑客行为,应当谨慎行事。   t+ R* p7 h/ e9 v+ W1 c! ?

    . j% d. R. k2 ?5 q
    2 \1 R2 j$ R0 j/ r, Y! T1 `0 [$ X
    4 x; t% R5 T& W! P! m: P3 Z+ j8 P[b:804aea7097]参考文献[/b:804aea7097]
    % Q$ d4 O* z) U& C9 J, f
    ( s3 V6 q: t0 z3 y' }* c" l0 ?! e
    + `* v5 o% V( u3 o' Q% l1.login手册页面  4 p* u6 g# c8 M) U7 z  p! R1 \+ t
    2.mingetty-1.00-3.src.rpm,在redhat 8.0的发行版本的源代码中,包含该软件包;  
    , R: R/ z) l4 i* S$ \3.util-linux-2.11r-10.src.rpm,  - ], T' q9 \/ Q. k2 Q" Q& _) u* o

    6 w3 o+ A* m8 P# c: o可在http://rpmfind.net/linux/RPM/redhat/8.0/i386/util-linux-2.11r-10.i386.html处下载,注意下载源代码包(..src.rpm) 5 Z7 o% H0 ]) |- \

    : k' L9 x1 [( g9 M. F7 W5 W[b:804aea7097]关于作者[/b:804aea7097]  
    ' ^5 o* b5 J' }: t: K3 R3 x, ^, L: D1 q2 B, L5 u( Y# G" `
    郑彦兴,男,现攻读国防科大计算机学院博士学位。您可以通过电子邮件 mlinux@163.com和他联系
    6 J: a% A. R6 K+ h  \# ]9 X/ R2 b% L. H1 X4 s
    </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) 9 o# x5 \, G7 u3 ~% s9 l

    ! N+ K- c' Z8 @' f; n7 I+ h机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。
    2 @" ?% R$ n0 j. u5 @' V! l, e一、linux启动的最后阶段的工作
    * R4 Y9 n8 @4 X7 C0 A+ M
    $ d7 i' k, _* N" X- mlinux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有: - s" a4 N0 A3 g6 T3 E
    , Z0 A$ ~* J) d7 q/ k. J1 z& O
    运行xdm启动X window;  ( [/ ]! R% {5 L
    运行gdm,进入gnome桌面环境;  
    + }( z5 ^5 ^" i运行kdm进入kde桌面环境;  
    0 y+ |* p, `1 p# y4 Z+ k) g自动登录进入linux;  
    ! B6 n. v0 p  F. G5 Wprefdm脚本框架大致如下: 1 x- s. k3 [( g$ v0 m- N2 i# }

    8 Q+ f. j  W4 H; A#!/bin/sh
    ; b# o: [: z7 W3 l7 w6 jPATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    5 r! J1 ~% F; V, z4 |* B5 P. /etc/profile.d/lang.sh
    4 T9 W  w/ p* s# U, D1 E% T# 第一步:查看是否为自动登录
      s  \( J( |: b/ Fif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then / V; r( W+ X1 W* Z; q. `+ |  q
    if /usr/sbin/autologin; then + _" w- M' c% T9 M( [1 W
    exit 0
    # M6 \4 W1 O" Ffi & [1 F& |: F, P( f- G' f
    fi
    , Y. O7 ^$ C/ P2 ^: I( f+ z
    3 X* R/ C" Y6 Z* m: r9 e# 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式 5 b: k8 d+ k$ Q) A8 ]; Q/ p7 W* |
    ......
    . {( |8 O4 F& |1 i1 `! Z3 S# 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。
    $ ?" o' ^9 m, F0 \...... ( w2 q5 {# z* a( O' V4 S1 D

    ( _! \4 X- G- j  O$ o5 J/ ?  
    $ `: X0 {6 m3 T" |9 ?& U; p4 w7 n! t) c
    ( X* B+ S' k8 H$ A
    二、自动登录的实现(autologin的实现) 7 d! }5 g& N& u: v& J! Q1 o

    3 r8 E) y& A! ~/ z/ q7 O9 y在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。 ' p1 U- T. \8 z+ _& ]+ S  }

    1 {0 o% Z8 K/ y5 T自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。
    5 L2 R/ A0 A. k' n
    ! }$ W6 n6 c4 Z4 _+ O8 d8 VXinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。  
    * n& y9 n) g2 W4 W& ]9 Z5 G+ ~, u- S* D实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。  
    ) o" s: w* p' q: M3 V+ Bstartx脚本的最基本框架是:
    1 h' J% y2 T5 P0 _, N- l8 I+ h: c' X& ~
    a、 寻找.xinitrc,如果没有则使用xinitrc;
    . b$ N$ {+ j3 W, x- eb、 寻找.xserverrc,如果没有则使用xserverrc; - q4 X3 i" B! ^8 k$ r9 U$ C
    c、 根据找到的脚本确定xinit的参数;
    * E3 r% V2 W$ E! B# b: ^
    4 d) q- a9 r& M8 r' n4 z9 R. ]. [由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录: # a" f, H; G& e$ Y

    * S' k' i. _, t- o) L! i1 C! u) N& C  b; E2 r& B4 E
    #!/bin/sh : [( G, R$ g) N
    PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    : c7 a* L- n+ Q' T4 M6 c5 J  D. /etc/profile.d/lang.sh ) L1 P, A% K5 _! \, o0 T7 [
    # 第一步:查看是否为自动登录
    % x9 D4 g+ `+ T7 U) ]9 v5 p. \#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then " U! j% D) j  @3 g, S6 P# H7 ?' I
    #注释掉上边的条件测试,直接运行startx , q. G6 C! t' ]/ c  W9 A
    if /usr/X11R6/bin/startx; then ' s+ D# ^$ _9 F' f* ^* M
    exit 0
    $ y. Z7 g$ y8 t/ W* Nfi 6 v& B5 C- A2 s2 l
    #fi
    . q9 n- V3 H: N% B% D+ H% \; A+ ~# ]" l, l7 j( n, ?. w. ^2 B$ z
      
    : p" H& ]: s' T3 d  ^9 Y
    3 S3 ?, g9 V5 x" `' D
    4 p7 O: X8 Z, V7 Y" h" i6 G1 H) O$ k+ d当然,应确保/etc/inittab中的启动级别为5。 & B/ x, n2 N, B! D, a

    - }' B3 I# \" l& w% o( R重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。 . j$ R; j6 [2 l' C1 ~5 V* S+ ~/ e
    * f7 K& I, J# F# P% k. _, H$ v0 h- ?) ]8 N
    三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。 ) j- E$ E% V! @$ Y- |

    ' Q8 `1 s7 b$ K# t* K* {观察原来/etc/X11/prefdm脚本的自动登录部分: ; [7 i0 P& T5 N! q# A( k9 U4 R- f! O( b
    . S. a! G5 O- _  q' D

    & h4 A3 G$ B2 {  e! L8 t6 K...... 2 P' }8 f. |% B8 z0 ~- Z. m
    # 第一步:查看是否为自动登录 5 d2 l3 B8 }' i7 o/ m, s  j2 J
    if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then & s7 @0 d4 U: I: g7 K) L
    if /usr/sbin/autologin; then 4 _! J3 g# U4 F: i
    exit 0 # g5 |6 |6 w0 i+ a
    fi * ?* [- q' T& u2 t3 w
    fi 1 y# Q% }& p0 B# n. i! l9 k3 f4 b/ c8 b
    ......
    $ G& h/ W$ p) K4 q2 P4 p
    6 a/ e* W* b2 `# D: E; }4 B  
    0 P1 T  @0 y2 T/ Z! W3 e
    ( Q. j& z4 B" R, H8 A
    , u$ I3 l6 _9 C. M6 M! M# u% \不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。 * h9 c5 d7 a1 `& t3 O
    2 s+ n' \# ?. \: `9 u0 v
    1、/etc/sysconfig/autologin配置文件的实现:
    - x( N; c# @* e: _! k1 y' u1 d' o2 f
    ; A) @6 A: h/ J% E) W) z" V# x
    #config for autologin . i: b# o9 g* v+ ~' Z1 ?/ B  Y! O0 l) s
    USER=root ) p- ~7 N6 C, M6 U# L
    EXEC=/usr/X11R6/bin/startx
    3 t' y) Q: d! _, P说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。 ( X! s( D, g+ |5 O" C4 D

      ~& f; a$ ~2 }) s& }* h/ _    v" b) Z6 E' F) R3 V- w+ p
    6 h5 \6 Q7 B6 V! S2 O* b

    0 Q5 o1 E7 _! H2、/usr/sbin/autologin可执行文件的实现:
    2 r" Y' e1 \' T1 w7 ]
    2 P. |. s3 q; B1 y( f+ V! M" Y
    + ^5 x- Q# t& s# S4 @/*********************
    5 i1 \, n8 V% D( \7 d****  autologin.c  **** : s" l: [: `2 K( I& @
    *********************/ 4 E5 m2 r& [! p% P
    #include &lt;stdio.h&gt;
    6 d+ X2 o: j4 q( K#include &lt;unistd.h&gt; - s4 z8 o* g! u3 \0 e/ a4 q% x7 R
    #include &lt;string.h&gt; 8 M4 _$ k8 y! ?- z. [7 E
    #include &lt;errno.h&gt;
    ' ]! g  Q, @7 q/ \#include &lt;sys/types.h&gt;
    7 x7 |, d/ Q$ Q#include &lt;sys/stat.h&gt; 9 d" D7 e7 ]5 f6 U
    #include &lt;pwd.h&gt;
      s( I6 S" ?/ E9 H& [7 d  @  f: @" f- U) A) F" m8 M! W
    int main(int argc, char **argv)
    + S8 @3 o" t. e% U/ [0 F{
    6 [5 U, C' w3 o, p+ \struct stat st;
      z5 z+ v" w6 h6 i9 K1 jFILE *f;
    # z% Q9 U" l& y8 W2 achar *cfg; $ B! `# Z; F& B0 G
    struct passwd *pw;
    $ \% C: B! i5 i4 y- uuid_t uid;
    ! u7 x- d4 F. q# X3 Fgid_t gid; % H2 F" r; J5 d
    char *dir, *shell; 1 y5 n5 T) P: n: z8 K$ K
    char *user=NULL; 5 y- w/ u$ _+ [6 e9 \+ E; B% w
    char *cmd=NULL;
    - ^7 h( V1 M1 j7 \1 F
    " s* r! b# R; ^5 quser="root"; ) z+ }; O9 Z1 ^" u7 T1 v' n
    /*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, " w: r, v. O' C3 N$ S4 Q2 G
    登陆用户名应该从/etc/sysconfig/autologin中得到, ; l1 E; d: z& F8 G0 K" a
    程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/ ! b- T, [: W8 E
    cmd="/usr/X11R6/bin/startx";
    1 c' {8 v9 B0 f; b" m; I; F: {9 x  c/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/ 9 Q3 B+ G- w$ a. H2 R

    : T# d! V" ?3 B( L- J% Wpw = getpwnam(user);
    * j2 m# P: L- `3 H, \# ?//getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。 5 ~" d+ Z( i# @& O1 b
    if(pw) {
    : X& X3 f' W4 ^& V( H6 b; `" Wuid=pw-&gt;pw_uid; 5 j  \, O/ B+ b
    gid=pw-&gt;pw_gid; dir=strdup(pw-&gt;pw_dir);
    # B4 I& A' C8 K; a: W& Jshell=strdup(pw-&gt;pw_shell);
    6 A1 ?' ?1 n& M; Y$ M9 d0 n}   A& O4 G. l3 {: M- `
    //获得用户相关信息
    2 P' B& ~' s6 X, ^& V0 ]' J7 R! q+ y else { 5 s. y( _  o$ U9 x
    printf("ERROR: No such user %s!\n", user);   q% z% t: b8 O( d
    return 1; , f9 B: ]3 t) d7 M
    }
    $ s4 G/ W/ j- Y& V' Q- D7 ]1 u' i, D( o8 e
    chown("/dev/console", uid, gid); ! E  \% t+ J' S# c; x+ L
    chown("/dev/tty", uid, gid);
    . ~0 c2 N# z! ~( Z9 c" p4 ~9 ?5 I//为控制台和终端设置用户ID及组ID * S/ I! W2 n# _: C3 O

    3 g) a" ^" E: W2 D" C1 e//下面是设置用户相关ID
    / o; n, G8 {, v9 l7 p+ Gsetregid(gid, gid); 7 x* s% T& M8 w/ w
    setegid(gid);
    4 Z) I' k4 g5 v/ q7 qsetgid(gid); 6 v+ t, W8 P$ y. U# J+ G( v& a2 t7 K
    setreuid(uid, uid);
    ) [" t8 Y+ j9 Sseteuid(uid); - f  v6 p# h" `$ u
    setuid(uid); 9 u. Z5 Y1 ~( ~& }

    $ Y, u! w# M: a" \setenv("HOME", dir, 1);
    ' X8 J( S! T6 `# i7 isetenv("SHELL", shell, 1);
    * ?5 d2 K- N! O& M7 k6 |7 z" Usetenv("USER", user, 1); 7 w1 ]8 G% A4 u  c8 m% X- `
    setenv("LOGNAME", user, 1);
    9 u2 W4 G3 W" Y- y+ @& p//设置用户相关环境变量
    & B* E/ Z+ [; g% s6 Z1 d+ ]5 W
    $ |. _  e9 u6 O+ z; m8 G9 dchdir(dir);
    4 |6 X( r5 R' |2 A//切换到用户根目录 $ l& m3 w) s+ I/ K
    user=NULL;
    * S7 a5 P' H9 q1 v$ P
    , f6 B+ ]7 O4 F; A$ I; v- Lexecvp(cmd, argv); 2 i: z+ j0 p2 t& R0 i& C
    /*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */
    $ p% |8 f* \" L0 l+ b. ^printf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno));
    . E! O+ f0 k8 e8 I4 h1 Lreturn 2;
    - P5 s1 u: _! n! i& J- v5 _} ) C: p1 G# t' ]+ A" q6 w

    6 }& S& h, Q* c; z7 k5 J9 a  
    4 K0 ?6 }' `& _
    ! W& N3 r3 a4 W4 G; @% n. E4 A8 z, K/ L7 T9 t; }
    运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。
    3 S% H" e" V1 U
    # ~( V* X! X6 y9 _1 k6 Z! J如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下:
    1 F- A9 C& R* _" \6 [1 N4 ]$ a: r, M. G
    : _9 n1 i% a$ \; L- a" _4 ^/ j
    ...... & U, o/ V( W/ g% w- S. r" j4 X
    # 第一步:查看是否为自动登录 # W9 K7 P9 ?- k) d
    if /usr/sbin/autologin; then
    & ?* v, c' g, ?exit 0 ; ?* `: ~8 P& R. K, F
    fi % L# f& T. M# _3 f$ d4 _- v6 M
    //第二步 ......
    9 K! r; O7 u) }, X8 l6 o; H...... , o" \5 ~# t" K5 g+ h

    2 ?3 h1 m0 O# o) I2 s  
    6 ~4 m* a+ N  l" L2 F( Q; h7 e1 B; I0 V; W; u

    1 x* G( Q8 q, I* p& U即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。
    + B8 R" p  g1 s& m+ O9 E# r3 Q( `2 @3 ?5 y$ n5 g+ K% M
    四、选择进入kde或者gnome,并自动启动X window应用程序
    1 b9 j4 n, h# m" r- D" }) s" m9 q- G0 k" p0 }1 p0 E+ T
    如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。  
    ( q' N- l5 p2 n一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。  , T6 l% x* X: D1 `
    ' V4 K# I- R- C- h( U

    ; G  C- [) Y( D$ f( C! V3 Ohttp://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-18 00:17 , Processed in 1.380661 second(s), 56 queries .

    回顶部