- 在线时间
- 63 小时
- 最后登录
- 2019-5-3
- 注册时间
- 2004-5-10
- 听众数
- 443
- 收听数
- 0
- 能力
- -250 分
- 体力
- 10122 点
- 威望
- -12 点
- 阅读权限
- 150
- 积分
- -516
- 相册
- 6
- 日志
- 10
- 记录
- 10
- 帖子
- 2003
- 主题
- 1253
- 精华
- 43
- 分享
- 8
- 好友
- 1292

复兴中华数学头子
TA的每日心情 | 开心 2011-9-26 17:31 |
|---|
签到天数: 3 天 [LV.2]偶尔看看I
- 自我介绍
- 数学中国网站(www.madio.cn)是目前中国最大的数学建模交流社区
群组: 越狱吧 群组: 湖南工业大学数学建模同盟会 群组: 四川农业大学数学建模协会 群组: 重庆交通大学数学建模协会 群组: 中国矿业大学数学建模协会 |
2#
发表于 2004-9-27 14:27
|只看该作者
|
|邮箱已经成功绑定
如何实现自动登录Linux (Runlevel 5)
0 J6 n' }8 c9 t+ H% e! x* E* ~; C& g: w
机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。 9 x1 i8 s z4 r0 Z/ |4 V; i! l' R
一、linux启动的最后阶段的工作
& {; p* B1 S! o; L. A: I, l9 e/ k6 q# \( h8 l& Y
linux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有: : @7 h% K9 q8 C* N# |0 `
( f1 W- w3 J4 k+ A运行xdm启动X window;
& o$ m( p4 @8 ?0 H. P5 @2 P运行gdm,进入gnome桌面环境; 3 @. C& l! r6 P
运行kdm进入kde桌面环境; ( G$ ?7 w0 t2 u# x3 j
自动登录进入linux;
3 O( a7 E M7 ?4 y: [. a; y- Iprefdm脚本框架大致如下: 1 I& q+ H0 _" v+ C0 c8 J/ x
0 y% e5 G M2 j, w, }) ]( m( h
#!/bin/sh
/ H; j( s# E4 K) r: H8 Y+ f& x" QPATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin " c# u3 _+ x! W6 e: ~6 l) F- G
. /etc/profile.d/lang.sh & |8 V* P" E# p2 V- e8 {* O T; f
# 第一步:查看是否为自动登录
1 w+ s5 k1 ]. o- J& eif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
% X6 x6 p$ |/ hif /usr/sbin/autologin; then : }5 I) h6 R9 ~6 @) n- R2 Y
exit 0
2 |2 T: }. y! H n% ]+ k: c3 Y% W& j4 rfi
; i: q1 R& f6 c; ^7 n0 f- ^/ l4 x9 ffi
) C0 Q6 w3 F0 Z9 J. Z5 u, N8 w" F4 l7 U) j; Z8 I: ~! B
# 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式 f/ |* L& Z/ {' g' H
......
8 j9 C3 l* y% ^2 r4 \! z# 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。 6 f3 ~/ `, S. z3 n) w
......
C1 o1 `$ c! D M4 U8 k! |6 q$ T
3 G, C5 e+ ~8 M# Y/ m
7 Y0 e, r2 h/ X; Z$ n) B8 V
" h* u! F. h: g8 R* I& j
二、自动登录的实现(autologin的实现) . H) l e# p, I% C7 K- }
5 T1 i- y" E0 Y在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。
; a* |: Q% y" J' T1 V. b
k. u2 m- r9 |5 Y/ u% s- G( N' b自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。
$ F0 o8 a# o8 Q& E5 V2 j. Y; o- T- x5 O; T m2 ?) F
Xinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。
+ u' J$ n, g4 e% F' o4 A实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。 G4 C! j! ?* N) x, f" M
startx脚本的最基本框架是: " B' @. K; ~7 h& r8 t9 |6 b: E6 ?
% Y/ t0 h' [8 D5 T: a1 }; l+ p9 g. O4 g( Ja、 寻找.xinitrc,如果没有则使用xinitrc; 3 W- P1 w5 v) j
b、 寻找.xserverrc,如果没有则使用xserverrc; Y8 `; b) U5 v& k9 v! \6 s
c、 根据找到的脚本确定xinit的参数;
4 G C: u) D7 O& d! ~+ m0 O
# Q% G0 s0 R" d8 {由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录:
4 P& ~/ x( U D! `% I
$ z- J: v9 o6 h+ p: t" R1 z5 z$ A
2 C0 q; ]& M ?2 `! Z#!/bin/sh 9 f0 P& W- H. F) F) m! R6 _
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
/ W# H( Z3 D, T; k* I, T0 z6 A& A. /etc/profile.d/lang.sh . |0 K" ]2 T5 O( \
# 第一步:查看是否为自动登录 + y$ e* C: e; ]# o2 U" O
#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
! T$ C/ t* N% v* @2 K) j#注释掉上边的条件测试,直接运行startx
. }. M4 V* G( {7 |' Gif /usr/X11R6/bin/startx; then
( @& ?9 ]' J2 N/ U2 M# O7 Nexit 0
2 ~; N0 ]& z0 m* A( R- Z3 g4 Mfi
' f$ \6 p7 ^6 s8 j& r#fi , _& ~2 Z! d8 t/ n; ]/ \3 L- q
. I+ I4 n/ n }3 _0 N2 b2 d
; D* B* h) r, U; }* L3 Y. h/ u# h) u6 F% L' a7 k
* |3 e( J0 Z6 @$ P$ p" K当然,应确保/etc/inittab中的启动级别为5。
% k2 l+ c& p% m N/ m) B( q4 P# M9 ~. @$ Q, Q
重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。 / c, N! \7 a* U9 b
) f$ W+ P; I/ w: O9 ^* {
三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。 : I5 C& Y7 y% ]5 j0 @# n! t
% m" b2 e! c! s8 |1 f观察原来/etc/X11/prefdm脚本的自动登录部分: # ^$ n5 I4 a4 T3 N
. M" ~5 r7 G y8 L q
( d( |! y/ z. u7 {5 V3 I......
) P1 ~1 _8 w8 h3 E# 第一步:查看是否为自动登录
1 ^7 H, u# |. Uif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
& c* [9 a: C: E3 j3 Aif /usr/sbin/autologin; then
/ Z3 d% s1 y4 A+ k9 H n/ eexit 0 , H( Q0 L4 L' j! {
fi ( I+ N2 q; N, G0 J. |- |0 k
fi
$ g$ w' S4 u+ Y8 d+ g' G...... - ?! h5 b5 `$ W G
: y1 A8 y3 `1 I9 r, t
5 |( H' v, r2 e0 J9 H6 a* d( M6 K
( s1 A3 I# E8 s4 {: M' q }7 N" r8 u2 w0 |. b1 s& K9 ^, D" {( Q
不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。 - E. F" \8 @' k9 w
8 X# f& n' z& S. @. f1 y
1、/etc/sysconfig/autologin配置文件的实现: ! e4 x( Y7 m x5 L# _, z
$ d# B0 M6 M: p7 q8 b
! n2 W: z; K7 i#config for autologin # H( f# Q" R, n5 }* T
USER=root N! w7 B" l0 K9 }# G
EXEC=/usr/X11R6/bin/startx
6 ?- y2 q0 \) _1 j说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。
) W# V. a9 Z4 _6 {, w. G/ N% C! o1 c* s5 k6 P5 y" Z, Y2 j3 l
! ^0 G8 f/ b/ {% K
8 b7 I( q% `! }
0 `: e4 W- h9 ?, E ^& ]" u
2、/usr/sbin/autologin可执行文件的实现: 9 n5 Z9 T- Y% u3 x5 F4 _& }
6 I" H( l: C8 W
/ f5 }* I8 D3 x6 n. e
/********************* 5 t a0 n# K. N& s. b7 m: ?: G- _
**** autologin.c **** : t9 w5 v7 D6 Z( ?2 ?
*********************/
+ P6 f+ `( f0 f0 s: V1 h#include <stdio.h>
8 \) X6 ^) ~# D2 l#include <unistd.h> % P9 B5 p: _5 z2 ^) C* @
#include <string.h> / F4 |* o+ @, e) _( W. b/ S
#include <errno.h> * [: A' [$ f0 M1 A
#include <sys/types.h> D" k7 e4 } y/ x$ ^/ s3 k) v
#include <sys/stat.h>
7 c6 k$ J* o$ n8 j! t. l) t9 \#include <pwd.h> 7 E. w* y" g ?9 _: t! o. `1 j
3 W/ i$ p8 F# j& Y O" N" Sint main(int argc, char **argv) , \& x/ {1 Z- j5 y: Z( F4 T
{ , ?6 C& s3 ?# e [7 w2 n5 p. d( e
struct stat st;
3 Z7 L- a' t k* CFILE *f;
8 |7 x f6 i! D% B* [9 d3 {( O8 cchar *cfg;
$ w# y2 l% x4 N7 O9 c* Mstruct passwd *pw; / A' e2 R1 L; P3 x
uid_t uid; 3 c* m8 D7 U0 w) u; p
gid_t gid;
* ?: ~) l7 J& l# m1 S6 ?# m( jchar *dir, *shell;
6 e8 E; W& y; {; E' Qchar *user=NULL; , z: O9 Y6 B) w! G$ q8 o
char *cmd=NULL;
4 }6 ^5 _: U3 d; E! m, O$ t. ?$ q( [# }1 X" `
user="root"; 8 X; r e! [ x, e) e* Y
/*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, e: N' V9 }; e5 v
登陆用户名应该从/etc/sysconfig/autologin中得到,
/ H' ]: p% a0 g( p" J$ }, t程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/
. b- d Y! ~, ^0 _8 lcmd="/usr/X11R6/bin/startx"; ! t8 Q3 Z: Q2 I9 j) y! _# x& c
/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/ 5 ~- o1 u- Y) m1 a" r& d% Z
' A2 l! Q" ]2 ~/ g `; J
pw = getpwnam(user); & N3 K- ~3 h% i. G% P8 B
//getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。
& X" @7 L3 f. @: D4 R4 @; g! sif(pw) {
. T o8 Q# y3 l+ ouid=pw->pw_uid;
6 m. D5 g" {" G6 Fgid=pw->pw_gid; dir=strdup(pw->pw_dir);
# p5 }# o4 x( O: A% K- W! @shell=strdup(pw->pw_shell); 7 L* L& o5 p0 `* q( b, v$ u
} 4 U7 O; x5 _$ M7 F
//获得用户相关信息
' a; V2 I( _0 E4 c* p else {
9 f7 h5 l( r+ S; z# Qprintf("ERROR: No such user %s!\n", user);
7 L8 w5 Y" ~& }, Nreturn 1;
2 q& f5 q( }& r$ }0 r}
5 P o1 m R. M0 B v
' F4 ~! I' K- D9 c0 X# uchown("/dev/console", uid, gid);
, e- Q" B0 _1 x2 Hchown("/dev/tty", uid, gid);
1 R" b8 v2 o9 K! O//为控制台和终端设置用户ID及组ID
3 w1 n/ L' C8 _( k& t; W% y$ F
; g2 a* q: I5 B//下面是设置用户相关ID
0 y& t1 j# C* _1 v8 m3 a9 `9 a' \' }setregid(gid, gid); % E+ ?" Z3 I5 T5 D/ X; W; t2 ?1 U
setegid(gid);
1 r" O' D a9 p8 W, }5 w y3 |setgid(gid); 0 b& i% q9 \; W* G
setreuid(uid, uid); & f1 {3 \5 f/ g8 p' X& `
seteuid(uid); $ t ?2 ^; |7 ~9 U p8 A; g
setuid(uid);
$ a! Z4 e( h( w0 f/ g
# t* X7 c8 e( r5 ?+ a S- vsetenv("HOME", dir, 1);
H/ w% _5 |# ~9 L* Ysetenv("SHELL", shell, 1); & k$ ]4 t& N6 C9 a; u y. V" g
setenv("USER", user, 1); & k' T, S- U. E$ [/ k2 _& F; y' ?2 K
setenv("LOGNAME", user, 1); % Q1 I3 b7 q3 R, `5 Q6 M( u
//设置用户相关环境变量 : r% A" k2 n9 ^+ I- z
; ]; f1 D ]( W5 `chdir(dir); # t/ b6 y: w4 u/ O
//切换到用户根目录
5 F# r! D7 \8 Y5 X8 _user=NULL;
: o( ^1 U6 y2 P* b" z. G6 V
, M: W0 f) T2 Q" P! }% m# s Sexecvp(cmd, argv);
1 \- h0 }# E. N* S/*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */
; _+ n, n9 S3 H+ E+ ]0 N: q9 r) Nprintf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno));
. F: F. {+ @5 b0 Q* U6 [" T1 W1 }return 2; & M. N+ h2 d% [
} . O( d4 f k- P7 V
l0 a3 S' o! Q# [ K2 W 2 L5 T; F! c% y) `; N% v6 Q( w% y
+ X/ l! i8 \1 x1 V
2 ^ V8 L/ i/ I运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。 % O# y7 f: G( w( C
7 E, O0 N2 i" }! \7 K5 p8 E
如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下:
& u9 b9 G) O/ k8 E- V) L7 V0 y6 h+ E+ w1 m
% L0 t) i: u: ?0 ]5 ]...... 0 i% ?9 o3 K; U4 i% \2 v! j
# 第一步:查看是否为自动登录 p$ l7 o$ e- I( u* j
if /usr/sbin/autologin; then
% m9 j6 J/ s1 y- l/ Y% Kexit 0
2 v; l3 H1 [% M% W! x8 P/ hfi / } A: h6 C" c, C3 z/ P$ V+ p
//第二步 ......
: M9 i" K+ ?' \% [4 A' A...... . ~! a. f; ?+ k& _; y* b Y
3 b: Y8 ]7 X/ Z
0 [5 O7 ^' c) I- f l8 g" h
$ j) U4 K- Y( `2 r; p- A5 G1 {4 ~% J, O
即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。 7 c! Q# o' B# T" c$ J6 x- x
7 [% J2 J* p; L* d2 _2 ]四、选择进入kde或者gnome,并自动启动X window应用程序
; s. G( c9 L2 V p$ u( a" N+ w( l' k+ w4 P9 x# W. c2 s) _
如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。 2 ~* h' A# W6 [$ E! H. G- @. }
一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。 ' L3 {2 E: a5 E% u8 o, Z U1 a
; ^5 X2 Z$ D& G% N P+ p) K7 i& J; S% T
http://www-900.ibm.com/developerWorks/cn/linux/l-tip-prompt/tip20/index.shtml |
|