QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3997|回复: 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>/ T* c" C( }8 z' ?( x
    <>本文以redhat 8.0操作系统平台为背景,阐述如何实现启动级别为3时的自动登录,及自动运行相应程序,并简要介绍了如何在redhat 8.0下自动登录X window(系统启动级别为5),并自动运行指定的应用程序。
    " {% {* E- z% d[b:804aea7097]一、启动级别为3时自动登录的实现[/b:804aea7097] : n  }& N. {" B. W- q- ~

    7 D4 T- x3 ~: g8 f3 j* k& F启动级别为3时自动登录的实现涉及两个软件包:mingetty-1.00-3.src.rpm软件包及util-linux-2.11r-10.src.rpm软件包。 7 Z& l% J( [- q: R1 g5 b6 w7 v

    - ~. T& {1 a' F(1)mingetty-1.00-3.src.rpm软件包  
    5 g5 n% \  L. t# b对于启动级别为3的自动登录的实现,仍然需要考察/etc/inittab脚本,  / f' U/ B* M8 P( \- e% \- }$ n9 I* T
    3:123:respawn:/sbin/mingetty tty3
      m, ]( d5 H( K3 f3 w6 [$ X' q9 I# |9 I0 c! ~

    % B. g! Q, w+ {& c% g  3 a# V; |! s& U0 C- I+ a4 E6 L& l
    ' ~- _7 e7 f! C& q' j; E
    - c9 S+ k0 P+ g) I
    因此,如果想在启动级别3的情况下实现自动登录,必须要了解mingetty的功能,甚至要修改mingetty的代码。用命令rpm -qf /sbin/mingetty 可知redhat 8.0版本的mingetty包含在mingetty-1.00-3.src.rpm软件包中,下载该软件包,安装源代码,缺省情况下,代码会安装在/usr/src/redhat/下,我们关心的只是mingetty.c源文件。mingetty.c约有五百行代码,主要实现如下功能: 6 e$ ^7 \$ I+ T9 L  H
    ( s) C. @& D+ P% H- O( s% T( j4 m) s
    * @$ ^  d3 x9 d( a- n1 K2 n' s
    打开指定的tty(由参数指定);  9 r% k! n% i9 q) t8 u7 Q! d: H
    提示用户登录(login:);  
    / N0 i/ V& R/ C. M! F- u获得登录用户名;  8 F# l  x& D, N2 I7 f1 `* f1 w4 E
    把用户登录名作为参数,调用/bin/login。  / m9 C+ p$ P* w2 z6 m6 w  a; B* w
    ! [8 Z9 \5 f: q4 o3 M; u
    我们所关心的部分实质上只有以下三行:
    ! Q2 ?* O- [* W) S) K
    ' O; o( I- r4 A. n$ y6 z1 `' p
    / F( S3 B; f6 j... ...
    8 p; Y, S7 k1 P; L' x438 while ((logname = get_logname ()) == 0); //mingetty.c文件438行
    0 ?, \9 v, [4 m439 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL);
    $ n/ }" K. [6 _3 C0 G' c1 K440 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]);
    ' b2 s' f, P( k8 m... ... ' @% P: z4 C2 e1 u( N7 s* k9 x
    9 f. u# d* a) W% l0 N5 a
      
    6 O) I2 h9 @: _& h
    5 S: g& O' R0 @1 B- ~第一行的功能是输出login提示,并获得用户输入的登录用户名,登录用户名由logname返回。因此,可作如下修改
    , a5 s0 A% G: T$ K' _! ?6 m. q
    , z- @: {5 |) t9 y* z
    4 B* F- g+ H% Z* t' d... ... 1 T0 o6 q$ W/ k! e& z( i/ a  c5 [
    438 // while ((logname = get_logname ()) == 0); //注释掉本行,不再提示login: 4 D& |% b8 }4 X
    439 logname = "root"; //添加本行代码
    : ?: ]3 j3 w+ H8 Y440 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); ) J# J. P. r' c
    441 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]);
    9 C# c- P. j* u: [2 v4 I... ...
    6 l1 J' {3 K' o4 ]0 z% ]! e) o& j! [' Z! O& P4 @& ^9 N
      , {9 f* w" T4 q1 L4 Z2 B

    - ]7 h) A2 Q; n0 _2 Q" X注意,这里假定用户以超级用户身份登录。 " S& Z, U+ p2 z* u
    3 a3 O8 k! ^  B
    第二行以用户登录名为参数,调用/bin/login程序,进一步实现登录。因此,要想实现自动登录,还应该了解/bin/login的功能,必要时还应修改其源代码。 5 E0 `. k* T) P% c0 Z) V
    ' p; C7 ]; c& [- v
    第三行为出错处理。 / i% q+ l# {' ^
    . C- M( p- }: y4 k1 N
    (2)util-linux-2.11r-10.src.rpm软件包  * h4 p  T, s7 b, k( x4 x
    采用同样的方法,查看/bin/login所属软件包(redhad8.0版本的login包含在util-linux-2.11r-10.src.rpm软件包中),下载并安装util-linux-2.11r-10.src.rpm,login可执行文件有几个源文件编译而成,我们最关心的是login.c源文件(大约1500行的代码)。下面简要分析一下login要实现的功能,并对相应部分作必要的修改。
    , I" I: m0 ]. F; q" ~
    % z$ X1 F2 l- |, G4 F5 h" C( ~) k3 sLogin程序主要可以分为以下几个主要部分: " b# l4 `" _! }# e2 N, b. t; b* ]' z" O/ J
    8 A3 Z6 z/ [& p: t0 m$ f
    1.Login首先检查登录者是否为超级用户,如果不是超级用户,并且存在/etc/nologin文件,则输出该文件内容,并中止登录过程;主要由checknologin()实现;  
    5 s+ e* ]- b) d+ w. L, ^7 l2.如果登录用户是超级用户,那么login必须在/etc/securetty/中指定的tty列表中实现登录,否则将导致登录失败。同样可以不指定/etc/securetty文件,此时,超级用户可以在任何tty上登录。  1 b' s* D& U' ^# B# ^7 H9 H
    3.经过前两步测试后,login接下来将提示输入登录密码(由getpass()调用完成,有兴趣的读者可参考其手册页面),并进行验证,如果密码不对,则提示重新登录。  / H+ {4 ]4 V6 t5 F  E' }; r7 |( f: J
    4.顺利经过密码验证后,login还将检查是否存在.hushlogin文件,如果该文件存在,则执行一次"quiet"登录(所谓的quiet登录指的是,登录时不再提示邮件mail,不再显示最后一次登录时间,不输出任何消息。启动级别为3时,正常情况下输出这些信息)  
    0 k7 k! m: R/ n. d# A1 m* ]5.login接下来设置登录tty的用户ID和组ID,并设置相应的环境变量,包括HOME、PATH、SHELL、TERM、LOGNAME等。对于普通用户来说,PATH缺省被设置成/usr/local/bin: /bin/usr/bin:;对于超级用户来说,PATH被设置成/sbin: /bin: /usr/sbin: /usr/bin:  - ~- o( K2 {) E/ |9 e$ Z4 B
    6.login的最后一步是为用户启动shell。如果在/etc/passwd中没有为用户指定shell,那么将使用/bin/sh,如果在/etc/passwd中没有给出当前工作目录,则使用"/"。  ; o9 O# Z# _3 ?2 u( }! }
    至此,一个完整的登录过程就结束了。 ; p* y: i6 ^6 Z8 [$ q
    ! T& G) p8 Q% s- Q" b
    从以上对login源程序分析过程中可发现,如果要实现自动登录,应该在第三步做文章,设法绕过提示输入密码以及对密码进行验证这一过程。实际上很简单,login源程序对是否要求输入密码设置了一个开关控制passwd_req,缺省情况下,其值为1(passwd_req = 1),即要求输入密码进行身份验证。把该行代码改为(passwd_req = 0)后,问题就解决了。即对源文件作如下修改即可: . c9 E4 f/ R* ~0 c- ]# r
    5 D" ]8 k& G) C3 a) e; Q
    6 Q( l1 N8 U3 G- J
    ... ... / }2 F/ K4 {2 {& u5 X6 t$ I6 E1 [/ Y
    402 fflag = hflag = pflag = 0; //login.c文件402行 " H$ m% a6 L# R% V: d
    403 //passwd_req = 1   //缺省时,要求进行密码验证,注释掉本行
    $ }# [- M' j" t8 u404 passwd_req = 0 //添加本行
    ; {" X3 k# e3 w4 I4 z... ...
    ' F! K2 G) `, @& I4 [
    0 u- r0 o1 F  F% ]- h" g# q  
    ' J# {% g5 [. u& C3 I! o$ V8 }" T& i* f
    修改后,可以直接使用util-linux-2.11r-10.src.rpm提供的Makefile进行重新编译,也可以自己对其编译: 9 j0 K' w# Z: J! q2 P0 m

    9 f6 D# T( P# w9 c# t% u* d0 A
    9 O- m0 C7 n; ^: S, M) Tgcc -o login login.c setproctitle.c checktty.c xstrncpy.c -Wall -lcrypt注意包含后面的编译选项-lcrypt,否则会出问题。
    ; m! q: v2 T5 B' o, |: |4 q
    ( s! o) h. c/ p' n, L( i. z% b- _3 W' F9 ]( ~. f
    有了新版的mingetty及login后,拷贝mingetty到/sbin/目录,拷贝login到/bin目录,并将/etc/inittab中的启动级别设置为3,再重新引导系统即可(读者可以自己写一个脚本实现上述过程)。
    0 ?4 T. p, ]7 g6 l% i5 W0 ]  H9 D- ?9 E8 I' e0 r, j' T
    如果读者对mingetty或login代码的其他部分感兴趣,可以反复修改login.c或mingetty.c的源代码,测试一下代码的功能,这里要注意的是,在拷贝新版mingetty和login之前,一定要把原来的mingetty和login备份,同时还要准备系统引导盘(有系统安装盘亦可,这样读者有机会键入linux rescue),在测试新版程序前更应如此,如果对代码修改稍有不当,系统将不能正常启动。
    ! w9 H1 ?& F: Z/ h0 _' f4 p& b
    * A" @! Z4 R8 c; k& ?' b如果不想再作进一步的代码测试,只是按本文给出的方法进行代码修改,在系统启动上不会出现什么问题。 " _6 L' Z# f6 [  ]( v

    8 a! Y" P- N! ~1 {7 F9 a5 l[b:804aea7097]二、自动登录后,自动运行特定的应用程序[/b:804aea7097] - \+ C7 \: w, S9 ]# K( v" }

    7 {$ c9 k3 v! E3 \) E在实现了启动级别3时的自动登录后,自动运行应用程序非常简单,把应用程序添加在/etc/rc.d/rc.local脚本中既可。(读者可以尝试一下把startx加入脚本中,看一看效果如何。在某种意义上,又增加了一种自动登录X window的方法)
    8 Z/ z4 [! u6 H  m; G; x7 w" ~/ y
    5 I: H/ j1 q0 k1 v; W6 B[b:804aea7097]三、对自动登录X window(系统启动级别为5),并自动运行指定的应用程序的补充[/b:804aea7097]
    ' b0 j0 ]) i" r; J3 n* p4 |
    5 ~6 e3 Y# B& b在"如何实现自动登录linux"中,主要以redhat 7.2平台为背景进行阐述的,其中的自动登录部分可以直接用于redhat 8.0中,不需要任何修改。
    7 u/ L* O% B  O, o* E2 y  w# i" V7 E  e! ~
    但是,登录后自动运行应用程序的接口在redhat 8.0中有所不同,主要是登录gnome后,自动运行应用程序的接口有所改变:首先点击面板上的GNOME帮助(那个红色的小帽子),然后选择/其它/首选项/Sessions,在Session对话框的启动程序属性页中添加要启动的程序即可。 3 I* g% [0 z4 p2 L: w* {) K( W, i: |
    . z# ~& Y/ Z: F6 C
    对于登录kde后,自动运行程序的接口没有改变。
    + `- t9 m! p9 [' C# @4 p' _8 \4 e) b
    [b:804aea7097]四、结论[/b:804aea7097] 7 A  S% S8 }! x  x' @+ ?7 \- d9 x

    2 N/ H7 c5 x* l( o2 m本文同"如何实现自动登录linux"一文,基本上解决了如何实现自动登录Linux,并自动运行相应应用程序的问题。对于两个最常见的启动级别(3、5),都给出了各自的方法。 # W  K7 Z9 B# q& r
    - ~& N  h! R6 s$ k- a: s& b
    在系统初始化到mingetty及login这一阶段,内核实际上已经完成了引导过程,已经到了系统初始化的最高阶段,与内核没什么关系了。此时,主要是/sbin/init根据/etc/inittab的内容而相机行事。读者可通过(man 8 init)或者(man 5 inittab)了解更多东西。
    2 `/ m0 z% `1 R2 K5 n- a; M* V' a: R/ `) [2 k
    在对文中提到的软件包修改时,请遵守GNU General Public License(GPL)相关标准,另外,替换login通常被视为黑客行为,应当谨慎行事。
    & m1 x) n, i+ u4 L, ]2 A! T1 t* I9 O* f, ]6 m
    ! c* {! s. ?4 S! P8 S$ _
    7 C, F/ o; e& r" d" c
    [b:804aea7097]参考文献[/b:804aea7097]
    + W8 z( n4 @6 y4 j& Z( t4 m  w' B. z5 _# T0 t6 y5 [0 S

    ' U7 ]' R  ]7 I1.login手册页面  
    ) ?4 m& ~# M2 f# \6 ~# Q, g6 z1 h2.mingetty-1.00-3.src.rpm,在redhat 8.0的发行版本的源代码中,包含该软件包;  ; |9 n1 C; O3 d
    3.util-linux-2.11r-10.src.rpm,  1 ?' W" z1 g# _8 U; l/ y. Z

    5 N0 y4 P) a; D+ G6 [0 m可在http://rpmfind.net/linux/RPM/redhat/8.0/i386/util-linux-2.11r-10.i386.html处下载,注意下载源代码包(..src.rpm)
    , l' j$ X+ I/ v1 N2 \8 S1 Z
    % X( n3 w- l7 Y- Z  h; K- s: m" U6 N[b:804aea7097]关于作者[/b:804aea7097]    }, S( G" @% D( S8 a
    . p' L$ w3 H; E2 p& {
    郑彦兴,男,现攻读国防科大计算机学院博士学位。您可以通过电子邮件 mlinux@163.com和他联系
    4 y& a0 R6 T* h& {- F( j- d7 p! u$ X. }* L7 \! |% ^
    </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)
    0 ?3 e  {6 L" s! }$ r8 R
    ; L0 S+ c: s" p, ]0 P" b* Z机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。
    8 P4 ~, W) E7 l/ L# G一、linux启动的最后阶段的工作
    * e6 y: j0 X8 r; D  _0 c  i; W1 q1 t- Z& D1 |$ g4 z' ~
    linux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有:
    ; N2 u8 I: j% `5 t7 Z8 O- ~+ M! X' B5 c
    & ~( X( `  B0 o4 Y, Z运行xdm启动X window;  4 Q1 A) D1 S' x, x
    运行gdm,进入gnome桌面环境;  # O4 T, F9 t1 `- ?; S7 f8 [- r
    运行kdm进入kde桌面环境;  . L# m/ \8 m3 s4 Z1 A6 T, X) }! C
    自动登录进入linux;  
    8 @8 U6 }( t6 z8 E/ W. x( U, Aprefdm脚本框架大致如下: * Y9 H; N- G2 A$ }' F/ W3 g5 D

    ( s. D' ?; S0 |+ ]) Y: b& e#!/bin/sh ; {9 n. @1 y0 I
    PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    4 E5 @  e6 N5 p5 H  T. /etc/profile.d/lang.sh
    ) k( k7 P' u3 [' p' e6 k+ L# 第一步:查看是否为自动登录 8 s  I8 r/ u8 h( Q  O
    if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then ; j! ~8 z; u5 X- Q
    if /usr/sbin/autologin; then
    & X% H+ @$ Z# N- A) x0 _7 Lexit 0
    - {3 _: r  c( Q8 x3 O4 Hfi
    1 T! L9 O* m+ h7 o' b1 e! Sfi
    ; N: p& t+ d0 `* S1 ]# \7 X; Q3 v( q. Q
    # 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式
    5 F0 P& U1 b* b) V' z7 w......
    , R9 L! b6 D; T) q# 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。 2 T, l0 k. T9 r+ C5 l
    ......
      ~5 f) }9 w3 v( V% G3 A  W- ~2 }$ v  u3 @& [
      
      b. j; I4 O- i( O( A) k) R4 W) F* A& q0 Q! R3 S7 P
    5 h  R+ e; q( d) z
    二、自动登录的实现(autologin的实现)
    0 C* t& N: q9 j7 z# U5 N5 ^% J( W
    在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。 + I- f) _! s/ b4 y: [
    * x9 `2 Q0 z8 e7 L0 i( m
    自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。
    7 t+ }2 ]6 k  A
    3 y5 h2 N5 b1 j, B/ e" V. U$ p8 n9 UXinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。  * @$ J+ d  K# O1 j9 N, j
    实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。  , @2 w: Z, X: e6 ?3 g
    startx脚本的最基本框架是: 9 ^4 }4 D& [+ W
    0 k3 N  }" q% X: t( `
    a、 寻找.xinitrc,如果没有则使用xinitrc;
    3 O- J6 v3 p/ vb、 寻找.xserverrc,如果没有则使用xserverrc; + p* q0 Q4 H' `
    c、 根据找到的脚本确定xinit的参数; $ K! {& j' S3 T6 _" d6 v

    9 A0 k" C, x" x* A: u4 [0 b由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录:
    8 j; ^: j/ R" }  \5 s2 Y! ~6 `: _2 K2 b& Z5 s/ B

    2 T( u+ M5 L; L* |#!/bin/sh
    7 I' @/ L% S: w( Z( A  Y  ~/ s* P* o( SPATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
    4 u$ p; i4 @% J( j+ G1 @. /etc/profile.d/lang.sh
    % M* F, y3 P! c) I  F: E8 H# 第一步:查看是否为自动登录
    . x9 w; s) k* v$ F, }#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
    1 b  ^1 x* {6 @#注释掉上边的条件测试,直接运行startx
    . s' A9 b/ A: K2 Dif /usr/X11R6/bin/startx; then ! {" A! W, A! k0 c( n+ {: f
    exit 0
    . l/ f- N- w. ]* I7 q0 |, Nfi
    # V1 p. v% \5 p; Q& l4 B#fi
    - L3 \1 p6 x' G' p0 w
    6 T7 J/ V  f6 W# k$ T( S% z9 Z  ! c5 b* s6 F1 T5 U4 T" f

      r$ V% s  y. q4 o+ T3 G! j& g3 I+ H6 P. x
    当然,应确保/etc/inittab中的启动级别为5。   i, k& A# p4 H) ^) J9 m1 @& w
    + y6 y* k) m; ]! n% a
    重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。 5 O% q- F+ `: W) z3 m: u# T/ H/ M

    & n; N( i  _( z( b8 R% c; c三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。
    / y* s" q# L$ s' k* [5 E1 ^/ s# S* k: ^, n% ^7 R7 D1 A
    观察原来/etc/X11/prefdm脚本的自动登录部分: - F$ S* S$ h% ]

    / M! h+ m0 ^% s+ i& Q( F3 ~( U  H; W
    ...... ! ~: ~# O% w* k) P9 F8 \! L7 v
    # 第一步:查看是否为自动登录
    & ]! e2 W, L1 Pif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then $ M: g& \/ l4 p( E  O' h
    if /usr/sbin/autologin; then
    0 J' ?& f. B8 z: \- I% u: Uexit 0
    ) [4 e! h- k, `* |9 ]9 R  Tfi
    9 i% W0 E! i2 l3 ~. J8 F# e+ }0 xfi
    ( k3 [. r! g! ^) n; r' d6 b...... 6 R) k8 ~: U( J. J$ r9 ]

    9 y& B7 C$ H/ I4 P& c; x  / j6 C( Q- W/ o3 i0 t
    8 Z4 Y$ h* T2 o0 T5 a4 `, i: L0 o
    , `( Q0 t7 C+ _
    不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。 8 k* g( D6 h$ l
    $ c! L# J" B# O/ R; Q2 h9 U5 a4 _
    1、/etc/sysconfig/autologin配置文件的实现:
    3 Z4 @* Y2 [% E
    : f+ e9 ]& Y+ A1 w, r" G9 T* |* Y, v6 s" w" o% l- b2 s- j
    #config for autologin $ X6 [2 W8 N3 ^0 @- Z$ S
    USER=root
    ( K1 T4 B' v/ |' I* `% s/ mEXEC=/usr/X11R6/bin/startx 6 t: {4 q% g- O/ ?6 e7 B  }
    说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。   y! x+ }: M9 S: {2 _9 z

    3 K8 U( q6 `5 U) {  
    2 @$ F* b7 T. ]9 u) s9 G, i5 R3 E, y  X% W8 L1 d" U" l

    9 V7 {5 B8 B6 z; S, o& |8 x2、/usr/sbin/autologin可执行文件的实现:
    " o. D9 _8 P) c5 o+ Z0 M$ Z6 r4 z" H5 H( @# n5 `
    3 H* e2 c2 A0 M
    /*********************
    * m$ a' n8 X. i; j! O# i****  autologin.c  ****
    : m5 n' ]1 h0 \& h6 M; \*********************/ 4 j/ H# J5 ~8 k# w2 T' ?; F
    #include &lt;stdio.h&gt;
    2 l7 q- d3 \3 ?#include &lt;unistd.h&gt; $ C. v5 r6 o- C7 L- U; W
    #include &lt;string.h&gt; # n! i# l1 D0 G& R/ }1 t  H9 g# O" D6 k
    #include &lt;errno.h&gt;
    5 I% ~6 Y+ [& @2 M1 h+ `" X: F! h, }#include &lt;sys/types.h&gt; 4 q' e2 y. z% d. t
    #include &lt;sys/stat.h&gt;
    5 i2 X, c. S8 s( g4 E) d! g#include &lt;pwd.h&gt;
    ! q; x) a$ H* L/ N+ d" K; B& \8 W( O' x2 [4 `
    int main(int argc, char **argv) ' q$ a/ l  N: h% a+ @8 Y
    {
    % e- n/ S3 c( |$ y7 @; Q! ^struct stat st; 4 q8 e% N) x& [  |  b
    FILE *f; , {0 j' W5 s' a) l- L. F- e# @
    char *cfg;
    $ j4 b7 Z$ ]6 @& @1 Dstruct passwd *pw; 3 N2 k1 ^/ I8 }- C! a
    uid_t uid; * U1 ~' A. F0 p' ^! j! r# g  `
    gid_t gid;
    $ d/ o" W3 E; N" F* y9 ]char *dir, *shell; $ ^( D( ~" P9 D1 Z
    char *user=NULL;
    / @' X# S) t* q3 g) bchar *cmd=NULL; 5 H' {6 ?% J2 I" {' r) L( ?

      e1 h* R  y, O9 o, buser="root";
    : {9 m: p9 g7 b: f) ^/*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, ! s$ ~, |1 E& z5 z- w" u# T9 o
    登陆用户名应该从/etc/sysconfig/autologin中得到,
    / }9 x' f2 ~+ K# M: p程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/
    . B0 ]3 n! _3 c, L# i6 W4 w' jcmd="/usr/X11R6/bin/startx";
    " p$ X% `6 Y8 k( `  Q: U( t: P3 F/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/ 6 v# K( {! H, e: R. T

    * L( ]0 ~" b% E9 x0 @3 npw = getpwnam(user); $ M8 x- M: d0 b  s
    //getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。
    ) a; O: G2 U) uif(pw) {
    ) M/ [, k3 n  F( juid=pw-&gt;pw_uid;
    5 k2 I$ N7 ~' M; [( b' Tgid=pw-&gt;pw_gid; dir=strdup(pw-&gt;pw_dir);
    2 h" }5 d5 K3 ~0 Eshell=strdup(pw-&gt;pw_shell); + u7 i4 Z- b* x' g! v, H
    }
    1 ~& {% J7 j# t//获得用户相关信息
    $ e, d) a0 O  S9 k: Y8 ~1 O else { ) U# L1 `" \+ i7 c. |4 h
    printf("ERROR: No such user %s!\n", user);
      {# m: M. o9 }return 1; % M: c2 [! D( m
    } ! [$ S- y* ~4 d: U# O

    7 M, j: K6 |: t. i8 `9 R  dchown("/dev/console", uid, gid); / A; g$ g* C! G
    chown("/dev/tty", uid, gid);
    9 X: X6 f; H/ c" O/ d! C//为控制台和终端设置用户ID及组ID
    7 b; n* U, Z* y7 y/ \  P$ x! p; E0 u( L$ N6 p
    //下面是设置用户相关ID # D# w0 C+ x4 d- R# D  G" \
    setregid(gid, gid);
    : ?! q, C, e9 B# Tsetegid(gid);
    2 j. k6 v7 Q, D; @4 |$ [6 h  T4 |setgid(gid);
    0 d5 e; e2 Z: {5 w5 s/ j( rsetreuid(uid, uid);
    * J, q- R0 {+ P1 bseteuid(uid);
      E- X# S- L# d; V+ rsetuid(uid);
    % S  u. {0 w3 O. }3 k
    ' i: {# t$ L2 ^9 z# I- S6 i( psetenv("HOME", dir, 1); * l, f4 b4 r0 ?( Y
    setenv("SHELL", shell, 1);
    & O! W6 W/ m! c) W) E' `setenv("USER", user, 1);
    * O! m6 `& o, p7 Csetenv("LOGNAME", user, 1);
    $ J1 @0 N- W2 X6 X; ~9 w2 |! t//设置用户相关环境变量
    9 k2 h) Y' L5 j* t9 o, Z  ], K1 t
    0 e5 O+ x9 i9 G2 r- {! ychdir(dir);
    / ?, i/ z3 @$ I! Z7 g$ d//切换到用户根目录 + ?# r0 ^8 A0 R
    user=NULL; ; E3 h4 t/ u* }9 S  ^

    + _; h( U6 h/ vexecvp(cmd, argv);
    2 h0 V4 ~  \3 S/*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */ % m  W8 S0 i. G8 }  P( {2 W
    printf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno));
    ! x4 l3 z, j4 C. z  y% ^8 jreturn 2;
    ) P& a8 `" I/ K% c3 D} 9 I& U" K- @6 u) H- T7 k5 z0 I, d
    8 W6 G( x4 r2 ^! w
      
    - ]- Z& u$ D- w5 ~' t  [, {6 B) b) A0 s5 e" Z& \- q& U0 W1 y
    1 O3 k0 y  c6 J! k7 L4 V
    运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。 ; X* p* r& I- h4 k+ H. b: K

    , u# j; o/ a0 ]7 k0 v/ V如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下:   _! R; n! s+ V) b8 }* i9 U$ z

    % s, J- j; ~' J$ c! z) q8 C9 ?, [2 ?. e, K
    ......
    8 ^5 _# \% l+ @* W/ j# 第一步:查看是否为自动登录
    # S- H/ |' @# ~: g: Bif /usr/sbin/autologin; then 6 k$ T" t0 w5 w/ o/ _, @: s
    exit 0 . [" g. u+ j4 w" Q5 n
    fi
    . O- @  X& v3 Z$ x//第二步 ......
    0 e9 t+ I8 c9 t5 z* m...... 7 f7 f! t# W, z; H
      `  Q. l0 Y9 ^. C  H
      
      S) o; N8 L& m9 ?! A2 U& E6 G% d9 X% V: o
    . S, N3 D' G8 z. m. a6 e7 x
    即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。 $ _$ n8 ]3 o2 ~1 t! c" N# G4 B& K
    5 @( m2 d9 p6 u
    四、选择进入kde或者gnome,并自动启动X window应用程序 ! K8 U0 b6 _/ O, A9 i
    $ F! k2 m% F7 r, f2 V7 M0 m3 b
    如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。  
    . ~5 |  W/ T( [; d% Q3 q2 C一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。  
    " ~' I) V8 S3 [* P* D% x, |
    3 {2 V2 A7 n! a" }/ p: a  S: G
    , Y. w# z1 T7 u# @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-9-8 22:49 , Processed in 0.416471 second(s), 57 queries .

    回顶部