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

复兴中华数学头子
TA的每日心情 | 开心 2011-9-26 17:31 |
|---|
签到天数: 3 天 [LV.2]偶尔看看I
- 自我介绍
- 数学中国网站(www.madio.cn)是目前中国最大的数学建模交流社区
群组: 越狱吧 群组: 湖南工业大学数学建模同盟会 群组: 四川农业大学数学建模协会 群组: 重庆交通大学数学建模协会 群组: 中国矿业大学数学建模协会 |
2#
发表于 2004-9-27 14:27
|只看该作者
|
|邮箱已经成功绑定
如何实现自动登录Linux (Runlevel 5)
, p/ n$ N% W: H0 _. h8 v7 B4 N, u! r- _
机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。
1 P/ O2 b; V G一、linux启动的最后阶段的工作
# Y# t6 f. T4 T7 O7 H" B
; b1 i0 c' T* Y! ^. D( Rlinux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有: # @ G+ i7 E, [/ Q
% R3 m5 E! s% L( o# M; O运行xdm启动X window; , g' s/ k W8 v
运行gdm,进入gnome桌面环境;
" u& @. O5 i- i4 \3 z运行kdm进入kde桌面环境; X/ o7 i$ T5 z g0 }: K4 v: y
自动登录进入linux; 7 p! k: v5 C% W. z) z0 e3 T
prefdm脚本框架大致如下: 0 y" c6 [( v3 {1 o& G4 Z: Z
7 O- j0 P( I1 l1 R% @#!/bin/sh
) p' G1 J7 Z$ g8 d: ~PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
% G6 }' ^3 S( U( S8 M4 \6 `. /etc/profile.d/lang.sh
7 |+ k5 K5 _5 B# d- t( B# 第一步:查看是否为自动登录
2 ?6 v) }) `$ Y& ^. g( t- Y( }2 ?2 kif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then V/ w8 _5 }# W, Z! p" @' g
if /usr/sbin/autologin; then 2 A: B. T6 W$ u6 Y; G% l
exit 0
# J$ l$ n4 o- s: m+ Q* Y3 Q: jfi # V% d& P0 c! ]8 i/ H2 P
fi
/ Z1 g$ ^' `5 Y/ k# S0 C& m( ^5 u9 w
5 M+ P8 g, B; \, y1 i7 C. s5 k# 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式
- |: I0 H2 n+ K6 U......
0 l$ v. D( p2 z. Q* B3 M# 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。 7 K3 t& w$ [6 k5 {* B7 H
......
) K# W; C5 c8 X; F* L; e5 ~7 l1 O" W3 t0 a) t+ T
3 {2 _% G& S+ }4 b& T4 X, j# e
* F- p+ `+ q. E- c& v- r
; ]. a$ a$ u" P! t k& B" q二、自动登录的实现(autologin的实现)
# K$ Z2 }/ g" b7 o0 P2 P$ H& V% f- F4 Z2 O+ d7 d5 @$ z; t
在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。 $ A$ I( I8 W; V2 v
/ T7 y6 y, d1 R' @- Q3 k自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。
( F R5 W! \3 z6 B2 D G* ]. L. k( i# p& m) b
Xinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。 2 A7 p" c3 r% u8 z7 j6 ^2 F% ?- I
实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。
; O- K1 J* }$ r/ R% i0 Pstartx脚本的最基本框架是:
+ d/ Q5 }& J( m3 V" I7 P5 v: t' y( H6 ]: {
a、 寻找.xinitrc,如果没有则使用xinitrc;
. v3 ^ E; u8 r* ?b、 寻找.xserverrc,如果没有则使用xserverrc; ; r4 `' T( t( }! U" @
c、 根据找到的脚本确定xinit的参数; 6 s# k0 o7 }0 b! B' }+ m4 S
0 X8 K& ^1 S! `; q+ C- A
由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录:
2 Y% I) x( F- _; }6 f5 y1 L8 n5 |2 g5 }
: l6 V: G8 y v4 J) u2 z
#!/bin/sh 1 S! `1 K) t; h
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
; z! i/ G# p' X. ]: U% @. /etc/profile.d/lang.sh . w9 L8 D! z6 U; ^0 [/ ~
# 第一步:查看是否为自动登录 ) ~; R& @* S- e( x K; F
#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
6 P" W# R2 J$ _3 N6 d2 T$ v, o( H#注释掉上边的条件测试,直接运行startx
/ Y. V1 o2 B9 G8 D/ v* b! f7 uif /usr/X11R6/bin/startx; then
* t# D* r* r1 @# K" Mexit 0 # @6 Q$ r- n+ r: O2 D$ l
fi / M( a1 N8 ]. h& n" ~# o9 Z
#fi 3 i* h- }% _+ F( R& F: z( ?7 a
5 B+ p, Z& x# A4 m( V% ~7 J
- Q: O% ]/ q+ e1 p/ ?6 ~7 A
( Q3 B Z4 o& D2 H0 N
8 K9 u$ P" a% ]' d# k7 o, |
当然,应确保/etc/inittab中的启动级别为5。
0 b- U' i" i" p0 _/ T, @1 m0 j
, \' J& l2 T! q7 @重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。
, q+ s) G, H3 k% j6 C7 Q; Y" ~ z$ N9 m5 W
三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。
8 p9 F% |2 W5 `. S1 j; |" h7 j/ M( _) A/ _3 `3 B
观察原来/etc/X11/prefdm脚本的自动登录部分:
$ A0 m8 T) v m) ^8 n, K+ n7 [! k. V0 e* _& _
% ^% }8 t" U3 B8 ~...... 3 T- r& k5 k% O1 v7 N( V; Q
# 第一步:查看是否为自动登录
3 T2 G$ b: J8 S, gif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
5 K" F ?$ y9 ^! lif /usr/sbin/autologin; then : [7 m- x# g/ _' Z9 l$ J
exit 0 : \8 n; {+ u+ V( m+ U: I* H
fi ' g# k% b! H+ S; |4 ^, ]- @
fi - ^% ]: D4 `2 M8 [" Y* n
......
9 K* o, r" I \6 E6 p/ X3 V+ p
4 T( G, d7 t/ u8 C * P* Q2 Z7 j+ v3 b! P( ` u7 m% }0 }
& i- f; k% z8 G* d5 ^- @" J$ \$ J9 }
不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。 , z0 ~+ {( B# ?8 ~
8 ^/ x; S' p% V2 }9 ^- k; w& o0 E
1、/etc/sysconfig/autologin配置文件的实现: " y7 i% U/ G! r' t* a
/ Y' S/ g1 P/ k- ? y! p0 L* a5 y* X0 }
#config for autologin / {7 ]5 h! I' S- C* j3 Y9 f- o5 w7 j
USER=root
/ ~) g& E' Y( ]; |* UEXEC=/usr/X11R6/bin/startx
# v9 ]! X6 X3 n说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。
# P# c! J& c# s+ D+ H, Q
$ |5 T- n3 Q6 ?1 E8 Q& I: u 7 g' P3 N0 m$ o- N/ {6 ], L" H
' c! U5 f6 c; m
0 ?3 S2 C: f8 G
2、/usr/sbin/autologin可执行文件的实现:
, s2 z+ l5 ^3 _* E- u* E1 G% {9 ^- j
: R3 m4 V. g8 I( x) f) M' P+ u8 Y% K/********************* " K0 t( x a6 Y" I- v, [/ ^; S; l
**** autologin.c ****
$ P8 m# E1 Q1 r! G3 U9 G0 @*********************/
* j) E5 N2 r# `9 j0 ~! B( D#include <stdio.h>
1 k9 z/ N* g. c5 j#include <unistd.h>
s/ w) [: Y" E0 f#include <string.h> 7 j" c) E, n- c' X! n
#include <errno.h>
) d$ J0 N" G. ]- e& r# }8 z) b#include <sys/types.h> 9 T9 M5 B @3 _/ s, x
#include <sys/stat.h> & V) t( D- ]+ A
#include <pwd.h>
$ y+ G% O e5 r" N9 q
9 k2 E% O. \- U) o/ Jint main(int argc, char **argv) 8 {/ [* t' E, r$ n/ F' l6 q$ t0 P# G5 ]
{ - P& a# K4 O% Y. s$ T
struct stat st;
+ p" E q5 g' R: w7 L# FFILE *f;
J; Y* K9 N! s3 }# x1 ^char *cfg; 3 U& D. z$ K. A
struct passwd *pw; . T; Q+ Q: e1 G8 K) P
uid_t uid; ' q: ^5 `7 }2 y8 M' S, e4 {# \5 V4 @
gid_t gid;
% l' V9 S8 G" F/ s. f' dchar *dir, *shell; # H k7 ? e5 R
char *user=NULL; 5 k6 a1 k# M2 w0 i/ J6 j9 u% i3 p( o
char *cmd=NULL;
. a# X9 T6 O3 }5 g* P5 u/ ^: ]. e* Q+ D" N: r
user="root"; ) e$ n: d+ z; {8 B) B r: X
/*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, & Y# Y1 f8 q' ^0 X7 c
登陆用户名应该从/etc/sysconfig/autologin中得到,
: w( W& ?; `! L3 M2 f程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/
! J7 `% H8 t9 ?8 p. u% F: y2 _1 Vcmd="/usr/X11R6/bin/startx";
2 k: e# }1 g+ Q; l( k3 G6 d8 `/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/
0 M( J/ [( C4 q! ^, |$ }
6 R) y5 O5 x4 T+ P4 m, O! {pw = getpwnam(user);
7 r1 e) c9 A; ?; M% @; ^4 }' c+ p7 W//getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。
" e- h4 y# j: _4 R _' Y! Wif(pw) {
) i% z; x& q& ]% z9 b8 j' e3 d, q% ^uid=pw->pw_uid; 3 @1 A% A) [ j$ ^* a# H* R* e
gid=pw->pw_gid; dir=strdup(pw->pw_dir); + j' N* x, Q2 {9 M& O/ @& b
shell=strdup(pw->pw_shell); # M$ Z4 O( _$ J5 z# e2 a
} % D) J, u+ Z# ]/ m& I* ?( h
//获得用户相关信息
) U/ h; ]8 Q$ X- n* _- F else { 7 u) P" D5 [) ]; D r
printf("ERROR: No such user %s!\n", user);
* }0 |! T3 ?2 b- yreturn 1; $ q0 ?0 X7 z1 d r7 `
}
5 Q" T3 j: K: j7 R( M
4 D' J: I% p0 S2 v$ P% Vchown("/dev/console", uid, gid);
3 f8 O. O4 n6 M achown("/dev/tty", uid, gid); 0 `: ?7 U a! F7 {+ p. e* ~
//为控制台和终端设置用户ID及组ID # J2 \ O* F# n
6 G& z1 i% ]2 n9 T
//下面是设置用户相关ID ' K9 R! N& K, e# P' a0 Q
setregid(gid, gid); 9 H# F6 J. D/ ^) w- h, m& ~9 \& Z" O4 ~
setegid(gid);
, m; v7 Z9 p4 [5 ~& g! Wsetgid(gid); : o1 k' M- j7 u3 i* m3 p. V
setreuid(uid, uid);
- S6 \% q& R6 b. I1 ^. p) xseteuid(uid);
. }' p+ S/ l$ i- x- rsetuid(uid); # L# \% n: y* k: B# n8 U$ ~
* L6 b" z1 j5 F1 V$ M
setenv("HOME", dir, 1); 9 X7 Z+ F6 ~3 ~# V V: s
setenv("SHELL", shell, 1); & c7 y9 y7 X! Q, a
setenv("USER", user, 1); 7 T3 k4 D* ^: O2 X
setenv("LOGNAME", user, 1); ( T7 t1 U% k7 m% v0 \1 h/ Q E6 i
//设置用户相关环境变量 2 s5 @) ^5 Y }/ G
# k: s! j- A4 k7 \" z) Bchdir(dir);
, |" h* d+ R% j, \0 L& q//切换到用户根目录 & v$ Y" `% _% b O; X
user=NULL;
5 _* C& ]7 ^- O$ S9 t# O$ ^( h- D
% b% p5 ]7 b8 bexecvp(cmd, argv);
5 x0 p+ F7 F& O6 ]0 z: E3 c/*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */ $ ^# [" U* U4 D$ w: g- K0 h: ?
printf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno)); 6 G( y2 _5 w i$ A
return 2; / o0 v$ O; I# R/ o
}
" y0 d/ J4 t, o" @0 n. g, F
0 k/ _ q4 g. n( o; p
2 F8 [1 p# |9 v+ R. d) V
6 \3 W) |* H4 z7 V4 t6 X u+ D( T) t& H7 \
运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。
/ Q/ T- Q: p5 ?1 T
; ~/ I0 \8 E5 \1 M; W如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下:
2 y c8 f' i$ T5 h: S% p0 }' x/ K. k* g, m6 m
8 K" V! o( ]: K
......
+ G( p$ g% D5 P9 e7 Q0 j6 H# 第一步:查看是否为自动登录 ! G; M# A r+ V6 i
if /usr/sbin/autologin; then ( ~4 M' F% K/ P. ~8 p
exit 0 % ]5 X; L$ I; z; c% i- Y, K4 `
fi 4 i! H. D( v9 n0 p- d
//第二步 ...... : {( K1 K9 u1 x; r; l2 H
......
0 K' Q$ Q! {; x3 X" p- }, J; |" j( {4 p! ?: L4 R4 l1 {9 m& B
. d7 h. Q. d" a
& _' X3 l0 S% ^9 p+ V. K8 l& d+ i5 J( e5 e/ O. p, h
即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。 & m) ?- |6 Y0 R. l) z. A
* o8 S( x) ?# U3 f
四、选择进入kde或者gnome,并自动启动X window应用程序 ; o- I/ y( @& t! D& p6 N
6 C- z! J6 p8 T如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。
+ r* R- U6 Y f% \- h一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。
& E5 U( \+ b$ C4 e* J2 Y- L* C0 \3 [" F8 X
) L3 G( s* J, ?& c4 g; f7 Y
http://www-900.ibm.com/developerWorks/cn/linux/l-tip-prompt/tip20/index.shtml |
|