- 在线时间
- 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)
( U; b V# x Z" ^" Z# {% Q4 p4 `# W
机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。
$ V% x D6 z& l, N! t一、linux启动的最后阶段的工作
5 J* M; I3 s( J+ h
4 R. [9 l: F) a# r! T$ glinux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有:
1 B4 y1 _* o7 ~9 Z+ Q$ M7 ^4 K: h" K% P! e
运行xdm启动X window; 5 k3 _5 W/ T- c
运行gdm,进入gnome桌面环境; - t' B# ^4 H0 t2 C. f
运行kdm进入kde桌面环境; ( U, Q( F, v, U. Y+ p- ]
自动登录进入linux; * `& m% {2 }8 x6 x" L
prefdm脚本框架大致如下: 4 d0 Q" j# j- d0 S
: A) H' z( { A# @0 ?2 |( U9 `7 d
#!/bin/sh % R' |! _% J1 o+ O3 M" g9 G
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
+ Y# [5 ]8 Z" t: n0 t6 H. /etc/profile.d/lang.sh
9 c: A( i9 S1 q t# 第一步:查看是否为自动登录 & |& r( [6 H. ~- B1 Y, i
if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
% u8 g7 A" n0 C2 @+ W$ Vif /usr/sbin/autologin; then
% j8 s) W# C, zexit 0
4 c, f9 }! z) h: n4 a3 m( \; C' ^fi # ^ \! G' i# G; ?
fi ! m9 v: n6 l1 q6 P- F% p2 X/ c) W
4 K, ?/ [( E% Q4 J% Z( z
# 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式 E1 v( l6 n4 D2 K% d
......
$ h# ~' j9 z ]3 m; ~) T# 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。
$ I, a5 F: \% H1 f2 W5 j......
' u0 Z5 I" F& o+ S1 N
i: Y4 `: P% n. r5 E3 A. N
- v2 i6 k2 S$ g( D0 C6 ` m1 h0 x
2 o2 H. K- K8 B( |1 u% \8 V! Q8 x
2 u4 Y4 V* C0 C" @5 [二、自动登录的实现(autologin的实现)
: r. Z @ d0 e/ V/ P/ j$ z ]8 _; Q* J. H$ R
在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。 - o) }: g# t' S/ `
" _+ s' ~- w5 y, w# W4 ~自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。 , Z! `) c" P& l8 P9 C
1 r! f+ a$ ], B3 `Xinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。 / q5 x, `- F( m: ]* L
实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。
( X$ C' ^! p1 K Q' Q# hstartx脚本的最基本框架是: }) P" l: {7 ^1 b
( l5 b9 ^* [7 w) N9 [' v
a、 寻找.xinitrc,如果没有则使用xinitrc; 3 G/ N: g, S5 Z/ B& k7 x& Y4 H
b、 寻找.xserverrc,如果没有则使用xserverrc; 5 m( A: c! A3 M
c、 根据找到的脚本确定xinit的参数; 6 c. X/ x4 Z, J9 S: _
8 `" y* \4 I0 V. q6 R5 ~+ J
由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录:
1 @9 J! Q$ ^$ X3 b, S5 z/ A& [4 ?" x# K
) D/ T+ h0 p' N" g" \
#!/bin/sh
9 b: H! }" Y {# \( D; x/ J+ T) aPATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin 5 z" e6 i0 x' t5 J0 u
. /etc/profile.d/lang.sh # T& x N/ ]/ A: \6 v
# 第一步:查看是否为自动登录
3 S _! n. s0 Z) \+ \) F#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then / x+ G, a4 r9 y7 p
#注释掉上边的条件测试,直接运行startx
* ?* \1 H) u! l! xif /usr/X11R6/bin/startx; then q$ P& b7 M* h; M) B% p
exit 0
) m" Y) [( D- kfi
2 C" n# U0 }3 P! g#fi ; W8 |* V4 F2 S/ [* P4 s+ K2 s
7 [. D3 }" o+ B. Q1 l) }
8 @2 y7 ?% c+ |- |
' L- g6 Z& P6 F
% y& P& g- X, t. {当然,应确保/etc/inittab中的启动级别为5。 5 {; ]- f) G8 A; m( H) I) c
7 K8 B4 v: j( R7 ~重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。
/ M) k# W9 J' w% C2 Y4 V2 ?' h6 l! K1 L" k2 U' d. U6 G
三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。
7 B' V0 M( e6 t( R& ~* c7 ]7 c# ?5 e4 L( M! }5 m
观察原来/etc/X11/prefdm脚本的自动登录部分: ' X5 C0 L* u$ |6 L' V8 u# K% g% I+ ^( b
+ Q* _7 q7 Y/ J5 s9 l
& _) i& s& k1 p5 _% ^/ f# {......
8 o" ]. I$ M, S# P# f# U- ~: k# 第一步:查看是否为自动登录
7 W4 J0 Z, E a; w6 B8 rif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
, I; e# M2 s7 l" ~! uif /usr/sbin/autologin; then
9 z) {! e+ S6 Z3 Y8 \exit 0
5 O1 u. K: K3 _+ c& nfi 6 T# z2 B3 X# y; D3 n
fi / t" P) W& C) f
...... 3 {* \) z; H r" J* t: v& e! U
2 Y, \; v; l3 i! R ; [" r; \1 a6 X! w( b
' M: M% D0 k5 t3 H! x8 X
1 V1 A0 f' l( u% {不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。 4 K. s/ z; D/ k2 E% Q/ d9 a
6 u* g2 Q& w3 M" t; N+ e1、/etc/sysconfig/autologin配置文件的实现:
* v8 c8 A5 Y2 V" ^/ Y7 L7 N% g; f8 X# ^3 N7 F$ h4 m5 f
6 ~ q( R* N( `& t% l$ I
#config for autologin
3 h5 z* X; o; \2 q: e ^USER=root
5 i5 M2 z/ e- V& X, w8 JEXEC=/usr/X11R6/bin/startx
9 v# `4 O% K; C5 _1 K' I% y说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。
D6 w/ X B: j% L% c# {8 G5 v" O4 z1 ?7 w
# H) z! q u4 g$ M3 W$ |7 g
) z! p+ t5 ~% ]* {. z3 b A5 @* J) h$ _/ D/ {
2、/usr/sbin/autologin可执行文件的实现:
9 D, w* [0 T( L! c/ M
* V# R* z8 ^, y1 x# O; w1 b% L0 X0 \/ k* n/ Z! O) u) G
/********************* . T% R" [1 I) E
**** autologin.c **** 6 R% J8 P: ^% b# | u- y* R+ v
*********************/ ! M2 s5 Q4 n. F, t! N
#include <stdio.h> 9 y$ p) V2 L$ B" x R( L' Z
#include <unistd.h> " c% @, M9 A3 G$ K, |9 r9 h
#include <string.h>
( O3 T. T8 T( `# J4 [#include <errno.h>
% d8 ~9 j& E+ {( f#include <sys/types.h>
" f3 t- j, o* r S; F$ T1 M$ O; T#include <sys/stat.h> % N9 j5 T5 l2 f1 `4 z( ?1 w
#include <pwd.h> - X3 N# S+ n" c1 t/ q& N O
; M, v8 e7 t' w$ {
int main(int argc, char **argv) $ J" J1 Q+ L+ O1 ?9 J/ |) U( G
{
0 ~& v9 s; a7 A. `! J' ]struct stat st;
1 d, c( m+ D9 t( f! d& a& h4 C' R( ~FILE *f; ; s4 u, X, ?3 Y0 Z8 w
char *cfg;
) i, ]; V1 Y% D) ]8 M+ Y' Wstruct passwd *pw; % f, K3 m) d' T& q6 |5 X' ] d
uid_t uid; : T5 L$ |2 q0 x
gid_t gid;
# L6 R% F! L0 r8 K0 Ichar *dir, *shell;
1 R- w; w8 N1 K( Q2 U {char *user=NULL; ; x3 \- T& x: c k" u+ ^. Z5 P& X |, E
char *cmd=NULL; . {0 ]8 f/ d2 K3 C5 ~
% j6 H$ \/ [% f G/ r: huser="root"; , x: a! M' y) J- D3 b* ?1 k
/*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, / k) j: d0 ~; G' }. ~1 c4 r1 L& i
登陆用户名应该从/etc/sysconfig/autologin中得到,
" s. K' x6 D' ^3 @; W j程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/ : _0 q( f! f. h* m7 T, \
cmd="/usr/X11R6/bin/startx";
. t- T$ e) J- O/ D7 I5 o/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/ 6 `0 n& K2 W: d# i) W3 A
: T8 V7 ]1 B! L U4 H5 h- T( M+ xpw = getpwnam(user); # }! d6 d' V3 y( T* y
//getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。 9 x {6 ^* T- K) Y$ [
if(pw) {
1 |" z3 D0 ?9 m2 Uuid=pw->pw_uid;
) i. \. l0 \' }7 Ugid=pw->pw_gid; dir=strdup(pw->pw_dir);
* X8 c$ l2 y" s" ishell=strdup(pw->pw_shell); 1 x3 t$ |* m$ Y- }9 b. t3 W
}
/ j# o. [" k2 W//获得用户相关信息 $ g+ K, a% m$ x* W
else {
4 B* l% ~" b- @printf("ERROR: No such user %s!\n", user);
* l* t* V+ F/ E! c! b9 y( m( qreturn 1;
1 f6 F0 f( l' Y6 b" L# B, C} 4 u: A6 F# b* t) z
& A5 T, z+ `7 N9 _chown("/dev/console", uid, gid); - u8 W% m5 {4 n7 z) J2 X4 ]: i" u
chown("/dev/tty", uid, gid);
/ ?4 ^: Z4 L0 U- F9 I' r. @5 a9 Z//为控制台和终端设置用户ID及组ID 8 y; M+ G9 J9 f/ P5 m1 ~# i: \
1 X" u( R% C5 ]1 m/ p//下面是设置用户相关ID
+ |$ a' k/ u4 {9 b+ V- h( ~setregid(gid, gid); , `/ @8 ?9 v0 }- C
setegid(gid); , m' y) w' n2 n" J5 x7 W' v
setgid(gid);
" b# y" X% S2 c/ G+ S3 P) Nsetreuid(uid, uid); " K; h `' F8 ?" n& e: G
seteuid(uid); & E7 O/ _# Q, @4 D
setuid(uid); ( P( N8 D8 r3 K
5 M* V( r6 E/ y7 Q& @+ T6 x
setenv("HOME", dir, 1);
* F8 W$ z% e2 Y( R2 |5 [- Usetenv("SHELL", shell, 1); ( b( }$ E; o7 R* I L2 X
setenv("USER", user, 1); 6 T$ y& \. t2 V/ }6 M- X+ E' h
setenv("LOGNAME", user, 1);
; s+ m; q8 e% H//设置用户相关环境变量
2 T# e9 N7 N* Y% K' k0 y/ M% E* z. T
chdir(dir); + W9 L5 q' _1 D, @ ]0 `* z; F6 b
//切换到用户根目录
4 x* x4 R# P' {( \9 ruser=NULL; + L/ D2 V0 V: f6 t
$ d' [, A9 R& u/ e
execvp(cmd, argv); + @2 S3 W8 ]3 y3 J. k1 q w
/*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */
5 H5 c! d" {$ Jprintf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno)); 6 c) K% a9 z0 ~) @& C
return 2;
6 n/ ^/ w/ A ?}
5 T% X; J7 M {1 `, e5 j& g r8 B3 ^& a+ |
* Z* n; W t+ H! Y% t6 E
. S9 T9 B/ v8 m9 t. m D8 L6 R, C8 }) e' p
运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。 5 w/ U: _ ~/ v8 I& k* U
$ d4 t7 ~- ^2 @0 V6 a
如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下:
' i# |* q+ l) F8 R
% J% P7 G' I" D9 k$ J7 d3 G
$ G3 Q' ]* _( f7 `9 x...... ! r7 A& O* }9 V5 S2 i
# 第一步:查看是否为自动登录 3 D- j' C+ a. L, u4 L6 R2 X
if /usr/sbin/autologin; then R+ {+ r) d: d w& U
exit 0 ; [: r$ j1 d$ p" L; V/ m9 l; h/ X8 v
fi 9 A+ n7 o$ ^! I( b' r
//第二步 ......
. @) p$ m& z7 U. e+ z......
, D2 G- i1 x" M l/ C, o& D7 d/ S' Z4 a _+ S. q A
3 k6 m, k0 q; r. v+ Z
: m9 t4 K! U4 T0 a
$ K. |3 J) v, X, r( I6 `即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。
% [8 t" s: r9 x9 U7 u8 m- @+ K3 K$ ?: t5 ^0 m+ F7 `: q
四、选择进入kde或者gnome,并自动启动X window应用程序 Y- I6 | e1 ?8 I$ e
8 n6 v$ t" J8 j& f
如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。 , z5 I/ ]/ f- d; W. I d" S& g8 l
一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。 2 u: q2 m/ c& F: [/ N! `
9 Q7 o! j) d4 Q- E7 K7 X
! _: s- h6 p7 r# _3 ?& Q
http://www-900.ibm.com/developerWorks/cn/linux/l-tip-prompt/tip20/index.shtml |
|