QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4243|回复: 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>
    ! Z) n: c3 d8 e- V; T) p+ [<>本文以redhat 8.0操作系统平台为背景,阐述如何实现启动级别为3时的自动登录,及自动运行相应程序,并简要介绍了如何在redhat 8.0下自动登录X window(系统启动级别为5),并自动运行指定的应用程序。
    ! S: D3 m' Z# ^* \, [  M( w[b:804aea7097]一、启动级别为3时自动登录的实现[/b:804aea7097] 9 t- `/ z8 ^0 }

    ; d' e  w, T/ D; m* n8 x启动级别为3时自动登录的实现涉及两个软件包:mingetty-1.00-3.src.rpm软件包及util-linux-2.11r-10.src.rpm软件包。 3 R2 x( x& n; S6 E
    7 ^8 i/ M3 q5 C; Q! c+ i9 d
    (1)mingetty-1.00-3.src.rpm软件包  6 ]4 ]+ A' ^0 r$ t: u) S
    对于启动级别为3的自动登录的实现,仍然需要考察/etc/inittab脚本,  5 F/ m$ y1 |5 \
    3:123:respawn:/sbin/mingetty tty3
    + h) |' o' x8 r$ W1 o; v
    + k  _& S( v& h" w$ n5 x0 u: \/ x9 r* l- {
      
    ! X9 i3 O$ J2 C) p+ j" W" n" c% y, e  M! A- U  k# Z& _1 z. t0 j5 k
    * h: }  D$ b$ g# I3 p- S8 d
    因此,如果想在启动级别3的情况下实现自动登录,必须要了解mingetty的功能,甚至要修改mingetty的代码。用命令rpm -qf /sbin/mingetty 可知redhat 8.0版本的mingetty包含在mingetty-1.00-3.src.rpm软件包中,下载该软件包,安装源代码,缺省情况下,代码会安装在/usr/src/redhat/下,我们关心的只是mingetty.c源文件。mingetty.c约有五百行代码,主要实现如下功能: 4 X' ]; ?& I5 ~# N9 ?/ z

    $ t( B: ~! m' h6 d+ s  G7 X, G; N0 O8 A, T, [1 N5 u. L! r2 J
    打开指定的tty(由参数指定);  2 R. h; B* O2 p) S' |' L0 [/ O: b( {
    提示用户登录(login:);  # D! H% I. W# E" u5 ?5 D1 R2 n  k
    获得登录用户名;    T) e5 H1 N$ ^
    把用户登录名作为参数,调用/bin/login。  ) Y8 j' c: [) D  s

    # L% r' j# [9 P. n: r% Z我们所关心的部分实质上只有以下三行: , S7 P1 t# ~0 q/ \
    + O% u3 s4 L  z2 e2 n  K3 L4 p9 X
    ) I0 z7 ]  t) K& B
    ... ...
    + S- o% m* n* ]8 u8 R1 K6 t7 R438 while ((logname = get_logname ()) == 0); //mingetty.c文件438行
    & ]) w4 i6 e) f" r3 T3 r439 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL);
    4 _; g* r0 w5 ]  f440 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]); 4 t: h1 Z" X$ a2 s
    ... ... 2 x/ e4 b6 t: v3 H+ x0 {. |

    ) y+ x" X- ?! j2 V  
    ; k. F/ I/ K% `% P1 ]
    ! u- w4 n$ o% S第一行的功能是输出login提示,并获得用户输入的登录用户名,登录用户名由logname返回。因此,可作如下修改 4 E  I0 M: C$ _8 @2 @7 t

    / }; E/ j% T6 c! G3 X( V( t& U$ i5 S) c+ }1 i/ f. B( q. C
    ... ... . q3 A) H2 I. U5 i8 V1 ~
    438 // while ((logname = get_logname ()) == 0); //注释掉本行,不再提示login:
    + }3 [: P0 D2 C( d$ {3 `439 logname = "root"; //添加本行代码 ( ?4 s0 F4 q) B" z4 b
    440 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); 3 k+ }% m) {$ c
    441 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]);   G4 H) ?6 U+ O9 H3 [; l: q- i
    ... ... 7 K) Z  S: G# q2 u2 s) M1 f7 z
    / P2 r7 E" k$ `; r+ g- A
      ; h) o4 l6 Z! ?7 u. C' e: l1 c

    : A( O& R8 P8 |1 ]注意,这里假定用户以超级用户身份登录。
    4 N0 _( p- V% f; S" L* h
    7 R/ R7 C" g* Q3 w( |第二行以用户登录名为参数,调用/bin/login程序,进一步实现登录。因此,要想实现自动登录,还应该了解/bin/login的功能,必要时还应修改其源代码。 " ~4 P& Y; E1 V) t. e8 K

    - u. x& n' z; m% M5 C; w第三行为出错处理。
    ; l: R8 J3 ^# h- w# H; J: M% g1 {1 z& \) Y5 w2 H
    (2)util-linux-2.11r-10.src.rpm软件包  $ T6 B5 \. f: |/ j: B1 N; c& O
    采用同样的方法,查看/bin/login所属软件包(redhad8.0版本的login包含在util-linux-2.11r-10.src.rpm软件包中),下载并安装util-linux-2.11r-10.src.rpm,login可执行文件有几个源文件编译而成,我们最关心的是login.c源文件(大约1500行的代码)。下面简要分析一下login要实现的功能,并对相应部分作必要的修改。
    % g  T3 s  W; J( }0 t& S. a  p
    * j/ X/ [$ b+ U7 `" @: _! j% O) D( OLogin程序主要可以分为以下几个主要部分: 0 O* l9 i: m( C+ [

      c. J  [. o* @7 U* N4 n/ q1 @1.Login首先检查登录者是否为超级用户,如果不是超级用户,并且存在/etc/nologin文件,则输出该文件内容,并中止登录过程;主要由checknologin()实现;  
    ; D! ?4 ?; k7 P) B# X* Q+ P( d, M2.如果登录用户是超级用户,那么login必须在/etc/securetty/中指定的tty列表中实现登录,否则将导致登录失败。同样可以不指定/etc/securetty文件,此时,超级用户可以在任何tty上登录。  
    : ~6 [& n$ W; m3.经过前两步测试后,login接下来将提示输入登录密码(由getpass()调用完成,有兴趣的读者可参考其手册页面),并进行验证,如果密码不对,则提示重新登录。  
    - s6 Y0 ~7 W) S- a8 E4.顺利经过密码验证后,login还将检查是否存在.hushlogin文件,如果该文件存在,则执行一次"quiet"登录(所谓的quiet登录指的是,登录时不再提示邮件mail,不再显示最后一次登录时间,不输出任何消息。启动级别为3时,正常情况下输出这些信息)  
    3 H! b* X8 e  f. D5.login接下来设置登录tty的用户ID和组ID,并设置相应的环境变量,包括HOME、PATH、SHELL、TERM、LOGNAME等。对于普通用户来说,PATH缺省被设置成/usr/local/bin: /bin/usr/bin:;对于超级用户来说,PATH被设置成/sbin: /bin: /usr/sbin: /usr/bin:  
    ( P" _. W* I' o5 m5 K& W; t! x; p6.login的最后一步是为用户启动shell。如果在/etc/passwd中没有为用户指定shell,那么将使用/bin/sh,如果在/etc/passwd中没有给出当前工作目录,则使用"/"。  
    1 q+ u: ~4 u& @* P. H$ O至此,一个完整的登录过程就结束了。 + c5 u+ {) z; e/ ?

    * f( v% X; w0 V3 h从以上对login源程序分析过程中可发现,如果要实现自动登录,应该在第三步做文章,设法绕过提示输入密码以及对密码进行验证这一过程。实际上很简单,login源程序对是否要求输入密码设置了一个开关控制passwd_req,缺省情况下,其值为1(passwd_req = 1),即要求输入密码进行身份验证。把该行代码改为(passwd_req = 0)后,问题就解决了。即对源文件作如下修改即可: 5 V) q+ p; Q: M; H8 U, t6 d

    * L) G4 D* b7 U; j" t/ ^
    + \+ w$ e& q6 U9 `/ U... ... # G) t5 ]7 U* `8 L
    402 fflag = hflag = pflag = 0; //login.c文件402行 " P8 E; u2 C" ^5 B  p  A
    403 //passwd_req = 1   //缺省时,要求进行密码验证,注释掉本行 6 s! L4 |: {: @$ W
    404 passwd_req = 0 //添加本行
    9 R$ [8 x3 B3 ~6 k2 w8 [8 s... ... ; B: U7 H/ q" K
    2 P6 _4 D- b/ M! k: g8 a
      - Q$ B, I% l' w+ i6 T& ~, ~# ]

    - B, q: s1 b9 Q修改后,可以直接使用util-linux-2.11r-10.src.rpm提供的Makefile进行重新编译,也可以自己对其编译:
    ) B, U' Y: L% l* E2 e7 y5 f+ I( L0 |9 ~1 @/ |  n: L- A
    : a' s1 ]% T! X+ n
    gcc -o login login.c setproctitle.c checktty.c xstrncpy.c -Wall -lcrypt注意包含后面的编译选项-lcrypt,否则会出问题。 9 d+ Q" s/ p, L, i

    % X; Y5 z/ V# H6 A* a( z
    5 u1 s) g0 v1 u, H7 k$ q, k4 k$ k有了新版的mingetty及login后,拷贝mingetty到/sbin/目录,拷贝login到/bin目录,并将/etc/inittab中的启动级别设置为3,再重新引导系统即可(读者可以自己写一个脚本实现上述过程)。
    ( v1 \7 y( o# s7 Y5 f# Y6 u* E) p+ f) f2 e' R3 @, I( z& E% ^
    如果读者对mingetty或login代码的其他部分感兴趣,可以反复修改login.c或mingetty.c的源代码,测试一下代码的功能,这里要注意的是,在拷贝新版mingetty和login之前,一定要把原来的mingetty和login备份,同时还要准备系统引导盘(有系统安装盘亦可,这样读者有机会键入linux rescue),在测试新版程序前更应如此,如果对代码修改稍有不当,系统将不能正常启动。 4 h; k  j+ W* z
    , R- V* ^# }+ V1 g
    如果不想再作进一步的代码测试,只是按本文给出的方法进行代码修改,在系统启动上不会出现什么问题。
    0 r; W# ?' {- \- V% R1 {6 _/ \7 A) H
    [b:804aea7097]二、自动登录后,自动运行特定的应用程序[/b:804aea7097] % O; T! p" i( ^9 h2 w# G
    ! \, Z% L" Z6 c5 }' y
    在实现了启动级别3时的自动登录后,自动运行应用程序非常简单,把应用程序添加在/etc/rc.d/rc.local脚本中既可。(读者可以尝试一下把startx加入脚本中,看一看效果如何。在某种意义上,又增加了一种自动登录X window的方法)
    9 d/ i& A, H! }" a! X2 E$ o$ k2 P/ [: C1 @
    [b:804aea7097]三、对自动登录X window(系统启动级别为5),并自动运行指定的应用程序的补充[/b:804aea7097]
    - i% q# a1 {" j, a5 n5 x5 U/ ^; {( o& u" u% O+ l5 I
    在"如何实现自动登录linux"中,主要以redhat 7.2平台为背景进行阐述的,其中的自动登录部分可以直接用于redhat 8.0中,不需要任何修改。
    , h$ H8 D4 R: q# J* e, I  l" j$ W
    . [- j4 D- O7 e& R2 n但是,登录后自动运行应用程序的接口在redhat 8.0中有所不同,主要是登录gnome后,自动运行应用程序的接口有所改变:首先点击面板上的GNOME帮助(那个红色的小帽子),然后选择/其它/首选项/Sessions,在Session对话框的启动程序属性页中添加要启动的程序即可。 1 D% [* l( F5 ?) h1 m
    , B) F5 Q% T3 y; R" l. p' A
    对于登录kde后,自动运行程序的接口没有改变。 * E$ k5 B- \& a1 x$ \+ u) d
    % [2 J3 T$ [- t  z, Y
    [b:804aea7097]四、结论[/b:804aea7097]
    ; F. C! B9 B# K2 W2 ]; @0 s( B$ Q  a8 G0 p
    本文同"如何实现自动登录linux"一文,基本上解决了如何实现自动登录Linux,并自动运行相应应用程序的问题。对于两个最常见的启动级别(3、5),都给出了各自的方法。
    * p3 S. s! X* p  ~$ {4 D& F/ _
    ; z8 f; D& |# z2 Z) v4 _; ]在系统初始化到mingetty及login这一阶段,内核实际上已经完成了引导过程,已经到了系统初始化的最高阶段,与内核没什么关系了。此时,主要是/sbin/init根据/etc/inittab的内容而相机行事。读者可通过(man 8 init)或者(man 5 inittab)了解更多东西。 % n  b. n( E7 O

    . e2 X! s5 G/ g( x$ T2 b4 t在对文中提到的软件包修改时,请遵守GNU General Public License(GPL)相关标准,另外,替换login通常被视为黑客行为,应当谨慎行事。 ! K; {( D) F  I& E/ U
    * b7 e6 N9 k5 S% b6 }! k

    6 ?% `- X0 d: n7 |
    6 o% B- H' l0 D( X, I[b:804aea7097]参考文献[/b:804aea7097]
    , a* S# U7 C" k' p. z5 b: A, h8 o, t% C7 a( y  i' g. ]

    : f+ S: T6 }$ t  H" I6 b8 y* |1.login手册页面  
    ! A) b  f& R. p2 z; t2.mingetty-1.00-3.src.rpm,在redhat 8.0的发行版本的源代码中,包含该软件包;  " j$ p3 b) a7 l! r: n. q
    3.util-linux-2.11r-10.src.rpm,  1 n! y6 q4 a" Y& D8 v8 B! q

    ) |& {4 w$ ?5 r' b8 K可在http://rpmfind.net/linux/RPM/redhat/8.0/i386/util-linux-2.11r-10.i386.html处下载,注意下载源代码包(..src.rpm) . `5 o5 A# t0 [! J4 O( k

    7 E' L; P  Z" P2 S" ~* a* d# `- _: T[b:804aea7097]关于作者[/b:804aea7097]    e. Q1 `+ A5 }, ]; H

    6 b- n  s* [2 w. O2 F郑彦兴,男,现攻读国防科大计算机学院博士学位。您可以通过电子邮件 mlinux@163.com和他联系( p. x( A8 D% n  z- p( i# U
    ! z8 H: G+ e( O) L, M( X4 |
    </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)
      v( k6 b& ~+ L% M
      Q) o3 a' @% {  \( i! c9 s机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。 $ C) I8 K# {5 S( c# h8 S. Z7 h. b
    一、linux启动的最后阶段的工作 5 z3 G9 }5 X& k6 b

    / \+ v2 z* y7 A/ Klinux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有: * F+ x2 j" J5 P6 m" \& G

    0 E5 u7 l! L. l' s1 H  E% x运行xdm启动X window;  3 a2 G% l: Z) c* x) `
    运行gdm,进入gnome桌面环境;  1 ?/ S6 a& l) ]9 |& U* n4 G
    运行kdm进入kde桌面环境;  
    4 f' y# z- y$ i9 w6 H* i4 C! O自动登录进入linux;  
    * ~# `* ~0 \$ a% y' c7 \1 i* Pprefdm脚本框架大致如下: ) y" Y% i' l1 C: b( L  F

    / w+ E, Z6 X8 Z0 Y#!/bin/sh   I: x/ D2 c8 h
    PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    3 v; p+ P% o' ^8 m. /etc/profile.d/lang.sh # Z5 K6 {1 R2 R$ P
    # 第一步:查看是否为自动登录 - A5 i% ?9 u1 b$ O
    if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then , W7 y8 A! \% _9 ^
    if /usr/sbin/autologin; then
    2 u3 R  m7 _, Mexit 0 . Y2 P$ I: T: M  j; h6 [( k3 Z
    fi
    9 B$ y( w/ z+ p8 T+ tfi
    + @: |" |+ j1 T- R
    2 E# o# z, k! P9 R# 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式 2 X! n( q2 [3 K2 q
    ...... 9 A1 K# Y, L+ i
    # 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。 2 A' P6 v/ o- j4 B; c) G
    ...... 8 e! J% D/ ~+ ]7 o- P; ?6 u
    5 Y' g$ h6 H6 G* l& p; }% E
      
    ( M8 @$ _$ L4 _$ c4 Y! F) V2 L  N# k+ b* [* [

    6 q( p+ d  V4 w$ R/ R3 s二、自动登录的实现(autologin的实现) 7 {8 |- f; D- U& V! I* Y9 t" m
    & F3 F: ?$ @. P
    在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。
    3 u; y6 }' f* Y* v0 q
    * @" y# ?# R6 J# S% c自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。
    ) c% @8 \7 X$ q8 ?3 ~+ N7 S! a  ?6 S8 s1 F& I+ @' p( I. G+ {
    Xinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。  / S& s, v: ]: s2 C
    实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。  
    / {" s! q" q9 _4 q2 s% V: fstartx脚本的最基本框架是:
    ) V  K, Q1 x$ T& `5 q; g& n8 w2 ^0 k! f
    a、 寻找.xinitrc,如果没有则使用xinitrc;
    6 B" C) G( \  L9 N# Y. Gb、 寻找.xserverrc,如果没有则使用xserverrc; + B" J. A1 X- e3 c4 m7 B
    c、 根据找到的脚本确定xinit的参数; 2 V( l+ U$ a+ }
    0 J6 Z+ K1 [( [! R( v4 h
    由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录: 1 i. i# m9 s. ^1 D0 s

    ) O1 W5 x& z+ l7 S! F0 |& p+ I2 K, t0 ^  q# Y1 G3 t
    #!/bin/sh
    5 P3 h3 }: [# fPATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin ; o& m5 o0 ]) Y6 ]) G
    . /etc/profile.d/lang.sh
      Z, f  F- c$ d# ]+ T# L; ~% E# 第一步:查看是否为自动登录
    " s( w; A% g/ c; c#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
    & K+ J+ I) X4 y+ [1 T8 f* _, R1 c#注释掉上边的条件测试,直接运行startx 8 P; z7 U- J. [' e
    if /usr/X11R6/bin/startx; then & V8 s4 D7 N8 S& O* T* [8 A# F
    exit 0
    / l# v, Y' {  }" G. }2 u! |fi 7 E8 m/ k  v( a; @+ g" v. B9 p
    #fi . W0 `' C% K$ A, q, ~

    - H6 I1 P7 s3 B& M: _  1 p6 m$ }$ v1 I/ B+ S# Q/ b
    : F" \8 K/ I- w# z7 J9 k

    ; k5 J. U, i, B2 p0 H/ w" I" Q当然,应确保/etc/inittab中的启动级别为5。 1 j' x5 C5 a* _6 p3 F
    $ F' f: t6 k2 R1 [
    重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。 4 ~7 U# W8 W( }

    2 J  N, H1 w# L  C三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。 / S8 \; X- O2 _: E

    1 l" j  o! e" {5 p- A观察原来/etc/X11/prefdm脚本的自动登录部分:
      D: I; y4 ]2 ^7 C* l) l4 z+ i) F' U9 H9 ^8 Q  u4 o! n

    ' P* |9 d, [2 H: H......
    * I' W1 U1 T  ?! r# 第一步:查看是否为自动登录 ) N/ d( y* {8 p) o
    if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
    * v/ w% d, ^4 w8 B( i5 m& H/ sif /usr/sbin/autologin; then
    3 Z5 w" z3 E  p6 Pexit 0 " M! x. a$ X5 `& I: j9 }+ s
    fi
    & `$ i$ b& x# H4 `% A+ ^fi 5 B5 V+ w3 @$ m) G) V8 o
    ...... 4 h$ o' U' d. C$ ^8 O
    1 E8 w$ A  p6 r3 {' [& K, J
      
      H5 i* e& g) P, H0 ~
    " D' T- j$ k: v! y0 Z8 X0 f
    : }( S/ p0 L4 C1 l6 c8 X不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。 $ Q, v, e3 x: Z. x1 p

    1 r. A6 n( }, G& n. r9 D* M1 l1、/etc/sysconfig/autologin配置文件的实现: * E! q; _9 \0 Y# b3 \
    $ u8 t8 {. |9 B* g  C; i

    : U+ O5 U* q; O  ~* v0 W#config for autologin   I, o1 f8 h7 C1 N/ J
    USER=root
    7 C1 Y# T0 b/ nEXEC=/usr/X11R6/bin/startx
      S1 D% v( h# y) e3 |' r说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。 & q) \$ v/ s6 Q# a, K, G

    4 ]- V1 u# S1 s$ ~& k2 X- B  
    : I: m8 O) u$ p' c' K2 e' x7 c8 @7 j3 o9 z  P4 [9 X) `
    8 v5 S, G# A3 n3 F' l  g
    2、/usr/sbin/autologin可执行文件的实现: # j: s8 H- _: f1 @/ Q
    ! f7 t- T! T- y" [' i' }0 q: ^* |
    ) s  N# H# Z" z. Q" O( o. T
    /*********************
    , h# o& w! t$ Y% ^****  autologin.c  **** % H' j  ]" Q+ ^
    *********************/
    ' o4 A* y% i6 m- K) e#include &lt;stdio.h&gt;
    9 I' f6 H/ r) \( T1 a0 q) e#include &lt;unistd.h&gt; 0 _5 Q, K& n' @6 d; z
    #include &lt;string.h&gt; ( z0 I6 L7 W" n: M5 C# S
    #include &lt;errno.h&gt;
    * w) M/ w% g; G5 R7 D9 K#include &lt;sys/types.h&gt;
    * f& O* r2 [  S" b  n: C( B* b#include &lt;sys/stat.h&gt; # }: l  N1 X  G: x
    #include &lt;pwd.h&gt; . g# d; S( p! M" d8 T# n
    3 Z6 S2 v' M; g& ]
    int main(int argc, char **argv)
    . N8 w. R. v6 x: b: B+ v{
    6 X% |! a4 c5 F7 v* |struct stat st; / _+ C2 F7 ]0 Q! A
    FILE *f; 0 ^9 R  O& y* b/ K. W
    char *cfg; , X4 l6 q5 R: T  G9 R! _7 U
    struct passwd *pw;
    0 ?# ?4 [7 f2 |. R  Auid_t uid;
    # b2 x4 O; [$ n) egid_t gid;
      \! w9 ]! b! x3 M, v/ U: J' ochar *dir, *shell; % a0 t/ O% a* I& I. q5 K: O
    char *user=NULL; , P+ f9 Y# N7 }+ ~$ a$ x) q
    char *cmd=NULL; + p3 _9 Z: B) b
    9 B/ l) `" D. g; M2 S
    user="root";
    : K& J/ n1 P2 A5 X5 R- f' E- t/*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, & g% N" ?0 f2 K) q. ^  x- t. H
    登陆用户名应该从/etc/sysconfig/autologin中得到, # C  R$ N9 r. z! H; n+ {! Y$ |
    程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/
    % ?& C) @- I2 L0 U2 _' ~* ccmd="/usr/X11R6/bin/startx"; 4 `0 T8 z  p; c2 l7 p$ y" ]
    /*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/
    + P' {- P# W8 v% J) g: o7 Q: p- f7 j) |  B8 [# J6 U# T
    pw = getpwnam(user); 7 V& O1 I/ H0 X
    //getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。 , U/ A$ l3 ?$ T6 z- ~6 G  B" E/ e" T
    if(pw) {
    + d/ l4 {4 s* i- uuid=pw-&gt;pw_uid;
    5 r) v& H0 ^3 bgid=pw-&gt;pw_gid; dir=strdup(pw-&gt;pw_dir); - l3 P) Q/ F0 z8 u
    shell=strdup(pw-&gt;pw_shell);
    & ^, Y* n7 f4 G: p( a- `} ' K0 c! U9 y. `
    //获得用户相关信息 9 b  ~8 L. V0 x
    else { * W9 W8 t! n% E/ F; \  I2 s9 ^4 o
    printf("ERROR: No such user %s!\n", user);
    1 e6 J% l% D1 Zreturn 1; 3 \- o- Y4 m+ L- x: x: s
    } 4 {1 g7 V$ [+ y

    % Y5 p, w0 ]( ]8 `1 B2 \* C9 e* rchown("/dev/console", uid, gid); * R% I. ]; h8 V6 W6 d" D3 k
    chown("/dev/tty", uid, gid);
    / Y6 x/ F$ X" y( m6 x# r$ l; [//为控制台和终端设置用户ID及组ID
    0 e) E9 l% d1 C
    3 D5 p" e) f9 M) P* i//下面是设置用户相关ID
    : i) s5 `! k5 r5 a1 ~* usetregid(gid, gid); ( Z& {0 V8 R( z1 ~+ h- T/ R% U6 R
    setegid(gid);
    4 a; O; }( |( d) u) b, S- {( d- I+ Osetgid(gid);
    6 m, L3 ~+ o, u+ Z7 d9 v/ Lsetreuid(uid, uid); 7 ^" L" ~9 ]1 s# o1 T% G
    seteuid(uid);
    8 T' W  |  L0 Y  f3 B. e" Q6 u# A+ Gsetuid(uid);
    2 f* J) W7 @" C7 v
    9 r& B* n5 D# L* d" r6 qsetenv("HOME", dir, 1);
    5 }/ }. X! W* t4 C2 W) [setenv("SHELL", shell, 1); , v7 ]4 {" A+ N, B0 V- A' T
    setenv("USER", user, 1);
    6 H7 ?# a+ A# p. dsetenv("LOGNAME", user, 1);
    : W' C3 h# [0 G1 ?  J- @% m//设置用户相关环境变量 ' t& X1 w$ Z/ L1 T

    ) A! x) x! O2 i$ N9 D+ z; Uchdir(dir); # ]2 O  D+ t0 V- t2 ?  r
    //切换到用户根目录 ; Q, w' U8 B1 F6 s) O9 e" U; ?( p
    user=NULL; # S& U4 b* F: ~  y1 w
    : l; w9 Z3 C1 k! g1 }8 n
    execvp(cmd, argv);
    9 p' l# C* A) S" o/*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */
    5 ~3 D4 g( P0 R5 [& V, nprintf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno));
    ( n6 ^& w2 U4 a6 u$ n) wreturn 2;
    : m7 K2 y  [4 A! L1 u2 M( `}
    2 V# {% |6 t* d$ h* w3 C3 ]- r
    $ \0 T; a' L% d8 u: ]  
    0 e4 `6 a7 X$ U) D; w
    & d, N6 |! G- h( Z; R- \+ C: n9 O% M5 F8 Y& o- w
    运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。
    " E( ~/ h% X$ ~1 J3 M" K. g) I. v8 T* D
    如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下:
    4 n6 ^" }) z6 A  I
    7 ~3 w& o# u' X/ K7 i' r) Q$ d: [7 e  H
    ......
    + x1 v! L+ @3 @6 B' s# 第一步:查看是否为自动登录
    5 u& {+ U2 b4 s6 ]9 x. q' Fif /usr/sbin/autologin; then , O7 {! X3 r4 P5 l, x* f' ?8 j; S
    exit 0
    - D8 q" V/ J  H3 ^fi
    , @- L! D( |$ B, O& l( y; Y. M2 m8 u//第二步 ...... * C3 D" m, @+ A8 u& L
    ......
    / |1 T2 C( u( y( ]0 @5 O
    1 W$ J: c9 z' k! C7 O) U  
    ' q6 d( R5 ~, I5 B6 l
    & {5 H- R& B* L' l" m* w5 P
    ) V2 g. Z5 k4 C/ t! C即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。
    0 {( a: d! F0 t" S- k2 p
    , |/ Q. N& i6 [$ s  L3 q6 h四、选择进入kde或者gnome,并自动启动X window应用程序
    ' p* ?" d: ]0 q( o2 `) U9 ^# J. r9 k5 s. c" x8 L: C" O0 y0 o. k
    如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。  
    ) k* x) t+ L; I8 E5 Q6 i9 U一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。  
    ' M5 e, Z+ R. v' G$ I1 \+ c; _4 a7 O9 r
    ) M4 L1 e& e4 S- j; [
    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, 2026-6-2 03:22 , Processed in 0.447320 second(s), 57 queries .

    回顶部