开机自动登录
Linux,并
自动运行XWindow应用
程序,有其特殊的应用背景,如基于Linux平台的监控
系统,Linux启动后不需要身份验证,而直接运行监控程序等等。本文以
Redhat7.2为平台,结合Linux
启动过程,介绍了如何避免身份验证自动登录,并直接进入XWindow自动运行应用程序。
* Q* F" J7 X# J, M% g 一、Linux启动的最后阶段的工作
, [2 j; E& ^/ c1 ? Linux在启动过程的最后阶段(具体启动步骤略),init会根据/
etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm-nodaemon运行/etc/X11/prefdm脚本,(Redhat7.2缺省时是这样的)。prefdm脚本的主要任务是完成XWindow的启动,可以有几种启动XWindow的方法,都包含在prefdm脚本中,几种主要方法有:
- P' B |, Z; g! Z. U
[color=#FFFFFF']
J9 ?! L, z6 ?8 T; c+ S' v2 {7 L; b: w \' |: g& u( V
运行xdm启动XWindow;
/ Z6 r% t- o* S) I" ^/ S
运行gdm,进入gnome桌面
环境;
. W" y0 ]5 w2 M7 ~0 q* D6 V3 @ 运行kdm进入kde桌面环境;
& w3 W, d. T5 W b o
自动登录进入Linux;
8 }9 x1 E0 y" L# W( K* Z+ ?, Z' c prefdm脚本框架大致如下:
; [6 W1 h' r9 Z3 f c9 ^3 k#!/
bin/sh
R0 U! n! k/ U. ]6 IPATH=/sbin:/
usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
, F1 a* U' w9 V1 }% E! X7 g
./etc/profile.d/lang.sh
: Z8 e$ v0 K! R( h2 y! L5 j
#第一步:查看是否为自动登录
2 |9 p1 R6 L# E9 D$ U# r+ k
if[-f/etc/sysconfig/autologin-a-x/usr/sbin/autologin];then
, U3 a6 u- {- x8 l- C. ]/ ] if/usr/sbin/autologin;then
! `* ~" o8 O; D H6 f Y
exit0
% v9 B4 j3 J/ @+ B$ X. j# ^& k
fi
r( d0 j8 M0 B* v9 ~1 M$ g
fi
' e8 ?* O4 R9 N# o9 n5 V8 H[color=#FFFFFF']
p) C7 g5 ~/ O9 b8 c, F/ Z: ?+ \! q9 ?/ v
#第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式
. M1 U% w9 u0 b9 a( B9 @- { ......
% x0 w; D/ L6 ^% X) r' R#可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。
. I2 U! f$ V1 m/ g) Y9 O; [2 o8 a: N ......
/ B& i1 m6 H% x& y2 A# s0 p; i 二、自动登录的实现(autologin的实现)( {6 i( c/ U/ i5 z5 }6 n# M
& E% ~7 A, {+ q5 c3 d 在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件
测试开关,事实上,可以在这里注释掉测试开关,直接执行启动XWindow的操作。
5 [( N( `$ g6 V
自动登录实质上就是绕过身份验证,直接启动XWindow。XWindow的启动可以由xinit来完成。
9 [+ f2 ~6 c4 w8 k) O[color=#FFFFFF']
9 f2 R/ f0 m, o; [: O% J
/ Y8 t. K; k9 x6 Y3 ^% ~
Xinit用来启动XWindow系统
服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行.xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行.xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X:0。实际上,用startx来启动X更为方便。对于运行单一会话的XWindow系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找.xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。startx脚本的最基本框架是:
6 [9 _) h7 ]9 ^# T J" u
a、寻找.xinitrc,如果没有则使用xinitrc;
% e/ G" u0 S$ J) [ b、寻找.xserverrc,如果没有则使用xserverrc;
7 @, k+ r3 R, C
c、根据找到的脚本确定xinit的参数;
' c; H3 T% p5 G1 M+ H 由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录:
D: R+ n+ s6 K5 y. Y#!/bin/sh
, v" h' i0 K$ J+ O2 I% X
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
+ G9 g e' f+ d: [9 r' A: Q./etc/profile.d/lang.sh
2 P5 z( p0 j8 M* M1 S& I3 v
#第一步:查看是否为自动登录
5 \, S9 D% s! N! L# E j#if[-f/etc/sysconfig/autologin-a-x/usr/sbin/autologin];then
! N; K* l2 n5 \
#注释掉上边的条件测试,直接运行startx
7 {" H2 x$ h7 C" l( t
if/usr/X11R6/bin/startx;then
! X# g- v; w% `% K1 m% _9 k; Q
exit0
; u9 C, N6 {8 b# Z
fi
1 P$ Q: M, Z) z, V#fi
" t* u: J& B4 A( {
当然,应确保/etc/inittab中的启动级别为5。
$ B# f& a1 B2 ~% D
[color=#FFFFFF']
6 E: W5 S5 C6 |, e9 \5 P6 b
* g5 K, @* ]. n& v 重新启动系统,会
发现系统不验证用户身份,直接进入XWindow,此时的用户身份为root。但是,如果原来root有自己的桌面、默认
shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。]
& w( Y+ C! s/ R3 g7 A7 m
三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量) V# M+ `! B! `/ K
, d& R5 v- e& U: o
观察原来/etc/X11/prefdm脚本的自动登录部分:
# k- y5 x# k h
[color=#FFFFFF']
2 W8 n, {; ~$ `! A
: |# s; _ t, S" `" p ?......
% ^8 e F6 g$ V4 M( G, z. _( ?* p- T#第一步:查看是否为自动登录
; f5 ] V$ g+ [+ s: ?& pif[-f/etc/sysconfig/autologin-a-x/usr/sbin/autologin];then
( _" c6 O& b6 f8 R/ v8 k% I if/usr/sbin/autologin;then
- c) ^1 f" i3 b7 b. p4 a
exit0
2 m3 h% _$ O% X2 F* v, d5 s! ? fi
! _( [0 j1 a- A$ s' F5 N- p7 r8 T+ n
fi
0 \" V$ d1 w' E5 X& f/ N7 _......
" h2 E& \* M2 }) {" ^) B9 H
[color=#FFFFFF']
' x5 K' L3 b8 M6 i( @* z
& R( ~$ ]! w) }6 _4 q
不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。
+ ?9 g( j2 z* C! R 1、/etc/sysconfig/autologin配置文件的实现:
6 a& \' D, N! ~) K5 O* p#configforautologin
2 I5 Y5 d3 r% \8 J USER=root
) P% \3 S6 ]% d8 |; v& E$ h
EXEC=/usr/X11R6/bin/startx
! C! F' H8 }; E8 _
说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。
' c8 K! F8 d; k# ~8 c 2、/usr/sbin/autologin可执行文件的实现
0 c: R. m% n) ]# ~" d
/*********************
6 x/ {; x4 j! A' c5 C! q
****autologin.c****
) |; U5 B V2 i! ]. E. I9 _8 v8 h8 j*********************/
/ N' w1 Q: a, n* w N$ j& W
#include
( z' A0 d: T) S0 T
#include
5 Y A: W4 r0 [8 i: r#include
( D( T/ g7 j% A8 K4 W Y% A#include
^" r5 S6 ^- t( O/ K6 x6 k
#include
9 S7 P) {! K- e! I7 C. u' g#include
* `7 N" _0 o6 r* M
#include
0 T9 M( _$ z |5 @intmain(intargc,char**argv)
' [. c8 A9 f% i) d" q) b# X{
/ H/ k6 y! n# g8 z9 { structstatst;
\6 ?/ v+ U' @. L9 ^* @4 F t: |3 u FILE*f;
8 _5 I3 _& d1 m+ W char*cfg;
* c! s( L4 I0 t* M* [0 y$ A9 l* t% A0 ^
structpasswd*pw;
' ?7 V9 U5 U) l
uid_tuid;
5 g. ?3 z9 W5 `) | gid_tgid;
}( j5 j9 \. ` char*dir,*shell;
8 B8 j/ H5 I5 R' ]# X char*user=NULL;
' ?) l; g$ B) @ Z5 H" u. H, R char*cmd=NULL;
7 T v) v3 Z' B user="root";
4 P, }3 r5 j8 t4 v/ u t5 a" H4 f8 X/*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上,
7 n( p# [7 d- T登陆用户名应该从/etc/sysconfig/autologin中得到,
/ u+ g, M# g3 @& i4 O程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/
) ~& W, U& o) u* }8 a/ ?& f
cmd="/usr/X11R6/bin/startx";
5 N7 x) J: f! a- b" B9 p _
/*同样,这里直接指定启动XWindow的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/
y$ R7 Y) W. [ pw=getpwnam(user);
& x1 Z$ c4 J' [ l5 p: \ //getpwnam返回包含用户
信息的passwd
结构(该结构在pwd.h中定义)。
0 l! E- M5 [" ?# h5 m if(pw){
7 }' z- ?. ^- h. K" d6 s% W uid=pw-%26gt;pw_uid;
/ h# a' D8 ^6 w/ G, _
gid=pw-%26gt;pw_gid; dir=strdup(pw-%26gt;pw_dir);
2 d2 E7 B6 e# ]0 B: P. y: P6 K0 l shell=strdup(pw-%26gt;pw_shell);
# x- T1 w# F2 O1 z/ g6 D6 K
}
( C% Y9 h Q+ B, s& b$ m- k
//获得用户相关信息
9 s; H/ Y3 z1 a5 ?/ V4 L; z; Jelse{
$ @6 J( T# J* q! [5 t) a
printf("ERROR:Nosuchuser%s!\n",user);
1 f% |$ L/ K9 m/ i. D
return1;
! N0 c* {! ]7 `
}
8 B+ c3 L5 e- z+ b- @
chown("/dev/console",uid,gid);
) l0 F/ j T% j) I/ I/ ^' n
chown("/dev/tty",uid,gid);
) H5 @5 c# d: R6 F //为控制台和终端设置用户ID及组ID
0 e( \) X: z h# M' E8 ` n
2 |1 J/ D4 D+ f5 f
//下面是设置用户相关ID
8 t6 E8 B% f: a1 o6 W( I
setregid(gid,gid);
. k5 I! k2 l7 E+ p9 c- c
setegid(gid);
8 t1 N, N8 d' T* q6 {; o setgid(gid);
/ `3 ^- Q* D8 k5 V
setreuid(uid,uid);
& u4 I+ p3 l9 F/ s8 `1 @2 _. u seteuid(uid);
1 X. J) R' @4 S( E' v! I( ^ setuid(uid);
5 r8 s. d: q# u setenv("HOME",dir,1);
3 J# ]) a5 h4 W: N( i, s
setenv("SHELL",shell,1);
& P+ p6 M9 P" ^+ H* g0 X" Z- X% x F
setenv("USER",user,1);
8 W4 Z/ d/ ]3 g; P setenv("LOGNAME",user,1);
z$ D/ g! A; l5 F! d' l# I
//设置用户相关环境变量
7 F/ Y* r, U6 O3 r2 L. z8 r+ _ chdir(dir);
4 I$ S+ {( y: Z3 T //切换到用户根目录
, M9 b, _2 U( t9 I: ?
user=NULL;
7 F e: E* O1 K6 [ execvp(cmd,argv);
- |1 a0 }0 C R
/*在配置完用户的相关信息后,执行启动XWindow操作。注意这里默认执行/usr/X11R6/bin/startx*/
6 D6 T2 B) c- H) p
printf("ERROR:Couldn'texec%s:%s\n",cmd,strerror(errno));
1 @8 `4 u1 R" n3 r P
return2;
# Y# z( i2 F0 N- g* w6 |}
4 p# p0 R( T* v" m3 E- s 运行gcc-oautologinautologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。重新启动系统,会直接进入XWindow并保留用户原来所有的风格。
4 W6 h. r9 p" N3 m% e; D8 E) t2 j- v$ p
如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下:
6 U2 F( G" a; v. j0 b1 ~& s* p. M" ^, _
......
" a U: ~0 c2 z+ l c1 {8 Y& G& n
#第一步:查看是否为自动登录
# ^3 r8 p! U0 D% W if/usr/sbin/autologin;then
. B+ W. q$ F0 M; I K/ r, f exit0
. Y: k, y5 H8 V- G fi
4 H# Y( A) ^; y2 S( l" O- [ //第二步 ......
) ?' k' q2 G4 u& f5 q
......
- b( E" X4 x! `) n1 j9 o9 x" ^
即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。
2 d. P$ J/ J' h. U$ T% I' E[color=#FFFFFF']
& h2 z7 g2 \5 z3 U# J+ H
% w, N" e: _4 P1 M O$ _! M 四、选择进入kde或者gnome,并自动启动XWindow应用程序
8 h3 X0 h2 O0 o, Q; |' ?1 @. }[color=#FFFFFF']
4 `+ E+ I, z# L; p2 R
' R. y( o' B O# V& T( C$ `5 n1 ^
如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdeskgnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。一般系统自动登录的目的是启动XWindow后自动运行某个XWindow程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在XWindow启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startupprograms属性页中即可。