QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4244|回复: 1
打印 上一主题 下一主题

如何自动登录linux[转载]

[复制链接]
字体大小: 正常 放大

1253

主题

442

听众

-516

积分

复兴中华数学头子

  • TA的每日心情
    开心
    2011-9-26 17:31
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    自我介绍
    数学中国网站(www.madio.cn)是目前中国最大的数学建模交流社区

    邮箱绑定达人 优秀斑竹奖 发帖功臣 元老勋章 新人进步奖 原创写作奖 最具活力勋章 风雨历程奖

    群组越狱吧

    群组湖南工业大学数学建模同盟会

    群组四川农业大学数学建模协会

    群组重庆交通大学数学建模协会

    群组中国矿业大学数学建模协会

    跳转到指定楼层
    1#
    发表于 2004-9-27 14:26 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta |邮箱已经成功绑定
    <>如何自动登录linux[转载]</P>" L" O, }) a2 R* l% U& S; ?
    <>本文以redhat 8.0操作系统平台为背景,阐述如何实现启动级别为3时的自动登录,及自动运行相应程序,并简要介绍了如何在redhat 8.0下自动登录X window(系统启动级别为5),并自动运行指定的应用程序。 0 p; u* P" W6 y
    [b:804aea7097]一、启动级别为3时自动登录的实现[/b:804aea7097]
    2 j1 a: N8 a$ n) R$ p
    7 F$ L) ]& V! G+ D2 Q启动级别为3时自动登录的实现涉及两个软件包:mingetty-1.00-3.src.rpm软件包及util-linux-2.11r-10.src.rpm软件包。 ! M4 E" @/ j1 s
    1 o( U, \; R5 \" }9 q. d
    (1)mingetty-1.00-3.src.rpm软件包  
    0 t0 M* q5 V5 ?3 z2 o9 u4 h7 n5 q. c: L7 t对于启动级别为3的自动登录的实现,仍然需要考察/etc/inittab脚本,  ; ]8 ?* {- ]( E' t* C, c" h
    3:123:respawn:/sbin/mingetty tty3 , I8 O7 R+ o3 V, S: f

    & k  m2 l4 d2 v% t5 K. U; Q1 u  K% Z4 d& A9 v; ~& x5 ~
      3 T3 X" i1 s' ~
    ' y- }; [# z1 r! u6 p* w  @

    - d3 t2 G0 W; K: a0 d" J/ y  c0 m因此,如果想在启动级别3的情况下实现自动登录,必须要了解mingetty的功能,甚至要修改mingetty的代码。用命令rpm -qf /sbin/mingetty 可知redhat 8.0版本的mingetty包含在mingetty-1.00-3.src.rpm软件包中,下载该软件包,安装源代码,缺省情况下,代码会安装在/usr/src/redhat/下,我们关心的只是mingetty.c源文件。mingetty.c约有五百行代码,主要实现如下功能:
    ) P' Y' L9 m+ x) x: K7 x7 L4 L) K2 E2 A( t$ a9 m2 C, j

    , |9 s' g7 v2 L5 B7 Q) A/ M打开指定的tty(由参数指定);  4 C- a# @0 o, L  L$ \
    提示用户登录(login:);  
    0 j; p( D3 _! Z9 i获得登录用户名;  
    2 O' H+ r/ Q: K# s9 f/ X9 o0 H把用户登录名作为参数,调用/bin/login。  $ }+ \1 M1 ^5 H) h2 ?
    " m$ E9 z- R+ @4 D% b& i
    我们所关心的部分实质上只有以下三行:
    / `$ Q$ `8 \. i+ X- \( K, x* W; y6 v8 I& U
    5 s9 `3 p5 ~. J, A
    ... ...
    ' K  ~& R* B5 v438 while ((logname = get_logname ()) == 0); //mingetty.c文件438行
    ( Z8 N1 x: E6 N* G/ a2 L439 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); ' Q2 A+ ]2 \1 g% {6 V
    440 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]); % I0 |/ D+ [( Z5 i: I8 O# i
    ... ...
    # Z5 {+ B$ I$ X) T- M1 L3 z6 M& @* E" {) ^# t8 U
      
    + t+ [9 y4 t3 n9 u+ q9 O4 m& R# V# M0 h( q
    第一行的功能是输出login提示,并获得用户输入的登录用户名,登录用户名由logname返回。因此,可作如下修改
    ' [; u; Y; a7 H6 t% Q
    * ?9 _) l0 E$ h2 ]& ?
    4 ^, j! f7 k3 f1 q+ a0 U( L... ... % @$ C+ m' [7 Y! B8 A
    438 // while ((logname = get_logname ()) == 0); //注释掉本行,不再提示login: , n) `  H# Y; q9 [& b: W
    439 logname = "root"; //添加本行代码
    % S9 t9 f. @" L" j6 g440 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); # n. g+ O4 z7 U. A2 Y
    441 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]); ( I" C5 J# {7 t5 c+ L' M
    ... ...
    3 B4 Z" {% h; a0 W! F5 f& ~( @  u* `
      
    5 g; q  V8 c! B" I% r
    3 }) k4 E# N0 G. K4 z% }9 a注意,这里假定用户以超级用户身份登录。
    % ~. d& O3 P# n  f* h- F' b9 A
    , d4 `! s  k2 E0 l/ `. ^# Q第二行以用户登录名为参数,调用/bin/login程序,进一步实现登录。因此,要想实现自动登录,还应该了解/bin/login的功能,必要时还应修改其源代码。 2 w! ]1 C% @: k; u. n! _, R
      N1 _8 _' ]# U' [1 U
    第三行为出错处理。 ! J, a* P: R/ h  n0 @

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

      C$ U$ w. V4 h' K4 r
    ( }1 M2 a; N  {9 b2 B8 e... ...
    - }9 F4 _- Y# E402 fflag = hflag = pflag = 0; //login.c文件402行 4 T% ?" w$ q$ P. ?
    403 //passwd_req = 1   //缺省时,要求进行密码验证,注释掉本行 ; l1 J- c1 I* y; |/ V+ x! e
    404 passwd_req = 0 //添加本行
    + C! z* r6 n) {: H' h5 W... ...
    ! `. V) c9 I  h; G. |# G# R" P% z  w8 y: S
      
    / [7 T3 O6 s' F- ^+ C
    , I" t* r" g) L& s0 V! }修改后,可以直接使用util-linux-2.11r-10.src.rpm提供的Makefile进行重新编译,也可以自己对其编译:
    $ T9 H+ C! \6 \5 Z$ a3 _. O5 o, q
    - J& a8 w1 @( T
    3 t3 C. Z8 ]8 X- @7 j$ p- pgcc -o login login.c setproctitle.c checktty.c xstrncpy.c -Wall -lcrypt注意包含后面的编译选项-lcrypt,否则会出问题。
    $ x( y1 i* a4 D3 v! G
    3 c. a9 e, q- R
    $ z2 t- R* t+ }; q- O7 p7 c有了新版的mingetty及login后,拷贝mingetty到/sbin/目录,拷贝login到/bin目录,并将/etc/inittab中的启动级别设置为3,再重新引导系统即可(读者可以自己写一个脚本实现上述过程)。
    , C3 D! A  i6 d
    . O. N- ^! o' b3 m, ]如果读者对mingetty或login代码的其他部分感兴趣,可以反复修改login.c或mingetty.c的源代码,测试一下代码的功能,这里要注意的是,在拷贝新版mingetty和login之前,一定要把原来的mingetty和login备份,同时还要准备系统引导盘(有系统安装盘亦可,这样读者有机会键入linux rescue),在测试新版程序前更应如此,如果对代码修改稍有不当,系统将不能正常启动。
    ) X! p; c9 v5 [9 z6 G
    0 @$ P) [0 f9 _% I0 C如果不想再作进一步的代码测试,只是按本文给出的方法进行代码修改,在系统启动上不会出现什么问题。 : U( ~7 _# k& S: Z1 H
    3 u7 @$ D, |4 _$ J9 Y, r- D6 n
    [b:804aea7097]二、自动登录后,自动运行特定的应用程序[/b:804aea7097]
    1 |' g( f/ y4 \) T# ~
    # z; r$ k* l/ n. r/ J5 R* H在实现了启动级别3时的自动登录后,自动运行应用程序非常简单,把应用程序添加在/etc/rc.d/rc.local脚本中既可。(读者可以尝试一下把startx加入脚本中,看一看效果如何。在某种意义上,又增加了一种自动登录X window的方法)
    " H& y' R0 L( q, C. h( X, W
    " C. T9 S# k) K[b:804aea7097]三、对自动登录X window(系统启动级别为5),并自动运行指定的应用程序的补充[/b:804aea7097]
    3 F4 F% l) q; v6 C" R4 b
    / m4 R$ a, E7 u1 A1 J8 y在"如何实现自动登录linux"中,主要以redhat 7.2平台为背景进行阐述的,其中的自动登录部分可以直接用于redhat 8.0中,不需要任何修改。
    * m! z6 {, J0 E! x3 S+ J, c
    ! \$ @5 E' a. Q# \但是,登录后自动运行应用程序的接口在redhat 8.0中有所不同,主要是登录gnome后,自动运行应用程序的接口有所改变:首先点击面板上的GNOME帮助(那个红色的小帽子),然后选择/其它/首选项/Sessions,在Session对话框的启动程序属性页中添加要启动的程序即可。
    / k4 g% _% G: ~( l0 q$ ]; w+ @6 n$ m  I: B, J$ z! C
    对于登录kde后,自动运行程序的接口没有改变。 1 N6 V# H1 a# x* q. @+ a- S# L1 A

    ; n4 p5 C) T9 V; v' m[b:804aea7097]四、结论[/b:804aea7097]
    % R7 V6 L$ k5 U7 y0 P+ u* e5 d1 R1 _& d6 V/ w) D
    本文同"如何实现自动登录linux"一文,基本上解决了如何实现自动登录Linux,并自动运行相应应用程序的问题。对于两个最常见的启动级别(3、5),都给出了各自的方法。 ! _* T1 }9 @! b" w9 T1 J

    , Z4 r3 Z; P* }1 G# O, V/ q在系统初始化到mingetty及login这一阶段,内核实际上已经完成了引导过程,已经到了系统初始化的最高阶段,与内核没什么关系了。此时,主要是/sbin/init根据/etc/inittab的内容而相机行事。读者可通过(man 8 init)或者(man 5 inittab)了解更多东西。 - N. ?1 T0 s: g$ [+ i
    7 a5 e0 r% g$ z- k
    在对文中提到的软件包修改时,请遵守GNU General Public License(GPL)相关标准,另外,替换login通常被视为黑客行为,应当谨慎行事。
    : ~. I  y5 X7 n1 M7 {: l. E
    ( \$ d- k5 V% B" {, Q6 u3 J" S& H

    : Y% t$ p8 J' V1 [" t+ r8 w) `[b:804aea7097]参考文献[/b:804aea7097]
    4 I. H0 Y8 l+ ?8 E3 E' n
    : ]  }9 Q/ i4 Z! L
    6 I3 ~2 a" M3 H. q1.login手册页面  
    & h3 f+ `6 T1 U- ]0 U2.mingetty-1.00-3.src.rpm,在redhat 8.0的发行版本的源代码中,包含该软件包;  
    ! J' H; n" l3 _8 ]4 A6 o2 s3.util-linux-2.11r-10.src.rpm,  " P0 ^, q5 ]( k) Z1 T

    ' d0 R! H% e+ g5 N9 ]% a可在http://rpmfind.net/linux/RPM/redhat/8.0/i386/util-linux-2.11r-10.i386.html处下载,注意下载源代码包(..src.rpm)
    / U' R" C$ j6 u5 f) ]8 D7 h2 @  }# p* D. Z) h
    [b:804aea7097]关于作者[/b:804aea7097]  % w5 Y# `% d6 f3 e

    9 N- k0 x* \; `( a: C郑彦兴,男,现攻读国防科大计算机学院博士学位。您可以通过电子邮件 mlinux@163.com和他联系/ m4 r) ^5 u% ~, S( ?6 E

    4 d. ~2 _9 R& P4 j" B" E. r</P>
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    数学中国网站是以数学中国社区为主体的综合性学术社区,下分建模、编程、学术理论、工程应用等版块。从2003年11月建站以来一直致力于数学建模的普及和推广工作,目前已经发展成国内会员最多,资源最丰富,流量最大的数学建模网络平台。我们始终秉承服务大众的理念,坚持资源共享、共同进步的原则,努力营造出严肃、认真、务实、合作的学术氛围,为中国数学的发展做出应有的贡献。

    1253

    主题

    442

    听众

    -516

    积分

    复兴中华数学头子

  • TA的每日心情
    开心
    2011-9-26 17:31
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    自我介绍
    数学中国网站(www.madio.cn)是目前中国最大的数学建模交流社区

    邮箱绑定达人 优秀斑竹奖 发帖功臣 元老勋章 新人进步奖 原创写作奖 最具活力勋章 风雨历程奖

    群组越狱吧

    群组湖南工业大学数学建模同盟会

    群组四川农业大学数学建模协会

    群组重庆交通大学数学建模协会

    群组中国矿业大学数学建模协会

    如何实现自动登录Linux (Runlevel 5) ( v0 ^# n8 B! e9 v% B6 g
    5 I% K& h2 s0 J* ~5 e: @
    机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。 & W! S  A- L+ s2 V; |
    一、linux启动的最后阶段的工作
    ) O" M# G/ f( s; M
    , \( |. V/ S& p4 \" dlinux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有: 3 `: [8 W4 G4 \" t

    3 I/ Z: a$ v* n运行xdm启动X window;  5 f1 C7 R" j! P: N# p
    运行gdm,进入gnome桌面环境;  & `: C9 \% U8 ~7 @2 p
    运行kdm进入kde桌面环境;  6 a6 k. f7 B8 B8 I1 X
    自动登录进入linux;  * K0 M  [$ D  b( z
    prefdm脚本框架大致如下: ( O) Z4 \( @4 Z* ]

    5 F0 R$ {* P/ h, y, e' p; z% M#!/bin/sh
    ) Q+ _  ]4 D2 O  g6 S* y7 u% vPATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin ! l9 ~% O# a! N# b& M, g3 A% @+ ?2 d* E
    . /etc/profile.d/lang.sh : T  u; n/ V! _% D" `
    # 第一步:查看是否为自动登录
    0 X& N$ X* K% T. J& o1 m4 {4 Aif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then % A# T, s, s/ `  m/ R
    if /usr/sbin/autologin; then 4 u/ {0 J# d6 L7 e# M
    exit 0 * Z! _6 d* y2 X# \. v1 Y
    fi
    : I+ U; z' V2 N% ^* X% A, gfi
    . M+ f& C! S; p4 {( K+ f- S
    ! C! c! N4 R  ]# i4 E, \# 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式
    * ~: N- ~: h$ [4 u: c$ q$ }& D...... 8 k: O& Z8 @  r3 _) Y: |
    # 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。 . U+ o- n2 p- k; c2 s; Q- B: y, j
    ...... 4 \, @0 i8 U* L" {$ C
    1 ~- U" K; T4 {0 q4 P" o+ b
      , W$ c4 g1 \, Y8 J, D( \6 g

    8 F% ^" v2 ^3 `/ N! K" [0 d9 r0 D- P, i/ A2 _  Y# y
    二、自动登录的实现(autologin的实现) . X! A; O- E% X: }1 y  ]
    8 v5 D; r5 o' T) `  X* q
    在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。
    + Y6 Q9 Z* A( A; M5 x( @6 h+ L  k! e
    , X# n4 ~5 U0 K  [; `" @  P2 W自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。   [! ?/ f9 n3 F! L  p+ S" s
    # G2 _+ p. x' D1 {
    Xinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。  
    : y. \/ [8 m; L' |; O. f实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。  + V5 B; t7 S: H! w5 w
    startx脚本的最基本框架是: + m& {. e2 z' T+ m0 [

    ) k1 z" E" z: h& P# }. ]a、 寻找.xinitrc,如果没有则使用xinitrc;
      I2 x0 q; K' y5 B; s; k% @1 Jb、 寻找.xserverrc,如果没有则使用xserverrc; : M; C3 b* |* ]0 w' h; C
    c、 根据找到的脚本确定xinit的参数; 1 t% @9 ^) ?1 q$ ^
    ; `3 s# e! |1 b" ^9 ^' M
    由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录:   w* e+ P$ w' q" g" y
    & {0 b5 P6 }8 y) {; n  A. A

    $ d, j3 O/ [& i1 k: r#!/bin/sh + [$ L" `- [( B8 {& w
    PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin 0 z4 U6 J6 E' o0 x
    . /etc/profile.d/lang.sh " a4 g( n  o7 u+ @* z
    # 第一步:查看是否为自动登录
    " I% H- F' N" ^#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then ! z& B  U& G$ H* |7 i/ b  _$ h$ C
    #注释掉上边的条件测试,直接运行startx
    - a0 ^1 T9 f0 Dif /usr/X11R6/bin/startx; then 0 v) L" ?/ u3 S, o& v$ |
    exit 0 ! x8 t! D8 @) `  L& M' x
    fi ' m/ h! n; p% R, H4 V! k1 `
    #fi + K4 k# Q2 o( T, M8 R
    2 V" A, E  O; ~" t/ D: }$ _5 Z
      
    ' J7 b# A& T% K4 ^+ _% v9 ~/ v/ `6 ?8 h

    ' c# J- g, ]2 y当然,应确保/etc/inittab中的启动级别为5。 " C, {) ^1 \" ^+ ~9 U; N1 [
    6 e' C* z- o. ^1 ^" [- L2 |
    重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。
    5 n! m% ^; X1 ~, J! l
    * m1 f5 W$ ]6 u: f三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。 ! p' O# v' l& A) S  x5 ^1 H
    - E  P: i, ~9 g/ l7 n7 Q
    观察原来/etc/X11/prefdm脚本的自动登录部分: ) }2 d) I+ T' ]4 l4 d+ E% K* L

    ! }, _7 L- J* j' ]: V1 @1 O0 Z1 f: z% ~
    ......
    % `9 W! a+ ~) _) X6 P# 第一步:查看是否为自动登录
    * \5 _7 H+ Q# U4 r; aif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then 2 \8 X1 {5 j% q& Z8 n' p* z1 t
    if /usr/sbin/autologin; then + V/ U& A/ m! H! c0 i
    exit 0 0 i, b9 m% O$ m" {, a
    fi $ i) F3 M- A9 v: b: @
    fi
    - B3 |% A# R6 b......
    ! G! l4 s+ u: Z. E' W- l
    " \: G% L& }. e3 L. Z  6 m5 v# @2 j# ?5 V6 [( u# ^
    * E, I! Z9 _  o0 b" X

    % e: w  O& _, \. u) I: ~不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。 0 ~& X4 K) k6 B2 a! M

    ! w9 K# Q8 E/ P# c1、/etc/sysconfig/autologin配置文件的实现: 3 _( |6 |# o! D# u8 P# a  D

    & R: v4 h3 r+ P1 ]( F, ?- [
    - O) m1 Z# w; b2 ]% V6 G#config for autologin
    2 i0 w+ l/ ~' \. J( DUSER=root
    3 K; q3 R# z) L( L, v  X4 R) HEXEC=/usr/X11R6/bin/startx
    ' A; {. w# ?3 O5 }说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。 2 z6 `4 M/ T3 c/ y

    0 m9 B! f; X, F% }5 A  
    # g' _& D- ^, U' @5 a/ e. Y
    * n0 D6 C" v( [1 [- u' A# e
    3 z& ?% s) L" ?- s* i9 m) S2、/usr/sbin/autologin可执行文件的实现: - m4 a9 K' l8 g3 F
    8 l3 R: u7 O8 I. M% \

    & H4 ]( _; r+ ^3 g/********************* % o$ H- Y" f+ w# p+ Z0 z. i. j9 g
    ****  autologin.c  **** 2 j( S3 J* n, Y; |( r" o* U
    *********************/ . w: p2 l2 }! ]' L: b
    #include &lt;stdio.h&gt; 2 q/ _1 T7 I4 g  K) W
    #include &lt;unistd.h&gt;
    2 R& O" r- I" }$ v#include &lt;string.h&gt;
    # I6 Z8 ^% {' k2 f#include &lt;errno.h&gt; 0 N# L" G* l1 a7 C  F( V1 R, m# M
    #include &lt;sys/types.h&gt;
    1 P# x- B) V5 Q$ t9 |; D! }#include &lt;sys/stat.h&gt; . p8 q6 V) q9 K7 G) _6 S
    #include &lt;pwd.h&gt;
    ! n) T8 K! R: B& Q# c. O  t
    , u1 u2 C+ u- i# w: H3 Hint main(int argc, char **argv)
    8 r1 J1 J% q7 Q% s2 t* P, N0 @{ ) B! B; y7 R( a5 p6 ]
    struct stat st;
      m: I8 U8 X4 a4 Z8 D& P9 MFILE *f;
      v" k+ r) o; p1 I; Schar *cfg; $ M$ Q% @, [8 Z0 U
    struct passwd *pw; 5 m  O  @" T7 V4 {7 q+ o; T) V
    uid_t uid;
    + V3 N# o6 I' |% \' j  I# e" v' Dgid_t gid;
    ! k3 {! P, P1 w* d% dchar *dir, *shell;
    5 W2 ?0 R! j/ s. @  Z' achar *user=NULL; # J2 M, s7 v7 Z" U  Y: k
    char *cmd=NULL;
    9 f# D: X" {" S, a+ p: d* r5 D5 L3 X: p2 z. u5 i8 h2 k+ T4 u' F
    user="root"; ( I9 F5 `; U- h. _3 d4 _- b; z
    /*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, 8 J# R# U5 ^$ x4 _5 R4 _# ~5 o
    登陆用户名应该从/etc/sysconfig/autologin中得到, ' Z; M3 o  G2 J" c# O" c3 v# h
    程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/ . ]. m# c# {: B3 I, U
    cmd="/usr/X11R6/bin/startx"; / T! x$ O" c$ d- o2 |
    /*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/
    * s; U. R! u, V: c7 Y
    / l% @3 [, x2 Y. T1 X; rpw = getpwnam(user); % `* C- }& ^7 A! I: M( N
    //getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。 $ \$ g1 i9 j& t3 [/ C# z( i
    if(pw) { / v9 M4 M) b8 o: O
    uid=pw-&gt;pw_uid;
    1 b; t* t3 E% e7 f7 k. m2 z5 b1 Mgid=pw-&gt;pw_gid; dir=strdup(pw-&gt;pw_dir);
    4 z# @7 a8 u( ?4 _8 b3 qshell=strdup(pw-&gt;pw_shell);
    - R* t' ^; l1 `; d0 P# I# m7 ]} ! s) k9 j' T6 O8 D' L5 ~
    //获得用户相关信息
    ( \$ F$ S6 l+ G. g# y: L else { . f0 {( N- U5 i# j4 u5 L% ~# a
    printf("ERROR: No such user %s!\n", user); ( }' h3 C* R! E
    return 1;
    % L6 J2 P7 u; E* n* D} & x& s0 S2 a8 ?2 @8 C
    ; g6 b" H" L. F) A; `2 x( P5 `
    chown("/dev/console", uid, gid);
    + R2 q/ f9 E0 q" B6 f1 _chown("/dev/tty", uid, gid); " E! v. {. h+ M9 y* `: _7 Z
    //为控制台和终端设置用户ID及组ID
    ( E2 h+ `8 R( l5 Z
    0 B, r* C4 ^0 u6 j- [6 `//下面是设置用户相关ID
    9 f  T; O. l+ j3 D( A+ ~setregid(gid, gid); 3 d$ i4 W  ]+ {9 h; Y
    setegid(gid);
    , p( l$ y" ]$ M1 a( I  Bsetgid(gid);
    $ d7 ~1 }! n2 p" R: F! D* jsetreuid(uid, uid); & a7 @2 J% E6 H* ~) w* n( y: g
    seteuid(uid);
    * T: W7 q4 d3 K8 n& Psetuid(uid);
    . s( r) j6 i4 B9 k$ D, W
    * `5 P: }$ t% H* |5 Hsetenv("HOME", dir, 1); 1 @% J& f8 l; G1 z- Y- I
    setenv("SHELL", shell, 1);
    3 ?7 ~* _' W# \: ysetenv("USER", user, 1); + w; \  o! i# d) k1 _0 H" p* Q
    setenv("LOGNAME", user, 1); ) p& R, J0 Q% }3 {
    //设置用户相关环境变量 & h% r0 V) G0 |3 U

    ' S5 B; t7 S) O% T- r6 a7 kchdir(dir); $ g0 z5 M: \( U" F
    //切换到用户根目录
    ! u0 g1 V, C3 t: [/ z7 c9 S( Uuser=NULL; 9 M7 F. j+ P' F! U+ z

    ) ^) w2 x& y8 v9 d( b! |execvp(cmd, argv); ) i  v  X) k3 L
    /*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */ 3 w1 v" T; T: y2 s( X1 p4 B% \6 x
    printf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno));   a3 H7 C( O8 F
    return 2;
    % S- ]" k% p- L7 p8 [* w% R} $ @; I/ c$ [3 Y3 H! V# X! J( C

    . Y  H6 k. P7 K  G* R1 I" N) b  " K8 R1 [  I8 t& m1 |; Z" w4 K: E

    3 H* d, u. ?: l
    5 q7 T1 B. |; O- o8 `+ J运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。
    ; `) o" B9 |: Z
    9 ~' ?6 N4 C" O2 f; N, P如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下: 2 R" C  S# Y: ?: K

    ' x, v! S# M/ z5 \: f
    # ?. w- `" @  L5 n...... 8 b& D9 a" Z- v. j4 G3 w4 m+ v- w) S
    # 第一步:查看是否为自动登录 9 E7 t# ?# r% k1 g- m
    if /usr/sbin/autologin; then / l+ J- ]" o1 C1 R6 e
    exit 0 + \* ^" Q6 k& I
    fi 6 Q5 K, s" |# x  \
    //第二步 ......
    + I* E5 U% r# \0 s& ?& Z+ u...... , `# e) z! d. c- K

    & G, _; d. u8 J) W  
    ; B/ a% k2 \2 K" w% `) \0 {9 d& t
    , V' P' h$ e, c& {9 _- M
    ' X1 h8 }- x+ r) n7 b) K. K即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。 / A! J' K' K, |2 y# M3 K, \- z
    % R0 E4 L! k+ M
    四、选择进入kde或者gnome,并自动启动X window应用程序 , H9 z8 o% u6 M& s" s
    & Z, y4 c: j0 H
    如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。  . Q: D2 ?- t. m
    一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。  
    + D: O3 Z5 O) ~  }" `% v
    - k6 @- v0 T) V$ j
    ! [! X% V# H5 p7 khttp://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-2 04:15 , Processed in 0.370329 second(s), 56 queries .

    回顶部