2009-07-28/15:33
DruLavigne
01/03/2001
FreeBSD是个多用户环境;一个系统管理员主要的工作之一就是建立用户账号并向用户提供一个安全的工作环境。要有效地完成此工作需要在建立任何用户之前作一些预期规划。
即使如果你是个人FreeBSD系统的唯一用户,仍需要至少建立一个用户账号来完成常规的工作。记住,只在工作需要超级用户权限的时候才用超级用户账号。
在你的FreeBSD系统上象一位系统管理员那样练习规划是个好主意,因为你可以增长管理“实际”生产环境的基本技术。
当你建立一个用户时,在后台会发生很多事情:更新一些数据库,建立邮件目录以及用户的宿主目录。当建立用户时,你必须提供一定数量的信息,包括用户名和口令。在这篇文章中,我打算集中于用户策略以及建立用户账号上。
你建立的每个用户账号都必须有一个在FreeBSD系统上唯一的名字。在较小的环境这很容易做到,但如果你必须建立一打,成百甚至上千个用户就稍微要困难一点了。为了有助于确保唯一性,你应该有一套用户命名策略。如果没有适当的策略,你需要建立一套命名方案,紧记一些用于用户名的限制。首先,用户名应被限制在16个字符之内,而一些协议,如NIS,需要用户名少于8个字符。其次,用户名不能以连字符“-”起首。再次,你应该避免使用大写字母和句点,因为这些会搞乱一些邮件程序。
在较小环境中的策略样例可以用用户的名和姓首字母来建立用户名。你可能要对此稍加修改以避免冲突。例如,如果你需要为MikeSmith和MikeSpencer建立账号,可以建立“mikes”和“michaels”,或“mikesm”和“mikesp”。
其它的策略可以用用户的姓和名首字母并作适当的修改来建立用户名以避免冲突。如果你需要为MarkSmith和MichelleSmith建立账号,可以建立“smithma”和“smithmi”。
在稍大的环境中,你可能要用较多字符分别表示名和姓。例如,如果命名策略是名部分的首四个字符后跟姓部分的首四个字符,那么MarkSmith应该是“marksmit”,而MichelleSmith应该是“michsmit”。你仍需要有一份后备计划用于那些姓和名都少于指定的字符数量。例如,如果我需要用上述策略为MyLee建立一个账号,我应该建立“my_lee”。
除非你处于一个相当小的环境之中,避免非说明性的昵称,如我用在自己系统上的“biko”和“genisis”是比较明智的。
总而言之,一个好的用户命名策略表明了对用户名的限制,而且是避免命令冲突的一个应急方法。
一旦你决定了一套命令方案,你就可以用adduser工具建立用户账号了。这个工具有一个配置文件/etc/adduser.conf,它还会读取一个讯息文件/etc/adduser.message。这些文件在你首次使用adduser工具前还没有被创建。下面跟我一起建立一个用户;我会使用v或verbose开关,所以我们将看到所有可能的提示信息。你会看到adduser首先创建它的配置文件,然后在建立用户时把它作为一个模板。
adduser-v
Youarenotroot!
哦。看起来这是个需要root权限的管理工作。让我们再试一次:
su
Password:
adduser-v
/etc/adduser.conf:Nosuchfileordirectory
可以看到这是我首次在该系统上使用“adduser”工具;它还没有一个配置文件。
Useoption"-silent"
ifyoudon'twanttoseeallwarningsandquestions.
Check/etc/shells
Check/etc/master.passwd
Check/etc/group
Enteryourdefaultshell:bashcshdatenoshtcsh[sh]:tcsh
adduser读取一个含有系统上安装的所有命令解释器的路径的文件/etc/shells;然后显示用户可以使用的解释器。注意,向用户提供的缺省解释器是Bourneshell(sh),但我把它改为tcsh。
Yourdefaultshellis:tcsh->/bin/tcsh
EnteryourdefaultHOMEpartition:[/home]:
Copydotfilesfrom:/usr/share/skelno[/usr/share/skel]:
当我们建完用户并在接受了从/usr/share/skel目录拷贝点文件看到的信息之后,可以去看一下那个目录里的内容。
Sendmessagefromfile:/etc/adduser.messageno
[/etc/adduser.message]:
Create"/etc/adduser.message"?(y/n)[y]:
Usepasswords(y/n)[y]:
Writeyourconfigurationto/etc/adduser.conf?(y/n)[y]:
可以看到adduser在/etc目录下建立了adduser.message和adduser.conf文件。现在准备建立我们的用户:
Ok,let'sgo.
Don'tworryaboutmistakes.
Iwillgiveyouthechancelatertocorrectanyinput.
Enterusername[a-z0-9_-]:dlavigne
Enterfullname[]:DruLavigne
Entershellbashcshdatenoshtcsh[tcsh]:
Enterhomedirectory(fullpath)[/home/dlavigne]:
Uid[1000]:
Enterloginclass:default[]:
Logingroupdlavigne[dlavigne]:
Logingroupis"dlavigne".
Invitedlavigneintoothergroups:guestno
[no]:
Enterpassword[]:
Enterpasswordagain[]:
Name: dlavigne
Password:****
Fullname:DruLavigne
Uid: 1000
Gid: 1000(dlavigne)
Class:
Groups: dlavigne
HOME:/home/dlavigne
Shell: /bin/tcsh
OK?(y/n)[y]:
Addeduser"dlavigne"
Sendmessageto"dlavigne"and:norootsecond_mail_address
[no]:
DruLavigne,
youraccount"dlavigne"wascreated.
Havefun!
Seealsochpass(1),finger(1),passwd(1)
Addanythingtodefaultmessage(y/n)[n]:
Sendmessage(y/n)[y]:
Copyfilesfrom/usr/share/skelto/home/dlavigne
Addanotheruser?(y/n)[y]:n
Goodbye!
现在我已经顺利地建立了一个用户,我将离开超级用户账号。让我们以新用户身份登录,看一下他们有些什么东东并描述一下这里的内容:
login:dlavigne
Password:
pwd
/usr/home/dlavigne
ls-la
total12
drwxr-xr-x2dlavignedlavigne512Dec3011:21./
drwxr-xr-x4rootwheel512Dec3010:44../
-rw-r--r--1dlavignedlavigne628Dec3010:44.cshrc
-rw-r--r--1dlavignedlavigne299Dec3010:44.login
-rw-r--r--1dlavignedlavigne160Dec3010:44.login_conf
-rw-------1dlavignedlavigne371Dec3010:44.mail_aliases
-rw-r--r--1dlavignedlavigne331Dec3010:44.mailrc
-rw-r--r--1dlavignedlavigne722Dec3010:44.profile
-rw-------1dlavignedlavigne276Dec3010:44.rhosts
-rw-r--r--1dlavignedlavigne852Dec3010:44.shrc
你可以看到为用户建立了一个宿主目录,里面包含很多以点起首的文件。记得我们使用adduser工具时提到的点文件目录吗?让我们现在来看一下:
ls-l/usr/share/skel
total10
drwxr-xr-x2rootwheel512Dec811:53./
drwxr-xr-x26rootwheel512Nov2008:11../
-rw-r--r--1rootwheel628Nov2007:01dot.cshrc
-rw-r--r--1rootwheel299Nov2007:01dot.login
-rw-r--r--1rootwheel160Nov2007:01dot.login_conf
-rw-------1rootwheel371Nov2007:01dot.mail_aliases
-rw-r--r--1rootwheel331Nov2007:01dot.mailrc
-rw-r--r--1rootwheel722Nov2007:01dot.profile
-rw-------1rootwheel276Nov2007:01dot.rhosts
-rw-r--r--1rootwheel852Nov2007:01dot.shrc
可以看到在我们新用户的宿主目录建立的八个文件都是从这个目录中拷贝的模板文件。另外也可以看到只有超级用户才可以编辑skel目录里的文件。例如,如果你希望所有用户都得到定制过的命令解释器提示符,那么超级用户可以修改usr/share/skel/dot.cshrc文件,此文件会在建立账号时拷贝到所有用户的宿主目录中。还有,超级用户也可以在该目录中放入他希望用户得到的任何其它点文件;例如你可以为用户建立定制好的.xinitrc文件。
现在让我们看一下adduser工具建立的/etc/adduser.message文件:
more/etc/adduser.message
#
#Messagefileforadduser(8)
#comment:"#"
#defaultvariables:$name,$fullname,$password
#othervariables:see/etc/adduser.confafter
#line"##DONOTDELETETHISLINE!"
#
$fullname,
youraccount"$name"wascreated.
Havefun!
Seealsochpass(1),finger(1),passwd(1)
让我们把它和新用户收到的信息比较一下;我使用mail命令该用户的邮件信息:
login:dlavigne
Password:
Youhavemail.
mail
Mailversion8.16/6/93.Type?forhelp.
"/var/mail/dlavigne":1message1new
>N1genisisSatDec3012:2420/540"Welcome"
&1
Message1:
FromgenisisSatDec3012:24:192000
Date:Sat,30Dec200012:24:19-0500(EST)
From:UserGenisis
To:dlavigne
Subject:Welcome
DruLavigne,
youraccount"dlavigne"wascreated.
Havefun!
Seealsochpass(1),finger(1),passwd(1)
&^DSaved1messageinmbox
>^Dexit
你可以看到我在成为超级用户以便使用adduser命令这前是以用户“genisis”登录的。我的新用户收到的信息就是adduser.message中包含的内容,而插入的$fullname和$name变量都以实际的值作了替换。
当建立了账号时,我们会得到以下的选项:
Addanythingtodefaultmessage(y/n)[n]:
如果我要建立其它账号并打入y,我会得到以下提示:
Use"."or^Daloneonafiletofinishyour
message
我打入的内容都会被加入到缺省的信息中,然后发给该特定的用户;但是,这不会覆盖我原先创建的/etc/adduser.message文件。让我们来试一下这样做;我将添加一个称为“test”的账号,显示我们关心的输出并“剪掉”其余的:
adduser
<剪掉>
Addanythingtodefaultmessage(y/n)[n]:y
Use"."or^Daloneonalinetofinishyourmessage.
Don'tforgetthateveryFridayispizzaday!
.
Sendmessage(y/n)[y]:y
现在让我们看一下用户test的邮件信息是什么样的:
login:test
Password:
Youhavemail.
mail
Mailversion8.16/6/93.Type?forhelp.
"/var/mail/test":1message1new
>N1genisisSatDec3012:4722/567"Welcome"
&1
Message1:
FromgenisisSatDec3012:47:072000
Date:Sat,30Dec200012:47:07-0500(EST)
From:UserGenisis
To:test
Subject:Welcome
test,
youraccount"test"wascreated.
Havefun!
Seealsochpass(1),finger(1),passwd(1)
Don'tforgetthateveryFridayispizzaday!
再看一下新信息是否被加到了模板文件:
more/etc/adduser.message
#
#Messagefileforadduser(8)
#comment:"#"
#defaultvariables:$name,$fullname,$password
#othervariables:see/etc/adduser.confafter
# line"##DONOTDELETETHISLINE!"
#
$fullname,
youraccount"$name"wascreated.
Havefun!
Seealsochpass(1),finger(1),passwd(1)
看来只有该用户收到了附加的信息,这正如我们所期望的。在离开adduser.message文件之前我还想做更多的例子。我想让用户在他们的欢迎邮件中收到下面这条附加信息:
Ifyouhaveanyproblems,contacttheadministratorat
admin@thiscompany.com
试一下你自己建立一个账号并把这行加到他们的信息中;你会看到当你以该用户登录时,附加行没有出现在邮件信息中。但是如果你把这行改成:
Ifyouhaveanyproblems,contacttheadministratorat
admin\@thiscompany.com
那么用户就会收到附加信息了。注意,我们必须用\符号避开@符号,以便正确解释。
最后,让我们看一下刚才建立的adduser.conf文件:
more/etc/adduser.conf
#/etc/adduser.conf-automaticgeneratedbyadduser(8)
#
#Note:adduserread*and*writethisfile
#Youmaychangevalues,butdon'taddnewthingsbeforethe
#line"##DONOTDELETETHISLINE!"
#usepasswordfornewusers
#defaultpasswd=yes|no
defaultpasswd=yes
#copydotfilesfromthisdir("/usr/share/skel"or"no")
dotdir="/usr/share/skel"
#sendthisfiletonewuser
#("/etc/adduser.message"or"no")
send_message="/etc/adduser.message"
#configfileforadduser("/etc/adduser.conf")
config="/etc/adduser.conf"
#logfile("/var/log/adduser"or"no")
logfile="/var/log/adduser"
#defaultHOMEdirectory("/home")
home="/home"
#Listofdirectorieswhereshellslocated
#path=('/bin','/usr/bin','/usr/local/bin')
path=('/bin','/usr/bin','/usr/local/bin')
#commonshelllist,firstelementhashigherpriority
#shellpref=('bash','tcsh','ksh','csh','sh')
shellpref=('csh','sh','bash','tcsh','ksh','no','date')
#defaultshellifnotempty("bash")
defaultshell="tcsh"
#defaultgroup('USER'forsameas
#usernameoranyothervalidgroup)
defaultgroup=USER
#defaultclassifnotempty
defaultclass=""
#newusersgetthisuid(1000)
uid_start="1000"
##DONOTDELETETHISLINE!
##yourownvariables,see/etc/adduser.message
##end
你可以看到这是个简单的文件,它包含了对adduser工具提示问题的回答。你看到的新信息只是该文件含有adduser记录文件的存放位置。如果看一下这个记录文件,会看到建立账号时的记录:
more/var/log/adduser
2000/12/3012:24:18dlavigne:*:1000:1000(dlavigne):DruLavigne
2000/12/3012:47:06test:*:1001:1001(test):test