本章解释如何产生新用户帐户,如何修改帐户的属性,如何删除帐户。不同的
Linux系统有不同的工具实现。
_! r: w" y( ?" D- [. A' m2 |
什么是帐户?
( v2 T- l% H# V5 C5 F
当一台
计算机为多人所用时,通常需要区分用户,例如,使个人文件保持个人化。即使计算机同时只为一人所用,这也很重要,如多数微机。因此,每个用户给定一个单独的用户名,这个名字被用于登录。
+ P2 _- L' N; J) J7 {1 I E2 T* \, \4 P
用户除了名字还有更多。一个帐户是所有的文件、资源和属于这个用户的
信息。这个属于暗示是银行,在一个商业系统中,每个帐户通常与一些钱有关,且这些钱依赖于用户使用系统的多少以不同的
速度被花掉。例如,
磁盘空间可能有个每MB每天的
价格,处理
时间也可能有个每秒的价格。
% H/ e0 n/ Q" W2 X8 [0 B[color=#FFFFFF']
) j& D# D W" T& T
' J/ l; R0 m1 x. n/ \) R 创建用户
- \- k' R6 X; u
[color=#FFFFFF']
& l3 T( J4 i4 F7 a& R& O( J5 A
E% P% P* u7 b
Linux核心自己只不过视用户为数字。每个用户用一个单一的整数识别,userid或uid,因为数字对计算机来说比文本名字处理更快更容易。核心之外的一个单独的
数据库给每个userid安排了文本的名字,即用户名username。这个数据库还包含一些其他信息。
4 q1 F& T, B: o! S- ?[color=#FFFFFF']
/ Y' _/ I9 i% m" R; U& c- }
* \) C) q8 ?6 I) j( k
要产生一个用户,需要给用户数据库增加关于用户的信息,并给他产生家目录。培训用户、建立合适的初始化
环境也是必要的。
; E6 n1 k D3 \% a( Z
[color=#FFFFFF']
4 Z. h+ r4 H$ k' f1 G& E2 {5 Z1 G
8 D/ Y z9 V5 r 多数Linuxdistributions有产生帐号的
程序,而且有多个。adduser和useradd是其中2个;可能还有GUI的工具。Whatevertheprogram,theresultisthatthereislittleifanymanualworktobedone.Evenifthedetailsaremanyandintricate,theseprogramsmakeeverythingseemtrivial.However,section8.2.4describeshowtodoitbyhand.
9 L1 A) u7 j8 w1 u& V+ ^ /etc/passwd和其他信息文件
# i2 H' s. @) r; [+ Z$ q) _1 g! f
Unix系统的基本用户数据库是文本文件,/etc/passwd(叫口令文件),它列出所有有效用户名及其相关信息。文件的每个用户一行,分为用:分隔的7个域:
, @0 W9 W* T( s[color=#FFFFFF']
S2 n" H) B5 `
2 |* H; C* C" r( y' @, e 用户名
! P# T" Z' l$ g# k! c
加密格式的口令
2 @/ K; i, E' k* R1 } h* A
数字的userid
3 k# E4 O: M% k N' m! n( U 数字的groupid
# ]2 c' U3 L! E) j1 d 全名或帐户的其他说明
" C* o3 j r& N6 I7 l) Y& X 家目录
% q* q( J4 Q0 P1 W1 D& p 登录
shell(登录时运行的程序)
* b5 g% I4 s0 I" d n B/ x; R/ J 详细的格式说明在passwd(5)中。
1 u3 ?7 z5 {! h& s9 @
系统中的任何用户可以读口令文件,因此他们可以得到其他用户的名字。即任何人也可以得到口令(第二个域)。口令文件加密了口令,所以利润上说应该没有问题。但是,加密是可破解的,尤其是口令比较简单时(例如太短,或能在词典中找到的)。因此,口令存在口令文件中并不好。
5 e- i! h3 B0 ^. O4 Z 许多Linux系统有影子口令shadowpasswords文件。这种方法将加密的口令存在另一个文件/etc/shadow中,而这个文件只有root能读。/etc/passwd文件在第二个域只有一个specialmarker。Anyprogramthatneedstoverifyauserissetuid,那么可以存取影子口令文件。而只使用口令文件其他域的普通程序,不能得到口令。
6 ~$ W$ `$ O' y9 E$ O
取得数字的用户和组ID
d: d$ ~' G- P1 A" T* T( R K
多数系统不管数字的用户和组ID是什么,但如果使用
网络文件系统(NFS),所有系统必须使用相同的uid和gid。因为NFS也用uid认证用户。如果不使用NFS,可以用帐户产生工具自动取得的uid。
! o$ B4 H1 N5 [! G/ V. l[color=#FFFFFF']
1 f) P' y& {$ a. k7 _
, c2 m& i- P; n4 i 如果用NFS,必须用一个机制来同步帐户信息。一个方法是使用NIS系统(见[Kir])。
: b8 ~, I. m2 o* v$ _7 g7 F3 E
[color=#FFFFFF']
5 @* y: n7 N) ?0 F% c4 L9 S5 S7 w
3 [9 a, l$ m4 _) h
4 {5 g) s! a& q' y4 ~$ @' l 初始环境:/etc/skel
+ D: T; N5 o9 [! \; [& `# {5 ] Y 当新用户的家目录产生时,用/etc/skel目录的文件初始化。系统
管理员可以产生/etc/skel里的文件给用户提供一个好的缺省环境。例如,产生一个/etc/skel/.profile设定EDITOR环境变量,提供新用户一个友善的
编辑器。
) g2 K4 s' X) \7 a/ E- [ 然而,通常最好保持/etc/skel尽量小,因为itwillbenexttoimpossibletoupdateexistingusers\\\'files.例如,如果友善的编辑器的名字改变了,所有现存用户必须编辑他们的.profile。系统管理员可以用一个script自动完成,但仍可能破坏某个用户的文件。
# P; V1 a" l' q- J) H$ I: M[color=#FFFFFF']
$ D/ D# Y0 S* |& M# Q
9 Q& U% b7 a/ f1 E% T# E 只要可能,最好把全局设置放在全局文件中,如/etc/profile。这样可以升级,而避免破坏用户自己的设置。
! Y% B( E0 X+ f. W( U& h9 c5 b[color=#FFFFFF']
) l7 s$ z" v0 l8 x) G. t G
8 m4 I$ r, O% Z0 P. @* M
手工创建用户
4 C/ A& ]: G/ ^0 c; s2 b) @9 o
按以下步骤手工创建新用户:
# q9 C8 _! P: }" u0 D9 U, l: O 用vipw(8)编辑/etc/passwd,为新用户增加一个新行。注意语法。不要用编辑器直接编辑!vipw锁定了这个文件,其他命令这时不能更新它。设定口令域为"*",这样不能登录。
% {. H% @! g' Z0 J 类似,如果要创建新组,用vigr编辑/etc/group。
7 T# S& D* a- N# ?: U0 { 用mkdir产生用户的家目录。
% {% S3 i3 r0 y! g
将/etc/skel中的文件复制到新的家目录中。
0 }- f+ O/ q" ]8 A7 c Q( Y( w( X 用chown和chmod修改所有者和权限。-R选项是最有用的。Thecorrectpermissionsvaryalittlefromonesitetoanother,butusuallythefollowingcommandsdotherightthing:
& f& f" A$ |; i; V ?: u
cd/home/newusername
2 y8 q' g2 A; Q6 v7 O% C! v$ c) X
chown-Rusername.group.
" a. w. M9 T" x. S3 c+ K chmod-Rgo=u,go-w.
, [: Z: i9 A4 y3 y chmodgo=.
. T$ u2 Q$ q) C6 ^: B% d, g 用passwd(1)设定口令。
( c! Y3 {; L4 X) C8 A, g[color=#FFFFFF']
# r5 {, |$ u0 {3 ?
6 r7 c- {3 h! T* P3 w4 l 最后一步设定完口令,这个帐户就能用了。不应该在其他所有事做完之前设定口令,否则这个用户可能不允许登录whileyou\\\'restillcopyingthefiles.
. X: _- T4 e+ J( i& }" W7 S0 I3 L. H 有时需要产生不为任何人使用的虚假(dummy)帐户例如,建立一个匿名
FTP服务器(这样任何人都可以从它
下载文件,无须得到一个帐户),必须产生一个叫ftp的帐户。这种情况,通常无须随后一步的口令设定。而且,最好不设,这样没有人可以使用这个帐户,除非先变成root,因为root可以变成任何用户。
: k2 n: b2 |$ n" E! I$ v) f
改变用户属性
4 U E; v/ ~' A4 p3 m" q
有几个改变帐户不同属性的命令(即/etc/passwd中的相关域):
( x7 Y; {6 C9 G" \+ ^8 d) G[color=#FFFFFF']
( l5 w' k0 T% |- ~
7 z' g4 g" ^9 S+ Y. m" y7 y chfn
' Y* y5 l' ?' @! J 改变全名域。
g5 T$ R+ J( `' G Y chsh
+ u; D" B+ Q& ]" m( c# T 改变登录shell。
# d3 y& _+ b& F3 U* |* U passwd
. J3 ^* [" _' J, C* b5 J
改变口令。
+ \3 }3 A1 t: R. ~+ W
[color=#FFFFFF']
( H. N' C( ~# a6 J9 S" O' J7 N+ K
2 ^$ N2 z p6 j/ a
超级用户可以用这些口令改变任何帐户的属性。普通用户只能改变自己帐户的属性。有时可能有必要使这些命令对普通用户不可用(用chmod),例如在一个有许多新手的环境中。
2 e9 g8 R0 L' Z 其他任务需要手工完成。例如改变用户名,需要编辑/etc/passwd(记住:用vipw)。同样,要增加或删除用户tomoregroups,需要编辑/etc/group(用vigr)。这种任务较少,需要小心从事:例如,改变了用户名,
电子邮件就不能到达这个用户,除非你同时产生一个邮件别名。
H" P. u, T! F1 O) ]5 X6 ` 删除用户
+ p0 Q2 D/ p& v2 _4 _% T: f[color=#FFFFFF']
# ^) S t3 a6 Q8 C& m& F
: j3 }" n! l/ z' m6 ~ 要删除用户,必须先删除他的所有文件,然后从/etc/passwd和/etc/group删除相关的行。有些Linuxdistributions带特定的命令,看看有没有deluser或userdel。然而,手工删除也很简单。
. k: ]6 i# ?4 { k2 `' \# l8 u0 I 临时禁止一个用户
+ Y/ |+ Z$ U' }. O
[color=#FFFFFF']
P. d8 Z2 ~: J4 E. G/ S- f/ X e
: u6 U/ z' F( i% M4 T3 B4 D 有时需要临时禁止一个用户,而不删除它。例如用户没有付费,或系统管理员怀疑
黑客得到了某个帐户的口令。
- A, Q) P9 u$ M( w2 C( _ V2 ?
[color=#FFFFFF']
# g; y2 m2 v' O; P! z2 g" C2 ?; l) ?
8 e( C" f; j* @2 X' q9 a
禁止一个用户的最好方法是将它的shell变到一个特定的只打印出一条信息的程序,用这种方法,任何想登录此帐户的人将无法登录,并得知原因。该信息可以告诉用户与系统管理员联系,以处理任何问题。
: T9 y( @7 D9 ~' @) ?
[color=#FFFFFF']
9 a5 L2 S, N7 g1 q
/ y7 D) ?5 C" K* [8 @ 也可以改变用户名或口令,但这样用户不知道怎么回事。Confusedusersmeanmorework.
( k* s' B2 d) \5 A0 P% | 产生上述特定程序的一个简单方法是写"tailscripts":
% o# Y/ L' j$ E5 r9 i& `6 W& h #!/usr/bin/tail2
4 a/ w0 q5 s3 _" d+ ~ E6 T Thisaccounthasbeenclosedduetoasecuritybreach.
& S/ T/ v& c8 z( j/ v# l; c Pleasecall555-1234andwaitforthemeninblacktoarrive.
: O% G( x1 U" h7 C7 _ G
前2个字符("#!")告诉核心本行的其他部分是解释本文件要运行的命令。这样tail命令将输出处理第一行外的所有东西到
标准输出。
; f8 m- [2 i& B3 w 如果怀疑billg是个
安全缺口,系统管理员可以这样做:
3 l9 O. Z8 H0 D$ }$ P! N5 m- l[color=#FFFFFF']
5 ? U6 W* R* _/ h' J1 @- f* K
0 V1 v5 r7 d0 h% Q! D6 g1 T #chsh-s/usr/local/lib/no-login/securitybillg
, r, f9 d3 T) L6 T" g! D: \+ c #su-tester
: ?' k; n2 a6 F$ [4 T$ t
Thisaccounthasbeenclosedduetoasecuritybreach.
8 x, h# H$ g4 }0 N7 f) _ Pleasecall555-1234andwaitforthemeninblacktoarrive.
: ?5 ]7 |' X# V0 R
#
. h0 E' n% S$ L1 T! ] su的目的是此时改变是否工作。
8 V7 l! ]$ M9 q! \) d4 K' Q0 D
Tailscripts应该放在一个分离的目录中,这样它们的名字不会干扰普通用户的命令