Linux管理员手册(7)--管理用户帐户
9 Y. S( ~& [1 @ r* O3 }2006-06-01
8 ? G, C1 V, ]/ H: E M
3 h, a) n& s: |2 d0 B3 b% U
$ A: R5 Y& |, o3 S
本章解释如何产生新用户帐户,如何修改帐户的属性,如何删除帐户。不同的Linux
系统有不同的工具实现。
/ n9 _) V4 i3 a* T6 x1 T9 L
* b, M7 d: s. k" h9 @ 什么是帐户?
: a e* W" [( B% ?
7 u. c3 t4 @ e+ s5 b" k 当一台
计算机为多人所用时,通常需要区分用户,例如,使个人文件保持个人化。即使计算机同时只为一人所用,这也很重要,如多数微机。因此,每个用户给定一个单独的用户名,这个名字被用于登录。
# x/ k0 u: m, V y
( v" I& G% k0 B* \4 D. g+ f 用户除了名字还有更多。一个帐户是所有的文件、资源和属于这个用户的
信息。这个属于暗示是银行,在一个商业系统中,每个帐户通常与一些钱有关,且这些钱依赖于用户使用系统的多少以不同的
速度被花掉。例如,
磁盘空间可能有个每MB每天的
价格,处理
时间也可能有个每秒的价格。
7 ?) f+ C6 R$ K' p
C6 V5 t' d( Q
创建用户
8 L. _+ b) w3 i- e4 B4 ?
9 T5 ~: l8 N( ]$ V) k3 L Linux核心自己只不过视用户为数字。每个用户用一个单一的整数识别,userid或uid,因为数字对计算机来说比文本名字处理更快更容易。核心之外的一个单独的
数据库给每个userid安排了文本的名字,即用户名username。这个数据库还包含一些其他信息。
. W p0 U: \5 r7 Q# |
4 F. l! ~7 v) W0 N$ c# E
要产生一个用户,需要给用户数据库增加关于用户的信息,并给他产生家目录。培训用户、建立合适的初始化
环境也是必要的。
1 K5 J8 H% ]- ?; w0 \
* R4 j4 J3 A! v9 X 多数Linuxdistributions有产生帐号的
程序,而且有多个。adduser和useradd是其中2个;可能还有GUI的工具。Whatevertheprogram,theresultisthatthereislittleifanymanualworktobedone.Evenifthedetailsaremanyandintricate,theseprogramsmakeeverythingseemtrivial.However,section8.2.4describeshowtodoitbyhand.
' ?8 ^7 ?+ I) v1 s1 A
8 ~3 v$ f: v' w$ U2 |& ^
/etc/passwd和其他信息文件
) ?, d3 y: i5 E9 N0 j2 |
Unix系统的基本用户数据库是文本文件,/etc/passwd(叫口令文件),它列出所有有效用户名及其相关信息。文件的每个用户一行,分为用:分隔的7个域:
8 z- c# u' r; B" q; |( C/ \( r$ I
# q) g" H u1 d) G2 ? 用户名
/ F8 w% n' q7 J( v* N1 l 加密格式的口令
1 J6 O0 [4 R( `. e* F! s 数字的userid
7 w/ h0 o) f+ D7 m6 V 数字的groupid
# K P; p0 A+ N% \" ?, w7 r 全名或帐户的其他说明
: f' _0 \) R, m7 m9 }
家目录
& C. A1 q. l# p$ _2 ?/ w 登录
shell(登录时运行的程序)
, C8 y4 s$ Q4 ~/ f5 w. d. a4 V0 \, \; e$ y4 Y4 }
详细的格式说明在passwd(5)中。
: J0 l: I0 P$ K5 I' P
9 c1 {$ h3 R' U2 \9 H- I# g 系统中的任何用户可以读口令文件,因此他们可以得到其他用户的名字。即任何人也可以得到口令(第二个域)。口令文件加密了口令,所以利润上说应该没有问题。但是,加密是可破解的,尤其是口令比较简单时(例如太短,或能在词典中找到的)。因此,口令存在口令文件中并不好。
- M: n" ~& w- p' Y8 l& |% O; b! i$ y* N5 E3 L: j: R
许多Linux系统有影子口令shadowpasswords文件。这种方法将加密的口令存在另一个文件/etc/shadow中,而这个文件只有root能读。/etc/passwd文件在第二个域只有一个specialmarker。Anyprogramthatneedstoverifyauserissetuid,那么可以存取影子口令文件。而只使用口令文件其他域的普通程序,不能得到口令。
/ A2 ]" N8 c) B6 ^* W; `/ h. ~( |' n
取得数字的用户和组ID
8 c' u }. m# f1 m
( {1 Y3 W" r1 G; ^. U3 f 多数系统不管数字的用户和组ID是什么,但如果使用
网络文件系统(NFS),所有系统必须使用相同的uid和gid。因为NFS也用uid认证用户。如果不使用NFS,可以用帐户产生工具自动取得的uid。
8 q* S K7 y( M, P, c6 I0 r
4 f& J3 v9 Q: [: k, d9 k5 c 如果用NFS,必须用一个机制来同步帐户信息。一个方法是使用NIS系统(见[Kir])。
/ [, k8 L4 O% j( H, O4 x* O) u' A6 }: [' M
) [, Y4 y; w7 g/ d$ U$ j! C
1 R7 G4 c7 a% i# m9 g _5 q0 i6 K
初始环境:/etc/skel
+ {4 h: k. P# d$ _1 o
! u9 f: C4 X/ Z# l. i: q$ `8 ~
当新用户的家目录产生时,用/etc/skel目录的文件初始化。系统管理员可以产生/etc/skel里的文件给用户提供一个好的缺省环境。例如,产生一个/etc/skel/.profile设定EDITOR环境变量,提供新用户一个友善的编辑器。
% B3 W+ X- [' s3 ?7 P3 F/ T& N
9 T( M: Y2 Q& Z 然而,通常最好保持/etc/skel尽量小,因为itwillbenexttoimpossibletoupdateexistingusers'files.例如,如果友善的编辑器的名字改变了,所有现存用户必须编辑他们的.profile。系统管理员可以用一个script自动完成,但仍可能破坏某个用户的文件。
1 a( C6 x) x/ w! g+ l/ E; E& Y0 g, {+ ^6 K
只要可能,最好把全局设置放在全局文件中,如/etc/profile。这样可以升级,而避免破坏用户自己的设置。
5 }9 Z: @' y; I+ D I4 F! s% g! j5 ~$ T% X& N0 R1 _* C$ z! ~% I/ |
手工创建用户
* L% U' B7 {# s- @+ y
3 }# [ F) m0 c. |8 t 按以下步骤手工创建新用户:
! A( q' A* _* B" U$ }: Q& c
* I# \$ }: Z/ N5 R 用vipw(8)编辑/etc/passwd,为新用户增加一个新行。注意语法。不要用编辑器直接编辑!vipw锁定了这个文件,其他命令这时不能更新它。设定口令域为"*",这样不能登录。
+ j' X6 f( e6 A9 o
# n6 \& r5 d; M, X 类似,如果要创建新组,用vigr编辑/etc/group。
' ?& @ ?- G& B$ `
) ?3 p# T0 r4 X$ K 用mkdir产生用户的家目录。
" r% q$ m% [3 H
1 z! g6 L+ h6 I* t5 X; ^0 [ 将/etc/skel中的文件复制到新的家目录中。
" e% _7 s- g9 s+ m) U3 D
3 G5 i; a7 w1 z+ K5 ~+ f) k 用chown和chmod修改所有者和权限。-R选项是最有用的。Thecorrectpermissionsvaryalittlefromonesitetoanother,butusuallythefollowingcommandsdotherightthing:
9 T2 N6 Q7 v# ^; @! W4 o
& u' Y3 c. u3 Q1 c6 \ cd/home/newusername
/ Z. g* | u) Q0 W* P
chown-Rusername.group.
3 ~- t% R6 q7 `) J7 T
chmod-Rgo=u,go-w.
/ _% d2 W1 E7 D2 S& r chmodgo=.
9 R( M5 F8 k- e. j6 H0 q) p
* ]3 i/ |9 X- r( k2 r9 F* ?, y
用passwd(1)设定口令。
/ x$ O b+ w6 u$ {2 {. H4 |
8 d* ?* @5 C: W6 c
最后一步设定完口令,这个帐户就能用了。不应该在其他所有事做完之前设定口令,否则这个用户可能不允许登录whileyou'restillcopyingthefiles.
2 k! }# P2 r6 S1 A6 z. ^/ Q+ _' A" \
! v2 `* a' @4 j4 [7 j' ^
有时需要产生不为任何人使用的虚假(dummy)帐户例如,建立一个匿名FTP
服务器(这样任何人都可以从它
下载文件,无须得到一个帐户),必须产生一个叫ftp的帐户。这种情况,通常无须随后一步的口令设定。而且,最好不设,这样没有人可以使用这个帐户,除非先变成root,因为root可以变成任何用户。
6 a4 r$ e7 O" R" p& r+ R
' a" g" ?6 t( r- j M9 t, W 改变用户属性
: O; m" F2 h3 X4 v- K! q
" q8 f# I" V: s9 _% L" p 有几个改变帐户不同属性的命令(即/etc/passwd中的相关域):
( A- Z1 g- W1 p& k2 J7 F" S+ r2 b+ y; @. P2 C5 B
chfn
* F- }/ S6 G V4 Y
改变全名域。
0 T/ H% p- |7 O) | chsh
& s Q! ]; L3 g- |- S
改变登录shell。
% ]3 t* ~; Z7 H0 u% i. q6 s
passwd
$ D6 P" a+ s$ {; e6 K- Z+ V 改变口令。
8 [5 `( r3 T! }* o* T3 e9 P
/ q8 W. c% G, u8 _6 [/ D
超级用户可以用这些口令改变任何帐户的属性。普通用户只能改变自己帐户的属性。有时可能有必要使这些命令对普通用户不可用(用chmod),例如在一个有许多新手的环境中。
5 R; m4 }0 q4 K. T ]. T) T. ]2 a
+ r) B- E) |1 V: X7 ?
其他任务需要手工完成。例如改变用户名,需要编辑/etc/passwd(记住:用vipw)。同样,要增加或删除用户tomoregroups,需要编辑/etc/group(用vigr)。这种任务较少,需要小心从事:例如,改变了用户名,电子邮件就不能到达这个用户,除非你同时产生一个邮件别名。
( j( V* o4 J) m% f, H$ k8 J* I& h" s
删除用户
( _& M2 F0 o) S* z* K# _* \: ]. Y. Z9 E6 S# c
要删除用户,必须先删除他的所有文件,然后从/etc/passwd和/etc/group删除相关的行。有些Linuxdistributions带特定的命令,看看有没有deluser或userdel。然而,手工删除也很简单。
* H. {9 i4 X# c( Z: Y
7 U }) q9 `; [ 临时禁止一个用户
, R$ e0 d$ ]' \/ @
0 t- d+ \5 S& v 有时需要临时禁止一个用户,而不删除它。例如用户没有付费,或系统管理员怀疑黑客得到了某个帐户的口令。
0 K+ T5 q, r. w
3 X5 [/ U! V0 t. z# k4 j 禁止一个用户的最好方法是将它的shell变到一个特定的只打印出一条信息的程序,用这种方法,任何想登录此帐户的人将无法登录,并得知原因。该信息可以告诉用户与系统管理员联系,以处理任何问题。
5 D/ Z1 m! B4 F& y
6 _- [5 ~& C3 r3 s# h 也可以改变用户名或口令,但这样用户不知道怎么回事。Confusedusersmeanmorework.
" t5 g( ^; m; C: q
2 ]: ^ m1 U$ w: }0 w1 Y, |
产生上述特定程序的一个简单方法是写"tailscripts":
- Y( i5 w S1 |3 O/ z; O. x: x% ]. D6 u- t$ w$ @, T! u" F- N! V
#!/usr/bin/tail+2
1 i% k8 l1 l" r% L Thisaccounthasbeenclosedduetoasecuritybreach.
- `( }# N T* R: A Z! l1 ^ Pleasecall555-1234andwaitforthemeninblacktoarrive.
! [* _ y" b! A" x* x x
前2个字符("#!")告诉核心本行的其他部分是解释本文件要运行的命令。这样tail命令将输出处理第一行外的所有东西到标准输出。
0 Q3 x: y, ^( e: l) E5 V @
如果怀疑billg是个安全缺口,系统管理员可以这样做:
3 |1 V) E" h, k/ u) Z2 E7 C( Q
- ?, q* E+ X' u8 X+ T #chsh-s/usr/local/lib/no-login/securitybillg
' Y+ n- ?: v0 x* K1 I* f: s: s
#su-tester
- D/ ]7 v+ s8 b
Thisaccounthasbeenclosedduetoasecuritybreach.
6 U* }; T8 E, u
Pleasecall555-1234andwaitforthemeninblacktoarrive.
: X1 M0 K4 k" H! b6 @" r+ s
#
4 _& T q; a7 R2 t, L7 A: ?+ G* a* a su的目的是此时改变是否工作。
/ W7 P. r* ~% M' T$ U1 V6 p ] Tailscripts应该放在一个分离的目录中,这样它们的名字不会干扰普通用户的命令