- 在线时间
- 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)
5 G5 o+ a2 s _' G$ b3 [% b8 L
3 o# u( P; F" G3 `" ~( W* j机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。
1 o5 i/ b8 j% Z( d6 D一、linux启动的最后阶段的工作
( J6 y: ]8 s3 D* ?9 O; ~( B( z: h( I, C u9 x
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 e) j/ ^% Z* Q' X; g) b1 k& s
4 J4 c& [- J7 C4 L
运行xdm启动X window; * _, Y* C L% x4 Z3 b
运行gdm,进入gnome桌面环境; ' Q- A, W' b4 {! X# P7 k& |# A! Y# e
运行kdm进入kde桌面环境;
1 G; G3 R9 l7 ^' w7 G$ O; n: b k# H自动登录进入linux;
# q. q; ?' F' X$ q- aprefdm脚本框架大致如下: 6 S8 M6 D4 F% {0 b- [. r* p( L, Q
1 I0 G! N9 q) A7 t' Q& s
#!/bin/sh 6 ^; s r/ K" ]
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
! ]7 M* C- l& C5 g$ v( A. /etc/profile.d/lang.sh
7 x0 f, ], L# A# 第一步:查看是否为自动登录 + M# I' g4 t) L/ x8 D" \) u2 {& V
if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then ) m0 H6 j2 v; |5 G5 R
if /usr/sbin/autologin; then 8 T& d0 N7 l/ z1 M
exit 0 # s$ W. ^8 }! i' |! H* H
fi / r/ B. M K& o& Y
fi
: M3 s! W2 B I. N, v
1 `( A& R! y7 x1 ]. }4 m, C& s# 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式 " b9 B& l4 g+ Z, S
...... 8 \& o% a4 |: u
# 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。
5 ]7 p3 G/ ]' e4 D: e& w......
$ d& ^ d! J9 _# U
! G- Z& ^* D9 a4 u 4 N) _- N0 _/ S& p3 o
8 X0 o% V8 A8 O
2 F& H \+ T9 t二、自动登录的实现(autologin的实现)
& [& H0 l5 v" l5 A* Y
$ F( I& N; T% e% q* `在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。
/ C) B$ ^. u- k M- b& N* x/ \1 L0 G3 g9 w7 M0 \ H) h
自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。 9 z% J8 Q. ^; f" Q; w
- {$ |0 J4 @' M& h( q$ eXinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。
) V2 c4 m; D4 z" Z实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。
2 X% p; a. @! pstartx脚本的最基本框架是: d6 n, D8 _' C) f$ z$ T+ M" P" X
/ l, V3 { v9 ?9 }( m) \% x" Ha、 寻找.xinitrc,如果没有则使用xinitrc;
3 e7 ?* w3 n3 I# A9 eb、 寻找.xserverrc,如果没有则使用xserverrc; 4 {) p# z( E: A- [2 l
c、 根据找到的脚本确定xinit的参数; ( W& g( T9 g9 L4 U& l7 N- H
. S U* F9 z4 t9 l由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录: , \' {# }8 {4 ^* ]% E1 k4 W
! i/ E4 H ]% ^5 {7 h1 C
' [1 n) L1 |; d& q! B#!/bin/sh ; |. |1 j5 B. O6 G
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
9 G4 Z( S3 ~0 S3 }. /etc/profile.d/lang.sh : u, T+ g8 O4 b+ \" w. A% S
# 第一步:查看是否为自动登录
4 L3 i' R. V* w2 ~" Q! q#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then ) y( C0 _1 g8 i
#注释掉上边的条件测试,直接运行startx % A9 c) m- a( v: V) L
if /usr/X11R6/bin/startx; then
% F0 [3 s* ], s9 [1 \exit 0
6 t4 h8 L: F) c% \% z! Lfi
, h6 p: x& s5 T1 j#fi / u+ m: Q! C/ i2 O5 n, w
) u L9 D# I" i 9 ^9 \0 @3 m* k( w, K
( C! `3 G0 n) D8 b# I; s. N# |
3 n( t3 ~) L1 H* z. D当然,应确保/etc/inittab中的启动级别为5。 ( d# S8 O# z* Y7 Q) |* a
" L8 E* f9 v- I; h- V
重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。 1 m: i* O- \. Q/ b; X
+ H- m0 M0 m0 t$ r2 Y三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。
2 |% X, a# t. A) g" J; R
+ T3 R1 x- p S3 r, ^# K观察原来/etc/X11/prefdm脚本的自动登录部分:
& ~, N! }( o$ z% J6 N8 t- i& X8 e$ k4 F
0 L, E. Y p9 E k# h: n# Y; B( @......
4 T* k2 s( `2 x# 第一步:查看是否为自动登录 ) ]2 x! u+ ?2 U0 m
if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
0 ~2 @4 z/ H& hif /usr/sbin/autologin; then 7 h: g3 i% S. j6 t' g+ a- E. r" f8 c1 e
exit 0 1 Q, c$ r' s2 ~& P
fi i6 x' ]+ w$ r2 N, L
fi
* A& C5 h7 X: C u; k......
9 ?4 W! i! ]0 E* Q' J5 d' D' r% l( r0 i' [; p# P! b
+ \2 X1 P: F9 S+ e
9 {/ i& H, c8 [% g" F3 B/ m- C
4 r# h* b `! z4 d& Q6 y+ I9 K" `' v不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。 8 P( @) P0 e8 I, s* q9 F; p- t
2 Q4 J! y$ V. V: a1、/etc/sysconfig/autologin配置文件的实现: * K0 X1 x4 E4 _- @1 y
5 z" I) C( s$ e& r
2 k4 v- F- ?/ N5 b' H0 A! i
#config for autologin 7 D& _* W# z- y$ X
USER=root & d. @4 [, G) I4 x# j4 V% T; `
EXEC=/usr/X11R6/bin/startx 2 a* y6 a! W; a1 r0 ~2 g
说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。
3 ]( n. r( }; H, E# k+ E9 y$ t4 |
9 ?5 a3 c: D: w3 m5 Z
F: J* G/ B" w) p$ I* Q
& {0 [/ |) x' V; X& u
+ @! n8 H: J: P5 W; _2、/usr/sbin/autologin可执行文件的实现: ; o1 [' K/ ^% `1 p) T3 V- c
& L5 p! r; c% ~- Y8 h- m/ L0 Q7 d
5 F. R+ z ~ o7 w, e8 X0 T/********************* ; g' ?& o$ ?) X6 `4 m
**** autologin.c ****
/ q+ Y" D/ B( n/ ?*********************/ . s6 J" C8 x L$ K# j
#include <stdio.h> ; m6 |; `# s3 S5 o, ]! u
#include <unistd.h> ' j, B2 z; V9 d: V2 g
#include <string.h> / @. o* U, M& x5 g' r: V7 K
#include <errno.h> + V2 i' D3 }$ D4 z% H
#include <sys/types.h>
: r3 X$ M! n! a5 l* l% }* g3 v#include <sys/stat.h>
5 m) z0 @% ^1 p" U5 w. e' E0 _#include <pwd.h> # {& h- w. Y, k9 b' s! T
/ X, t) `' L- t: ^1 f
int main(int argc, char **argv) ( F2 j4 d, _) L/ p3 D
{
1 O$ j# F( K2 I0 q4 Mstruct stat st; & M, T5 ?5 L$ K, W6 i9 |
FILE *f; 6 m4 L8 C/ _' i
char *cfg;
6 ^& H! ?4 B9 A% S" c2 estruct passwd *pw; 0 |; z$ b+ R" z' o$ w+ w
uid_t uid; * y9 }$ V- j: y0 R7 m5 y' S) P" I
gid_t gid; : \9 O- @$ J3 U3 U' \( c; R2 b, B
char *dir, *shell; ) s- A* ]3 }* t4 r: F1 ~3 w1 B$ F- J6 P
char *user=NULL;
! l6 C) [' [5 p/ ^" N3 P6 w6 Mchar *cmd=NULL; 9 f3 i6 w8 R; W8 W2 d$ @, T( k7 |
1 g) |( h( ^* f3 T4 T ~- h1 W4 ^
user="root";
! _) ?0 d( _* v8 R( v& ?/*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, 8 r% ^2 R, y9 k9 C. r
登陆用户名应该从/etc/sysconfig/autologin中得到,
. H# w( w0 x2 l程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/ + g( P7 g7 g# S) |- p& X
cmd="/usr/X11R6/bin/startx";
4 o8 U4 H( n `8 D+ Q/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/ 2 F/ f1 s8 v" X3 l) u2 n2 m. d& k
. Q6 t2 M4 g5 R: I8 Ppw = getpwnam(user);
4 G3 A' G! e/ o2 D- N3 f4 a//getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。
* |9 k/ i/ j0 B8 [' }; qif(pw) {
( c7 Q' y7 ?( l4 a4 \: kuid=pw->pw_uid;
6 |( j8 ], K0 J7 ?2 ?8 ]gid=pw->pw_gid; dir=strdup(pw->pw_dir);
) @3 Y5 U4 y# d: v- L; d) J: _$ P( }shell=strdup(pw->pw_shell); ! B9 s7 N% B3 ]; X0 `1 A1 \7 J5 `
}
& N. u7 }% t+ }& P0 d w2 g8 U. r# C5 D//获得用户相关信息
, z: ]+ t* l7 h9 t( E! K+ r0 A7 ? else {
# _" d9 r/ M. qprintf("ERROR: No such user %s!\n", user); : P9 ]# _8 i3 P- d# L* ]% z& y
return 1; # x- M: P/ `: c% q5 W1 [
} 0 W% A4 r' p/ S3 p: u$ I; b' P( o
% |9 ^ x, g+ p8 @) E6 L7 t
chown("/dev/console", uid, gid);
4 e8 o5 N4 }8 g4 Pchown("/dev/tty", uid, gid); ( T, c P( e: m1 }' ]1 y1 Q
//为控制台和终端设置用户ID及组ID
' B- N) ^! H# [% E4 g, |9 Z
/ H( ?6 d/ z1 }/ g6 y//下面是设置用户相关ID 5 ~9 {- f8 `3 ]: a) {6 m! i
setregid(gid, gid);
, Z" L! T5 G. y+ I& D" [setegid(gid); ( D: M1 W$ K. p. V* o u) ^+ ]+ S
setgid(gid); 5 y$ o( l' S( L
setreuid(uid, uid);
4 i; x5 G) I2 a( o% D+ k* y+ @- {. L7 Iseteuid(uid);
) r9 ^3 {! U5 y; }. v/ Ksetuid(uid);
9 ?" Y) Z3 g! Q( ^4 a. u. m- m3 F& M" _$ G0 f8 t
setenv("HOME", dir, 1);
5 {& F/ q# ^, w* ~- ~6 u. zsetenv("SHELL", shell, 1); . J9 r) e' z2 e( n% [. X: \
setenv("USER", user, 1); % R! `0 m0 r& J2 r3 E
setenv("LOGNAME", user, 1); 7 S3 {3 n! i9 e7 A
//设置用户相关环境变量 6 P& o4 `6 o' \1 `3 |+ o4 p$ h5 E9 l
0 I8 c: u' _3 f) cchdir(dir); 3 z; J4 m3 q/ M* ]0 l% \
//切换到用户根目录 e8 i" Y% q6 g/ v+ Y4 j2 ^/ @
user=NULL;
+ }/ w1 B8 U8 ]7 k/ J7 G) b
6 @' ]. @. d/ T% nexecvp(cmd, argv); 6 y6 Q2 v- s0 u% k. X
/*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */ 0 ~6 ?! {% Q9 w9 ?( z- _9 P: `
printf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno));
, u4 L' s) l; {0 p) areturn 2; ( o$ D. N4 b% }8 o9 ?
}
( K* [, k, P! S3 W
# \$ n$ L+ J" t3 A- E6 k o: n " A; z4 q! l' i' @5 T/ t5 h
9 c" L# ~$ e7 g( h& E
4 r4 }9 B! W# s运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。 + Q3 z8 L8 i$ a7 ~& L) R
3 W+ T2 z6 \2 ` r9 G; _
如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下:
6 s- M- }3 v# }6 B3 I! t" J
( j; D7 K4 d; c( q2 A; b1 w4 @3 {* C% z9 w S
......
+ V, u( q5 E5 _4 [# 第一步:查看是否为自动登录
; n9 u5 l: v: xif /usr/sbin/autologin; then 9 o( \' j. q' Q9 o. ?% o2 [+ s
exit 0
2 y8 P# @. {1 {; f- ~3 U$ C/ }fi 5 I2 Z/ x3 l4 v" {
//第二步 ......
1 O3 i" x7 q) v+ ^...... ' X4 C; t5 M! J! @ q, z8 |
9 Z% {8 N$ }9 _% q( \* |
- z N1 r L R4 `. O3 t
! n3 ]& q& b3 h6 O
0 }1 y, E' H3 M+ M' v, M& r/ a# v即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。
2 \2 \6 x# {3 N, m( w$ H. C, u
$ {* a. _* D% [* x6 y四、选择进入kde或者gnome,并自动启动X window应用程序
! b8 X* q2 i* \( W) t+ o2 P$ }% l. R* A- s2 \7 x
如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。 ; J! Z2 ?8 }3 q: L* ~; X
一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。
* T& j; u6 y$ J, e' M# D
( A6 v. I4 f. x" W6 R t4 ^* o: v& [% q( C) `
http://www-900.ibm.com/developerWorks/cn/linux/l-tip-prompt/tip20/index.shtml |
|