- 在线时间
- 63 小时
- 最后登录
- 2019-5-3
- 注册时间
- 2004-5-10
- 听众数
- 442
- 收听数
- 0
- 能力
- -250 分
- 体力
- 10122 点
- 威望
- -12 点
- 阅读权限
- 150
- 积分
- -586
- 相册
- 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) 9 o# x5 \, G7 u3 ~% s9 l
! N+ K- c' Z8 @' f; n7 I+ h机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。
2 @" ?% R$ n0 j. u5 @' V! l, e一、linux启动的最后阶段的工作
* R4 Y9 n8 @4 X7 C0 A+ M
$ d7 i' k, _* N" X- mlinux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有: - s" a4 N0 A3 g6 T3 E
, Z0 A$ ~* J) d7 q/ k. J1 z& O
运行xdm启动X window; ( [/ ]! R% {5 L
运行gdm,进入gnome桌面环境;
+ }( z5 ^5 ^" i运行kdm进入kde桌面环境;
0 y+ |* p, `1 p# y4 Z+ k) g自动登录进入linux;
! B6 n. v0 p F. G5 Wprefdm脚本框架大致如下: 1 x- s. k3 [( g$ v0 m- N2 i# }
8 Q+ f. j W4 H; A#!/bin/sh
; b# o: [: z7 W3 l7 w6 jPATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
5 r! J1 ~% F; V, z4 |* B5 P. /etc/profile.d/lang.sh
4 T9 W w/ p* s# U, D1 E% T# 第一步:查看是否为自动登录
s \( J( |: b/ Fif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then / V; r( W+ X1 W* Z; q. `+ | q
if /usr/sbin/autologin; then + _" w- M' c% T9 M( [1 W
exit 0
# M6 \4 W1 O" Ffi & [1 F& |: F, P( f- G' f
fi
, Y. O7 ^$ C/ P2 ^: I( f+ z
3 X* R/ C" Y6 Z* m: r9 e# 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式 5 b: k8 d+ k$ Q) A8 ]; Q/ p7 W* |
......
. {( |8 O4 F& |1 i1 `! Z3 S# 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。
$ ?" o' ^9 m, F0 \...... ( w2 q5 {# z* a( O' V4 S1 D
( _! \4 X- G- j O$ o5 J/ ?
$ `: X0 {6 m3 T" |9 ?& U; p4 w7 n! t) c
( X* B+ S' k8 H$ A
二、自动登录的实现(autologin的实现) 7 d! }5 g& N& u: v& J! Q1 o
3 r8 E) y& A! ~/ z/ q7 O9 y在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。 ' p1 U- T. \8 z+ _& ]+ S }
1 {0 o% Z8 K/ y5 T自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。
5 L2 R/ A0 A. k' n
! }$ W6 n6 c4 Z4 _+ O8 d8 VXinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。
* n& y9 n) g2 W4 W& ]9 Z5 G+ ~, u- S* D实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。
) o" s: w* p' q: M3 V+ Bstartx脚本的最基本框架是:
1 h' J% y2 T5 P0 _, N- l8 I+ h: c' X& ~
a、 寻找.xinitrc,如果没有则使用xinitrc;
. b$ N$ {+ j3 W, x- eb、 寻找.xserverrc,如果没有则使用xserverrc; - q4 X3 i" B! ^8 k$ r9 U$ C
c、 根据找到的脚本确定xinit的参数;
* E3 r% V2 W$ E! B# b: ^
4 d) q- a9 r& M8 r' n4 z9 R. ]. [由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录: # a" f, H; G& e$ Y
* S' k' i. _, t- o) L! i1 C! u) N& C b; E2 r& B4 E
#!/bin/sh : [( G, R$ g) N
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
: c7 a* L- n+ Q' T4 M6 c5 J D. /etc/profile.d/lang.sh ) L1 P, A% K5 _! \, o0 T7 [
# 第一步:查看是否为自动登录
% x9 D4 g+ `+ T7 U) ]9 v5 p. \#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then " U! j% D) j @3 g, S6 P# H7 ?' I
#注释掉上边的条件测试,直接运行startx , q. G6 C! t' ]/ c W9 A
if /usr/X11R6/bin/startx; then ' s+ D# ^$ _9 F' f* ^* M
exit 0
$ y. Z7 g$ y8 t/ W* Nfi 6 v& B5 C- A2 s2 l
#fi
. q9 n- V3 H: N% B% D+ H% \; A+ ~# ]" l, l7 j( n, ?. w. ^2 B$ z
: p" H& ]: s' T3 d ^9 Y
3 S3 ?, g9 V5 x" `' D
4 p7 O: X8 Z, V7 Y" h" i6 G1 H) O$ k+ d当然,应确保/etc/inittab中的启动级别为5。 & B/ x, n2 N, B! D, a
- }' B3 I# \" l& w% o( R重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。 . j$ R; j6 [2 l' C1 ~5 V* S+ ~/ e
* f7 K& I, J# F# P% k. _, H$ v0 h- ?) ]8 N
三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。 ) j- E$ E% V! @$ Y- |
' Q8 `1 s7 b$ K# t* K* {观察原来/etc/X11/prefdm脚本的自动登录部分: ; [7 i0 P& T5 N! q# A( k9 U4 R- f! O( b
. S. a! G5 O- _ q' D
& h4 A3 G$ B2 { e! L8 t6 K...... 2 P' }8 f. |% B8 z0 ~- Z. m
# 第一步:查看是否为自动登录 5 d2 l3 B8 }' i7 o/ m, s j2 J
if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then & s7 @0 d4 U: I: g7 K) L
if /usr/sbin/autologin; then 4 _! J3 g# U4 F: i
exit 0 # g5 |6 |6 w0 i+ a
fi * ?* [- q' T& u2 t3 w
fi 1 y# Q% }& p0 B# n. i! l9 k3 f4 b/ c8 b
......
$ G& h/ W$ p) K4 q2 P4 p
6 a/ e* W* b2 `# D: E; }4 B
0 P1 T @0 y2 T/ Z! W3 e
( Q. j& z4 B" R, H8 A
, u$ I3 l6 _9 C. M6 M! M# u% \不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。 * h9 c5 d7 a1 `& t3 O
2 s+ n' \# ?. \: `9 u0 v
1、/etc/sysconfig/autologin配置文件的实现:
- x( N; c# @* e: _! k1 y' u1 d' o2 f
; A) @6 A: h/ J% E) W) z" V# x
#config for autologin . i: b# o9 g* v+ ~' Z1 ?/ B Y! O0 l) s
USER=root ) p- ~7 N6 C, M6 U# L
EXEC=/usr/X11R6/bin/startx
3 t' y) Q: d! _, P说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。 ( X! s( D, g+ |5 O" C4 D
~& f; a$ ~2 }) s& }* h/ _ v" b) Z6 E' F) R3 V- w+ p
6 h5 \6 Q7 B6 V! S2 O* b
0 Q5 o1 E7 _! H2、/usr/sbin/autologin可执行文件的实现:
2 r" Y' e1 \' T1 w7 ]
2 P. |. s3 q; B1 y( f+ V! M" Y
+ ^5 x- Q# t& s# S4 @/*********************
5 i1 \, n8 V% D( \7 d**** autologin.c **** : s" l: [: `2 K( I& @
*********************/ 4 E5 m2 r& [! p% P
#include <stdio.h>
6 d+ X2 o: j4 q( K#include <unistd.h> - s4 z8 o* g! u3 \0 e/ a4 q% x7 R
#include <string.h> 8 M4 _$ k8 y! ?- z. [7 E
#include <errno.h>
' ]! g Q, @7 q/ \#include <sys/types.h>
7 x7 |, d/ Q$ Q#include <sys/stat.h> 9 d" D7 e7 ]5 f6 U
#include <pwd.h>
s( I6 S" ?/ E9 H& [7 d @ f: @" f- U) A) F" m8 M! W
int main(int argc, char **argv)
+ S8 @3 o" t. e% U/ [0 F{
6 [5 U, C' w3 o, p+ \struct stat st;
z5 z+ v" w6 h6 i9 K1 jFILE *f;
# z% Q9 U" l& y8 W2 achar *cfg; $ B! `# Z; F& B0 G
struct passwd *pw;
$ \% C: B! i5 i4 y- uuid_t uid;
! u7 x- d4 F. q# X3 Fgid_t gid; % H2 F" r; J5 d
char *dir, *shell; 1 y5 n5 T) P: n: z8 K$ K
char *user=NULL; 5 y- w/ u$ _+ [6 e9 \+ E; B% w
char *cmd=NULL;
- ^7 h( V1 M1 j7 \1 F
" s* r! b# R; ^5 quser="root"; ) z+ }; O9 Z1 ^" u7 T1 v' n
/*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, " w: r, v. O' C3 N$ S4 Q2 G
登陆用户名应该从/etc/sysconfig/autologin中得到, ; l1 E; d: z& F8 G0 K" a
程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/ ! b- T, [: W8 E
cmd="/usr/X11R6/bin/startx";
1 c' {8 v9 B0 f; b" m; I; F: {9 x c/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/ 9 Q3 B+ G- w$ a. H2 R
: T# d! V" ?3 B( L- J% Wpw = getpwnam(user);
* j2 m# P: L- `3 H, \# ?//getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。 5 ~" d+ Z( i# @& O1 b
if(pw) {
: X& X3 f' W4 ^& V( H6 b; `" Wuid=pw->pw_uid; 5 j \, O/ B+ b
gid=pw->pw_gid; dir=strdup(pw->pw_dir);
# B4 I& A' C8 K; a: W& Jshell=strdup(pw->pw_shell);
6 A1 ?' ?1 n& M; Y$ M9 d0 n} A& O4 G. l3 {: M- `
//获得用户相关信息
2 P' B& ~' s6 X, ^& V0 ]' J7 R! q+ y else { 5 s. y( _ o$ U9 x
printf("ERROR: No such user %s!\n", user); q% z% t: b8 O( d
return 1; , f9 B: ]3 t) d7 M
}
$ s4 G/ W/ j- Y& V' Q- D7 ]1 u' i, D( o8 e
chown("/dev/console", uid, gid); ! E \% t+ J' S# c; x+ L
chown("/dev/tty", uid, gid);
. ~0 c2 N# z! ~( Z9 c" p4 ~9 ?5 I//为控制台和终端设置用户ID及组ID * S/ I! W2 n# _: C3 O
3 g) a" ^" E: W2 D" C1 e//下面是设置用户相关ID
/ o; n, G8 {, v9 l7 p+ Gsetregid(gid, gid); 7 x* s% T& M8 w/ w
setegid(gid);
4 Z) I' k4 g5 v/ q7 qsetgid(gid); 6 v+ t, W8 P$ y. U# J+ G( v& a2 t7 K
setreuid(uid, uid);
) [" t8 Y+ j9 Sseteuid(uid); - f v6 p# h" `$ u
setuid(uid); 9 u. Z5 Y1 ~( ~& }
$ Y, u! w# M: a" \setenv("HOME", dir, 1);
' X8 J( S! T6 `# i7 isetenv("SHELL", shell, 1);
* ?5 d2 K- N! O& M7 k6 |7 z" Usetenv("USER", user, 1); 7 w1 ]8 G% A4 u c8 m% X- `
setenv("LOGNAME", user, 1);
9 u2 W4 G3 W" Y- y+ @& p//设置用户相关环境变量
& B* E/ Z+ [; g% s6 Z1 d+ ]5 W
$ |. _ e9 u6 O+ z; m8 G9 dchdir(dir);
4 |6 X( r5 R' |2 A//切换到用户根目录 $ l& m3 w) s+ I/ K
user=NULL;
* S7 a5 P' H9 q1 v$ P
, f6 B+ ]7 O4 F; A$ I; v- Lexecvp(cmd, argv); 2 i: z+ j0 p2 t& R0 i& C
/*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */
$ p% |8 f* \" L0 l+ b. ^printf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno));
. E! O+ f0 k8 e8 I4 h1 Lreturn 2;
- P5 s1 u: _! n! i& J- v5 _} ) C: p1 G# t' ]+ A" q6 w
6 }& S& h, Q* c; z7 k5 J9 a
4 K0 ?6 }' `& _
! W& N3 r3 a4 W4 G; @% n. E4 A8 z, K/ L7 T9 t; }
运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。
3 S% H" e" V1 U
# ~( V* X! X6 y9 _1 k6 Z! J如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下:
1 F- A9 C& R* _" \6 [1 N4 ]$ a: r, M. G
: _9 n1 i% a$ \; L- a" _4 ^/ j
...... & U, o/ V( W/ g% w- S. r" j4 X
# 第一步:查看是否为自动登录 # W9 K7 P9 ?- k) d
if /usr/sbin/autologin; then
& ?* v, c' g, ?exit 0 ; ?* `: ~8 P& R. K, F
fi % L# f& T. M# _3 f$ d4 _- v6 M
//第二步 ......
9 K! r; O7 u) }, X8 l6 o; H...... , o" \5 ~# t" K5 g+ h
2 ?3 h1 m0 O# o) I2 s
6 ~4 m* a+ N l" L2 F( Q; h7 e1 B; I0 V; W; u
1 x* G( Q8 q, I* p& U即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。
+ B8 R" p g1 s& m+ O9 E# r3 Q( `2 @3 ?5 y$ n5 g+ K% M
四、选择进入kde或者gnome,并自动启动X window应用程序
1 b9 j4 n, h# m" r- D" }) s" m9 q- G0 k" p0 }1 p0 E+ T
如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。
( q' N- l5 p2 n一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。 , T6 l% x* X: D1 `
' V4 K# I- R- C- h( U
; G C- [) Y( D$ f( C! V3 Ohttp://www-900.ibm.com/developerWorks/cn/linux/l-tip-prompt/tip20/index.shtml |
|