- 在线时间
- 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)
0 ?3 e {6 L" s! }$ r8 R
; L0 S+ c: s" p, ]0 P" b* Z机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。
8 P4 ~, W) E7 l/ L# G一、linux启动的最后阶段的工作
* e6 y: j0 X8 r; D _0 c i; W1 q1 t- Z& D1 |$ g4 z' ~
linux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有:
; N2 u8 I: j% `5 t7 Z8 O- ~+ M! X' B5 c
& ~( X( ` B0 o4 Y, Z运行xdm启动X window; 4 Q1 A) D1 S' x, x
运行gdm,进入gnome桌面环境; # O4 T, F9 t1 `- ?; S7 f8 [- r
运行kdm进入kde桌面环境; . L# m/ \8 m3 s4 Z1 A6 T, X) }! C
自动登录进入linux;
8 @8 U6 }( t6 z8 E/ W. x( U, Aprefdm脚本框架大致如下: * Y9 H; N- G2 A$ }' F/ W3 g5 D
( s. D' ?; S0 |+ ]) Y: b& e#!/bin/sh ; {9 n. @1 y0 I
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
4 E5 @ e6 N5 p5 H T. /etc/profile.d/lang.sh
) k( k7 P' u3 [' p' e6 k+ L# 第一步:查看是否为自动登录 8 s I8 r/ u8 h( Q O
if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then ; j! ~8 z; u5 X- Q
if /usr/sbin/autologin; then
& X% H+ @$ Z# N- A) x0 _7 Lexit 0
- {3 _: r c( Q8 x3 O4 Hfi
1 T! L9 O* m+ h7 o' b1 e! Sfi
; N: p& t+ d0 `* S1 ]# \7 X; Q3 v( q. Q
# 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式
5 F0 P& U1 b* b) V' z7 w......
, R9 L! b6 D; T) q# 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。 2 T, l0 k. T9 r+ C5 l
......
~5 f) }9 w3 v( V% G3 A W- ~2 }$ v u3 @& [
b. j; I4 O- i( O( A) k) R4 W) F* A& q0 Q! R3 S7 P
5 h R+ e; q( d) z
二、自动登录的实现(autologin的实现)
0 C* t& N: q9 j7 z# U5 N5 ^% J( W
在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。 + I- f) _! s/ b4 y: [
* x9 `2 Q0 z8 e7 L0 i( m
自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。
7 t+ }2 ]6 k A
3 y5 h2 N5 b1 j, B/ e" V. U$ p8 n9 UXinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。 * @$ J+ d K# O1 j9 N, j
实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。 , @2 w: Z, X: e6 ?3 g
startx脚本的最基本框架是: 9 ^4 }4 D& [+ W
0 k3 N }" q% X: t( `
a、 寻找.xinitrc,如果没有则使用xinitrc;
3 O- J6 v3 p/ vb、 寻找.xserverrc,如果没有则使用xserverrc; + p* q0 Q4 H' `
c、 根据找到的脚本确定xinit的参数; $ K! {& j' S3 T6 _" d6 v
9 A0 k" C, x" x* A: u4 [0 b由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录:
8 j; ^: j/ R" } \5 s2 Y! ~6 `: _2 K2 b& Z5 s/ B
2 T( u+ M5 L; L* |#!/bin/sh
7 I' @/ L% S: w( Z( A Y ~/ s* P* o( SPATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
4 u$ p; i4 @% J( j+ G1 @. /etc/profile.d/lang.sh
% M* F, y3 P! c) I F: E8 H# 第一步:查看是否为自动登录
. x9 w; s) k* v$ F, }#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
1 b ^1 x* {6 @#注释掉上边的条件测试,直接运行startx
. s' A9 b/ A: K2 Dif /usr/X11R6/bin/startx; then ! {" A! W, A! k0 c( n+ {: f
exit 0
. l/ f- N- w. ]* I7 q0 |, Nfi
# V1 p. v% \5 p; Q& l4 B#fi
- L3 \1 p6 x' G' p0 w
6 T7 J/ V f6 W# k$ T( S% z9 Z ! c5 b* s6 F1 T5 U4 T" f
r$ V% s y. q4 o+ T3 G! j& g3 I+ H6 P. x
当然,应确保/etc/inittab中的启动级别为5。 i, k& A# p4 H) ^) J9 m1 @& w
+ y6 y* k) m; ]! n% a
重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。 5 O% q- F+ `: W) z3 m: u# T/ H/ M
& n; N( i _( z( b8 R% c; c三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。
/ y* s" q# L$ s' k* [5 E1 ^/ s# S* k: ^, n% ^7 R7 D1 A
观察原来/etc/X11/prefdm脚本的自动登录部分: - F$ S* S$ h% ]
/ M! h+ m0 ^% s+ i& Q( F3 ~( U H; W
...... ! ~: ~# O% w* k) P9 F8 \! L7 v
# 第一步:查看是否为自动登录
& ]! e2 W, L1 Pif [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then $ M: g& \/ l4 p( E O' h
if /usr/sbin/autologin; then
0 J' ?& f. B8 z: \- I% u: Uexit 0
) [4 e! h- k, `* |9 ]9 R Tfi
9 i% W0 E! i2 l3 ~. J8 F# e+ }0 xfi
( k3 [. r! g! ^) n; r' d6 b...... 6 R) k8 ~: U( J. J$ r9 ]
9 y& B7 C$ H/ I4 P& c; x / j6 C( Q- W/ o3 i0 t
8 Z4 Y$ h* T2 o0 T5 a4 `, i: L0 o
, `( Q0 t7 C+ _
不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。 8 k* g( D6 h$ l
$ c! L# J" B# O/ R; Q2 h9 U5 a4 _
1、/etc/sysconfig/autologin配置文件的实现:
3 Z4 @* Y2 [% E
: f+ e9 ]& Y+ A1 w, r" G9 T* |* Y, v6 s" w" o% l- b2 s- j
#config for autologin $ X6 [2 W8 N3 ^0 @- Z$ S
USER=root
( K1 T4 B' v/ |' I* `% s/ mEXEC=/usr/X11R6/bin/startx 6 t: {4 q% g- O/ ?6 e7 B }
说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。 y! x+ }: M9 S: {2 _9 z
3 K8 U( q6 `5 U) {
2 @$ F* b7 T. ]9 u) s9 G, i5 R3 E, y X% W8 L1 d" U" l
9 V7 {5 B8 B6 z; S, o& |8 x2、/usr/sbin/autologin可执行文件的实现:
" o. D9 _8 P) c5 o+ Z0 M$ Z6 r4 z" H5 H( @# n5 `
3 H* e2 c2 A0 M
/*********************
* m$ a' n8 X. i; j! O# i**** autologin.c ****
: m5 n' ]1 h0 \& h6 M; \*********************/ 4 j/ H# J5 ~8 k# w2 T' ?; F
#include <stdio.h>
2 l7 q- d3 \3 ?#include <unistd.h> $ C. v5 r6 o- C7 L- U; W
#include <string.h> # n! i# l1 D0 G& R/ }1 t H9 g# O" D6 k
#include <errno.h>
5 I% ~6 Y+ [& @2 M1 h+ `" X: F! h, }#include <sys/types.h> 4 q' e2 y. z% d. t
#include <sys/stat.h>
5 i2 X, c. S8 s( g4 E) d! g#include <pwd.h>
! q; x) a$ H* L/ N+ d" K; B& \8 W( O' x2 [4 `
int main(int argc, char **argv) ' q$ a/ l N: h% a+ @8 Y
{
% e- n/ S3 c( |$ y7 @; Q! ^struct stat st; 4 q8 e% N) x& [ | b
FILE *f; , {0 j' W5 s' a) l- L. F- e# @
char *cfg;
$ j4 b7 Z$ ]6 @& @1 Dstruct passwd *pw; 3 N2 k1 ^/ I8 }- C! a
uid_t uid; * U1 ~' A. F0 p' ^! j! r# g `
gid_t gid;
$ d/ o" W3 E; N" F* y9 ]char *dir, *shell; $ ^( D( ~" P9 D1 Z
char *user=NULL;
/ @' X# S) t* q3 g) bchar *cmd=NULL; 5 H' {6 ?% J2 I" {' r) L( ?
e1 h* R y, O9 o, buser="root";
: {9 m: p9 g7 b: f) ^/*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上, ! s$ ~, |1 E& z5 z- w" u# T9 o
登陆用户名应该从/etc/sysconfig/autologin中得到,
/ }9 x' f2 ~+ K# M: p程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/
. B0 ]3 n! _3 c, L# i6 W4 w' jcmd="/usr/X11R6/bin/startx";
" p$ X% `6 Y8 k( ` Q: U( t: P3 F/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/ 6 v# K( {! H, e: R. T
* L( ]0 ~" b% E9 x0 @3 npw = getpwnam(user); $ M8 x- M: d0 b s
//getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。
) a; O: G2 U) uif(pw) {
) M/ [, k3 n F( juid=pw->pw_uid;
5 k2 I$ N7 ~' M; [( b' Tgid=pw->pw_gid; dir=strdup(pw->pw_dir);
2 h" }5 d5 K3 ~0 Eshell=strdup(pw->pw_shell); + u7 i4 Z- b* x' g! v, H
}
1 ~& {% J7 j# t//获得用户相关信息
$ e, d) a0 O S9 k: Y8 ~1 O else { ) U# L1 `" \+ i7 c. |4 h
printf("ERROR: No such user %s!\n", user);
{# m: M. o9 }return 1; % M: c2 [! D( m
} ! [$ S- y* ~4 d: U# O
7 M, j: K6 |: t. i8 `9 R dchown("/dev/console", uid, gid); / A; g$ g* C! G
chown("/dev/tty", uid, gid);
9 X: X6 f; H/ c" O/ d! C//为控制台和终端设置用户ID及组ID
7 b; n* U, Z* y7 y/ \ P$ x! p; E0 u( L$ N6 p
//下面是设置用户相关ID # D# w0 C+ x4 d- R# D G" \
setregid(gid, gid);
: ?! q, C, e9 B# Tsetegid(gid);
2 j. k6 v7 Q, D; @4 |$ [6 h T4 |setgid(gid);
0 d5 e; e2 Z: {5 w5 s/ j( rsetreuid(uid, uid);
* J, q- R0 {+ P1 bseteuid(uid);
E- X# S- L# d; V+ rsetuid(uid);
% S u. {0 w3 O. }3 k
' i: {# t$ L2 ^9 z# I- S6 i( psetenv("HOME", dir, 1); * l, f4 b4 r0 ?( Y
setenv("SHELL", shell, 1);
& O! W6 W/ m! c) W) E' `setenv("USER", user, 1);
* O! m6 `& o, p7 Csetenv("LOGNAME", user, 1);
$ J1 @0 N- W2 X6 X; ~9 w2 |! t//设置用户相关环境变量
9 k2 h) Y' L5 j* t9 o, Z ], K1 t
0 e5 O+ x9 i9 G2 r- {! ychdir(dir);
/ ?, i/ z3 @$ I! Z7 g$ d//切换到用户根目录 + ?# r0 ^8 A0 R
user=NULL; ; E3 h4 t/ u* }9 S ^
+ _; h( U6 h/ vexecvp(cmd, argv);
2 h0 V4 ~ \3 S/*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */ % m W8 S0 i. G8 } P( {2 W
printf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno));
! x4 l3 z, j4 C. z y% ^8 jreturn 2;
) P& a8 `" I/ K% c3 D} 9 I& U" K- @6 u) H- T7 k5 z0 I, d
8 W6 G( x4 r2 ^! w
- ]- Z& u$ D- w5 ~' t [, {6 B) b) A0 s5 e" Z& \- q& U0 W1 y
1 O3 k0 y c6 J! k7 L4 V
运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。 ; X* p* r& I- h4 k+ H. b: K
, u# j; o/ a0 ]7 k0 v/ V如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下: _! R; n! s+ V) b8 }* i9 U$ z
% s, J- j; ~' J$ c! z) q8 C9 ?, [2 ?. e, K
......
8 ^5 _# \% l+ @* W/ j# 第一步:查看是否为自动登录
# S- H/ |' @# ~: g: Bif /usr/sbin/autologin; then 6 k$ T" t0 w5 w/ o/ _, @: s
exit 0 . [" g. u+ j4 w" Q5 n
fi
. O- @ X& v3 Z$ x//第二步 ......
0 e9 t+ I8 c9 t5 z* m...... 7 f7 f! t# W, z; H
` Q. l0 Y9 ^. C H
S) o; N8 L& m9 ?! A2 U& E6 G% d9 X% V: o
. S, N3 D' G8 z. m. a6 e7 x
即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。 $ _$ n8 ]3 o2 ~1 t! c" N# G4 B& K
5 @( m2 d9 p6 u
四、选择进入kde或者gnome,并自动启动X window应用程序 ! K8 U0 b6 _/ O, A9 i
$ F! k2 m% F7 r, f2 V7 M0 m3 b
如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。
. ~5 | W/ T( [; d% Q3 q2 C一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。
" ~' I) V8 S3 [* P* D% x, |
3 {2 V2 A7 n! a" }/ p: a S: G
, Y. w# z1 T7 u# @http://www-900.ibm.com/developerWorks/cn/linux/l-tip-prompt/tip20/index.shtml |
|