- 在线时间
- 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) ( v0 ^# n8 B! e9 v% B6 g
5 I% K& h2 s0 J* ~5 e: @
机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。 & W! S A- L+ s2 V; |
一、linux启动的最后阶段的工作
) O" M# G/ f( s; M
, \( |. V/ S& p4 \" dlinux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有: 3 `: [8 W4 G4 \" t
3 I/ Z: a$ v* n运行xdm启动X window; 5 f1 C7 R" j! P: N# p
运行gdm,进入gnome桌面环境; & `: C9 \% U8 ~7 @2 p
运行kdm进入kde桌面环境; 6 a6 k. f7 B8 B8 I1 X
自动登录进入linux; * K0 M [$ D b( z
prefdm脚本框架大致如下: ( O) Z4 \( @4 Z* ]
5 F0 R$ {* P/ h, y, e' p; z% M#!/bin/sh
) Q+ _ ]4 D2 O g6 S* y7 u% vPATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin ! l9 ~% O# a! N# b& M, g3 A% @+ ?2 d* E
. /etc/profile.d/lang.sh : T u; n/ V! _% D" `
# 第一步:查看是否为自动登录
0 X& N$ X* K% T. J& o1 m4 {4 Aif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then % A# T, s, s/ ` m/ R
if /usr/sbin/autologin; then 4 u/ {0 J# d6 L7 e# M
exit 0 * Z! _6 d* y2 X# \. v1 Y
fi
: I+ U; z' V2 N% ^* X% A, gfi
. M+ f& C! S; p4 {( K+ f- S
! C! c! N4 R ]# i4 E, \# 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式
* ~: N- ~: h$ [4 u: c$ q$ }& D...... 8 k: O& Z8 @ r3 _) Y: |
# 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。 . U+ o- n2 p- k; c2 s; Q- B: y, j
...... 4 \, @0 i8 U* L" {$ C
1 ~- U" K; T4 {0 q4 P" o+ b
, W$ c4 g1 \, Y8 J, D( \6 g
8 F% ^" v2 ^3 `/ N! K" [0 d9 r0 D- P, i/ A2 _ Y# y
二、自动登录的实现(autologin的实现) . X! A; O- E% X: }1 y ]
8 v5 D; r5 o' T) ` X* q
在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。
+ Y6 Q9 Z* A( A; M5 x( @6 h+ L k! e
, X# n4 ~5 U0 K [; `" @ P2 W自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。 [! ?/ f9 n3 F! L p+ S" s
# G2 _+ p. x' D1 {
Xinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。
: y. \/ [8 m; L' |; O. f实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。 + V5 B; t7 S: H! w5 w
startx脚本的最基本框架是: + m& {. e2 z' T+ m0 [
) k1 z" E" z: h& P# }. ]a、 寻找.xinitrc,如果没有则使用xinitrc;
I2 x0 q; K' y5 B; s; k% @1 Jb、 寻找.xserverrc,如果没有则使用xserverrc; : M; C3 b* |* ]0 w' h; C
c、 根据找到的脚本确定xinit的参数; 1 t% @9 ^) ?1 q$ ^
; `3 s# e! |1 b" ^9 ^' M
由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录: w* e+ P$ w' q" g" y
& {0 b5 P6 }8 y) {; n A. A
$ d, j3 O/ [& i1 k: r#!/bin/sh + [$ L" `- [( B8 {& w
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin 0 z4 U6 J6 E' o0 x
. /etc/profile.d/lang.sh " a4 g( n o7 u+ @* z
# 第一步:查看是否为自动登录
" I% H- F' N" ^#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then ! z& B U& G$ H* |7 i/ b _$ h$ C
#注释掉上边的条件测试,直接运行startx
- a0 ^1 T9 f0 Dif /usr/X11R6/bin/startx; then 0 v) L" ?/ u3 S, o& v$ |
exit 0 ! x8 t! D8 @) ` L& M' x
fi ' m/ h! n; p% R, H4 V! k1 `
#fi + K4 k# Q2 o( T, M8 R
2 V" A, E O; ~" t/ D: }$ _5 Z
' J7 b# A& T% K4 ^+ _% v9 ~/ v/ `6 ?8 h
' c# J- g, ]2 y当然,应确保/etc/inittab中的启动级别为5。 " C, {) ^1 \" ^+ ~9 U; N1 [
6 e' C* z- o. ^1 ^" [- L2 |
重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。
5 n! m% ^; X1 ~, J! l
* m1 f5 W$ ]6 u: f三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。 ! p' O# v' l& A) S x5 ^1 H
- E P: i, ~9 g/ l7 n7 Q
观察原来/etc/X11/prefdm脚本的自动登录部分: ) }2 d) I+ T' ]4 l4 d+ E% K* L
! }, _7 L- J* j' ]: V1 @1 O0 Z1 f: z% ~
......
% `9 W! a+ ~) _) X6 P# 第一步:查看是否为自动登录
* \5 _7 H+ Q# U4 r; aif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then 2 \8 X1 {5 j% q& Z8 n' p* z1 t
if /usr/sbin/autologin; then + V/ U& A/ m! H! c0 i
exit 0 0 i, b9 m% O$ m" {, a
fi $ i) F3 M- A9 v: b: @
fi
- B3 |% A# R6 b......
! G! l4 s+ u: Z. E' W- l
" \: G% L& }. e3 L. Z 6 m5 v# @2 j# ?5 V6 [( u# ^
* E, I! Z9 _ o0 b" X
% e: w O& _, \. u) I: ~不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。 0 ~& X4 K) k6 B2 a! M
! w9 K# Q8 E/ P# c1、/etc/sysconfig/autologin配置文件的实现: 3 _( |6 |# o! D# u8 P# a D
& R: v4 h3 r+ P1 ]( F, ?- [
- O) m1 Z# w; b2 ]% V6 G#config for autologin
2 i0 w+ l/ ~' \. J( DUSER=root
3 K; q3 R# z) L( L, v X4 R) HEXEC=/usr/X11R6/bin/startx
' A; {. w# ?3 O5 }说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。 2 z6 `4 M/ T3 c/ y
0 m9 B! f; X, F% }5 A
# g' _& D- ^, U' @5 a/ e. Y
* n0 D6 C" v( [1 [- u' A# e
3 z& ?% s) L" ?- s* i9 m) S2、/usr/sbin/autologin可执行文件的实现: - m4 a9 K' l8 g3 F
8 l3 R: u7 O8 I. M% \
& H4 ]( _; r+ ^3 g/********************* % o$ H- Y" f+ w# p+ Z0 z. i. j9 g
**** autologin.c **** 2 j( S3 J* n, Y; |( r" o* U
*********************/ . w: p2 l2 }! ]' L: b
#include <stdio.h> 2 q/ _1 T7 I4 g K) W
#include <unistd.h>
2 R& O" r- I" }$ v#include <string.h>
# I6 Z8 ^% {' k2 f#include <errno.h> 0 N# L" G* l1 a7 C F( V1 R, m# M
#include <sys/types.h>
1 P# x- B) V5 Q$ t9 |; D! }#include <sys/stat.h> . p8 q6 V) q9 K7 G) _6 S
#include <pwd.h>
! n) T8 K! R: B& Q# c. O t
, u1 u2 C+ u- i# w: H3 Hint main(int argc, char **argv)
8 r1 J1 J% q7 Q% s2 t* P, N0 @{ ) B! B; y7 R( a5 p6 ]
struct stat st;
m: I8 U8 X4 a4 Z8 D& P9 MFILE *f;
v" k+ r) o; p1 I; Schar *cfg; $ M$ Q% @, [8 Z0 U
struct passwd *pw; 5 m O @" T7 V4 {7 q+ o; T) V
uid_t uid;
+ V3 N# o6 I' |% \' j I# e" v' Dgid_t gid;
! k3 {! P, P1 w* d% dchar *dir, *shell;
5 W2 ?0 R! j/ s. @ Z' achar *user=NULL; # J2 M, s7 v7 Z" U Y: k
char *cmd=NULL;
9 f# D: X" {" S, a+ p: d* r5 D5 L3 X: p2 z. u5 i8 h2 k+ T4 u' F
user="root"; ( I9 F5 `; U- h. _3 d4 _- b; z
/*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, 8 J# R# U5 ^$ x4 _5 R4 _# ~5 o
登陆用户名应该从/etc/sysconfig/autologin中得到, ' Z; M3 o G2 J" c# O" c3 v# h
程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/ . ]. m# c# {: B3 I, U
cmd="/usr/X11R6/bin/startx"; / T! x$ O" c$ d- o2 |
/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/
* s; U. R! u, V: c7 Y
/ l% @3 [, x2 Y. T1 X; rpw = getpwnam(user); % `* C- }& ^7 A! I: M( N
//getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。 $ \$ g1 i9 j& t3 [/ C# z( i
if(pw) { / v9 M4 M) b8 o: O
uid=pw->pw_uid;
1 b; t* t3 E% e7 f7 k. m2 z5 b1 Mgid=pw->pw_gid; dir=strdup(pw->pw_dir);
4 z# @7 a8 u( ?4 _8 b3 qshell=strdup(pw->pw_shell);
- R* t' ^; l1 `; d0 P# I# m7 ]} ! s) k9 j' T6 O8 D' L5 ~
//获得用户相关信息
( \$ F$ S6 l+ G. g# y: L else { . f0 {( N- U5 i# j4 u5 L% ~# a
printf("ERROR: No such user %s!\n", user); ( }' h3 C* R! E
return 1;
% L6 J2 P7 u; E* n* D} & x& s0 S2 a8 ?2 @8 C
; g6 b" H" L. F) A; `2 x( P5 `
chown("/dev/console", uid, gid);
+ R2 q/ f9 E0 q" B6 f1 _chown("/dev/tty", uid, gid); " E! v. {. h+ M9 y* `: _7 Z
//为控制台和终端设置用户ID及组ID
( E2 h+ `8 R( l5 Z
0 B, r* C4 ^0 u6 j- [6 `//下面是设置用户相关ID
9 f T; O. l+ j3 D( A+ ~setregid(gid, gid); 3 d$ i4 W ]+ {9 h; Y
setegid(gid);
, p( l$ y" ]$ M1 a( I Bsetgid(gid);
$ d7 ~1 }! n2 p" R: F! D* jsetreuid(uid, uid); & a7 @2 J% E6 H* ~) w* n( y: g
seteuid(uid);
* T: W7 q4 d3 K8 n& Psetuid(uid);
. s( r) j6 i4 B9 k$ D, W
* `5 P: }$ t% H* |5 Hsetenv("HOME", dir, 1); 1 @% J& f8 l; G1 z- Y- I
setenv("SHELL", shell, 1);
3 ?7 ~* _' W# \: ysetenv("USER", user, 1); + w; \ o! i# d) k1 _0 H" p* Q
setenv("LOGNAME", user, 1); ) p& R, J0 Q% }3 {
//设置用户相关环境变量 & h% r0 V) G0 |3 U
' S5 B; t7 S) O% T- r6 a7 kchdir(dir); $ g0 z5 M: \( U" F
//切换到用户根目录
! u0 g1 V, C3 t: [/ z7 c9 S( Uuser=NULL; 9 M7 F. j+ P' F! U+ z
) ^) w2 x& y8 v9 d( b! |execvp(cmd, argv); ) i v X) k3 L
/*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */ 3 w1 v" T; T: y2 s( X1 p4 B% \6 x
printf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno)); a3 H7 C( O8 F
return 2;
% S- ]" k% p- L7 p8 [* w% R} $ @; I/ c$ [3 Y3 H! V# X! J( C
. Y H6 k. P7 K G* R1 I" N) b " K8 R1 [ I8 t& m1 |; Z" w4 K: E
3 H* d, u. ?: l
5 q7 T1 B. |; O- o8 `+ J运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。
; `) o" B9 |: Z
9 ~' ?6 N4 C" O2 f; N, P如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下: 2 R" C S# Y: ?: K
' x, v! S# M/ z5 \: f
# ?. w- `" @ L5 n...... 8 b& D9 a" Z- v. j4 G3 w4 m+ v- w) S
# 第一步:查看是否为自动登录 9 E7 t# ?# r% k1 g- m
if /usr/sbin/autologin; then / l+ J- ]" o1 C1 R6 e
exit 0 + \* ^" Q6 k& I
fi 6 Q5 K, s" |# x \
//第二步 ......
+ I* E5 U% r# \0 s& ?& Z+ u...... , `# e) z! d. c- K
& G, _; d. u8 J) W
; B/ a% k2 \2 K" w% `) \0 {9 d& t
, V' P' h$ e, c& {9 _- M
' X1 h8 }- x+ r) n7 b) K. K即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。 / A! J' K' K, |2 y# M3 K, \- z
% R0 E4 L! k+ M
四、选择进入kde或者gnome,并自动启动X window应用程序 , H9 z8 o% u6 M& s" s
& Z, y4 c: j0 H
如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。 . Q: D2 ?- t. m
一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。
+ D: O3 Z5 O) ~ }" `% v
- k6 @- v0 T) V$ j
! [! X% V# H5 p7 khttp://www-900.ibm.com/developerWorks/cn/linux/l-tip-prompt/tip20/index.shtml |
|