- 在线时间
- 63 小时
- 最后登录
- 2019-5-3
- 注册时间
- 2004-5-10
- 听众数
- 442
- 收听数
- 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)
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 <stdio.h>
9 I' f6 H/ r) \( T1 a0 q) e#include <unistd.h> 0 _5 Q, K& n' @6 d; z
#include <string.h> ( z0 I6 L7 W" n: M5 C# S
#include <errno.h>
* w) M/ w% g; G5 R7 D9 K#include <sys/types.h>
* f& O* r2 [ S" b n: C( B* b#include <sys/stat.h> # }: l N1 X G: x
#include <pwd.h> . 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->pw_uid;
5 r) v& H0 ^3 bgid=pw->pw_gid; dir=strdup(pw->pw_dir); - l3 P) Q/ F0 z8 u
shell=strdup(pw->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 |
|