建立一个新用户 
修改用户的个人设置 
文件目录的权限设置 
两个重要文件：passwd与group 



建立一个新用户 

建立一个新的用户包括两个步骤，第一步是使用useradd命令完成一个新用户的初始化设置工作；第二步是用passwd为这个新用户设置密码。例如，我们要给系统添加一个用户叫floatboat，密码为fan2001z，那相关的操作是： 
useradd floatboat <回车> 
这时候系统没有任何显示。接着： 
passwd floatboat <回车> 
系统显示： 
Changing password for user floatboat 
New UNIX password: 
你输入： 
fan2001z<回车> 
注意，由于linux并不采用类似windows的密码回显（显示为*号）——为避免你输入密码时被人注意到有多少位——所以，输入的这些字符你是看不见的。 
系统显示： 
Retype new UNIX password: 
你再重新输入一次密码，然后回车确认，这时系统会显示： 
passwd:all authentication tokens updated successfully 
表示你修改密码成功了。 
到这里，新用户的创建工作就算完成了。下面，我们再补充一些有关增加新用户的常识： 
1、useradd所做的初始化操作已经包括在/home目录下为floatboat帐号建立一个名为floatboat的主目录。如果你不想使用这个缺省的目录，而希望把他的主目录放在/home/goal里（还放在/home下，只是一种良好的习惯，没有其他什么特别的要求），可以使用useradd的参数-d，命令如下： 
useradd -d /home/goal floatboat 
2、useradd的初始化操作还包括为用户单独建立一个与用户名同名的组（floatboat组）。这叫用户私有组的机制，与默认组机制相对应。对用户分组一是方便管理，二是可以明确权限。复杂的我们将在以后的深入内容中探讨。我们如果想让此用户加入一个已有的组的话，可以使用-g参数。例如我们想让floatboat加入webusers组，那么可以使用以下命令： 
useradd -g webusers floatboat 
同样的，我们还可以使用-G参数使他同时加入多个组，例如webusers和ftpusers： 
useradd -G ftpusers,webusers floatboat 
3、passwd命令为一个用户设置密码，但它实质上是一个修改密码的程序。只有超级用户和用户自己可以修改密码，其它的普通用户没有给他修改密码的权利。用户密码的组成要尽量的复杂，最好包括字母、数字和特殊符号，而且最好设成6位以上。太短passwd程序不允许，只是单纯的字母或单纯的数字，passwd也会有意见。你都会看见passwd出现的提示的，不要害怕，仔细看看到底它是怎么说的：） 
4、你在增加一个新用户的时候，也可以设置用户登录的shell。缺省的，系统提供了/bin/bash。你如果非要指定的话，可以使用-s 参数就可以了。例如 
useradd -d /www -s /usr/bin/passwd floatboat 
注意，这些参数是可以一块使用的，如上例所示，它表示增加新用户，并把其主目录路径设置在/www，登录的shell为/usr/bin/passwd。关于shell的更详细的说明，请参考下面的修改用户的个人设置相关内容。 
5、删除一个用户可以使用userdel命令，直接带用户名做参数就可以了。 


修改用户的设置 

对现有用户的修改，比较常用的主要是修改密码（使用passwd就好了），修改用户的登录shell，修改用户所属的默认组，设置帐号有效期，修改用户的说明信息等等，偶尔也会用到修改用户主目录。 

修改用户的登录shell 
使用chsh命令可以修改自己的shell，只有超级用户才能用chsh username为其它用户修改shell设置。注意，指定的shell必须是列入/etc/shells文件中的shell，否则该用户将不能登陆。 
一般，比较常见的shells文件包括下面这些shell： 
/bin/bash2 
/bin/bash 
/bin/sh 
/bin/ash 
/bin/bsh 
/bin/tcsh 
/bin/csh 
而网管们还喜欢在里面加上/usr/bin/passwd，这是为了不然用户通过控制台或telnet登录系统，却可以使用修改帐户密码（比如在FTP里用）。以及/bin/false，也就是不让这个用户登录的意思喽^&^，连FTP也不能用。 
你也可以使用usermod命令修改shell信息，如下所示： 
usermod -s /bin/bash floatboat 
其中/bin/bash和floatboat应取相应的shell路径文件名及用户名。 
还有一种情况，就是你为用户设置了一个空的shell（就是""），也就是说，这个用户没有shell。呵呵，绝对没有在我还未曾见过，因为这种用户登录后，系统还是会给它一个shell用的。不信你试试： 
usermod -s "" floatboat 
这种用户根据系统的不同，会有一个sh或bash进行操作，我也没有看出功能上和其它普通用户登录有什么不同。 


修改用户所属的默认组 
这个功能也可以通过usermod命令来实现，使用-g参数，例如把floatboat的默认组改为nobody，可以使用如下命令： 
username -g nobody floatboat 
nobody在类UNIX系统中一般都意味着没有任何权限。 

设置帐号有效期 
如果使用了影子口令，则可以使用如下命令来修改一个帐号的有效期： 
usermod -e MM/DD/YY username 
例如把用户floatboat的有效期定为2001年12月31日： 
usermod -e 12/31/01 floatboat 
如果把该用户的有效期设为已经过去的时间，就可以暂时禁止该用户登录系统。 

修改用户的说明信息 
修改用户的说明信息，最简单的方法莫过于直接修改/etc/passwd文件，找到对应的用户记录行，例如下列行： 
floatboat:x:503:503::/home/floatboat:/bin/bash 
你可以直接在第四个冒号和第五个冒号之间插入该用户的说明就可以了。其实，很多用户设置都可以在这修改，比如该行最后一部分/bin/bash就是用户登录shell的设置。关于这个/etc/passwd文件，我们后面将进一步的深入探讨。 


修改用户主目录 
修改用户的主目录主要使用usermod命令的-d参数，例如： 
usermod -d /www floatboat 
这一行将floatboat的主目录改到/www。如果想将现有主目录的主要内容转移到新的目录，应该使用-m开关，如下所示： 
usermod -d -m /www floatboat 


文件目录的权限 

linux下，每一个文件、每一个目录都有一个属主，并针对用户自己、用户所在组、其它所有帐号（组）分别设定读、写、执行三种权限。例如，我（假定是webusers组的floatboat帐户的拥有者）使用如下命令建立一个新的文件 
touch mytestfile 
然后我们使用ls -l mytestfile这一命令来查看这个文件的权限状态（关于ls命令，可以查阅本站的命令查询），可以得到如下的屏幕输出显示： 
-rw-rw-r-- 1 floatboat webusers 0 Feb 6 21:37 mytestfile 
输出由空格分为9个部分，我们比较关心第一、三、四个字段，分别表示文件权限属性、文件所有者帐户、文件所属组。 
◆使用chown命令修改文件的主人 
当你新建立一个文件的时候，文件的所有者当然就是你了。这一事实只有超级用户（比如说root）才可以通过chown命令改变（例如 chown otheruser mytestfile,把mytestfile文件的属主改为otheruser）。普通用户不能把自己的文件“送”给别人，不然你把有特殊目的的程序给了root怎么办？：） 
chown命令的用法比较简单。这里我先假设你现在拥有超级用户权限，那么你就可以使用如下命令将一个文件“送给”floatboat了： 
chown floatboat /home/floatboat/thefileisrootcreate.txt （假定该文件是由root创建的） 
修改一个目录的所有者也是类似的： 
chown floatboat /home/newboat 
当然，如果这个目录还有子目录及文件需要同时送给floatboat，chown也是支持-R参数的： 
chown -R floatboat /home/newboat 
如果你同时想修改文件/目录所属的组的话，你可以使用以下命令方便的达到目的： 
chown -R floatboat.ftpusers /home/newboat 
这样，不但文件主人得到了修改，文件所属的组也变成了ftpusers 
◆ 修改文件的组属性 
文件所属组你倒是可以改变，前提是： 
1、你的超级用户。 
2、你同时属于两个或两个以上的组。 
两个条件你至少具备一个，你才能够把文件所属旧组变为新组。使用如下的命令将当前目录下所有html文件所属的组改为httpd： 
chgrp httpd *.html 
和chown命令一样，chgrp也可以使用-R参数对一个目录内的所有文件和子目录进行递归的修改组属性。 
<提示>：你可以使用不带参数的groups命令查看自己属于哪个组。 

文件权限的设定是我们这一小节讨论的核心，我们主要介绍chmod命令的两种用法。 

◆使用访问字符串设置文件目录权限 
正如前面所说的，每一个文件、目录都针对用户自己、用户所在组、其它所有帐号（组）分别有读、写、执行三种权限及其组合。当一个普通用户新建一个文件的时候，它默认的访问权限显示就如我们刚才所举例子的第一个字段所示。总共十位字符“-rw-rw-r--”，第一位是目录区分标志，如果是d的话，表示这是一个目录。第二到四位分别表示文件所有者的读（r：read）、写（w:write）、执行（x:execute）属性，第五到七位是文件所属组的读、写、执行权限，第八到第十位则是其它用户的读、写、执行权限。如果对应的位是相应的字母，就是有这相应权限，否则为“-”，表示没有获得这个许可。象刚才例子中的文件就是自己可读写，本组可读写，其它用户可读，所有的用户（包括自己）都不能执行它。 
我们的用u、g、o分别来指代用户（user）、组（group）、其它帐户（other），就可以方便的设置文件和目录的权限了。当然，我们也可以用a来表示所有的这三项。 
例如，我们要对所有perl的脚本文件设定权限，对所有用户都可以读和执行，文件所有者还允许写许可，那么我们可以使用如下命令： 
chmod a+rx,u+w *.pl 
注意：如果要使用多个访问字符串，它们之间要用逗号隔开，各个许可字符串之间不允许有空格。正如上例所示。 
如果要修改目录中所有文件和子目录的权限属性，可以使用chmod提供的-R参数来递归修改。例如，下列命令将/www/site1目录及其下面的子目录的权限属性设定为所有者和组可读、写、执行，其它用户不可访问： 
chmod -R a+rwx,o-rwd /www/site1 
注意，不要轻易使用-R选项，这可能会带来安全隐患。 
使用字符串方便了理解，单输入那么多字母还是有点累，如果你对8进制有些概念的话，可以使用下面介绍的方法来做权限设置。 

◆使用八进制数设置文件目录权限 
我们知道，在ls -l的输出中，文件权限表示为“-rw-rw-r--”，前一位只和是否为目录有关，其它九位正好可以分成三段，每段三位，“rw-”、“rw-”和“r--”,“-”代表无效“0”，其它字符代表有效“1”，那么这个文件的权限就是“110”、“110”、“100”，把这个2进制串转换成对应的8进制数就是6、6、4，也就是说该文件的权限为664（三位八进制数）。我们也可以使用类似这种三位八进制数来设定文件授权，如上边两个例子，就也可以写为： 
chmod 755 *.pl 
chmod -R 770 /www/site1 
是不是很简洁？关键在于你能根据你需要设定的权限正确的选择八进制数（利用八进制数的二进制表示可以非常轻易的做到这一点）。 

◆读、写、执行的权限说明 
1、所谓写的权限，也就是对文件修改和删除的权限。如果目录的写权限也对你开放了，则可以创建、删除或修改该目录下的任何文件或自目录——即使该文件和子目录并不属于你。 
2、对目录有只读许可的用户，不能用cd命令进入该目录；还必须同时有执行许可才可以进入该目录。 
3、必须同时拥有读和执行权限才可以使用ls这样的程序列出目录内容清单。 
4、只对目录有执行权限的用户，想访问该目录下的文件有读权限的文件，必须知道该文件名才可以访问。 


两个重要文件：passwd与group 

在linux的安全机制里，/etc/passwd与/etc/group这两个文件占着非常重要的地位。它们控制着linux的用户和组一些重要设置。 
◆/etc/passwd文件说明 
下面是一个RHlinux里普通的passwd文件的例子： 
root:x:0:0:root:/root:/bin/bash 
bin:x:1:1:bin:/bin: 
daemon:x:2:2:daemon:/sbin: 
…… 
operator:x:11:0:operator:/root: 
games:x:12:100:games:/usr/games: 
gopher:x:13:30:gopher:/usr/lib/gopher-data: 
ftp:x:14:50:FTP User:/home/ftp: 
nobody:x:99:99:Nobody:/: 
xfs:x:43:43:X Font Server:/etc/X11/fs:/bin/false 
named:x:25:25:Named:/var/named:/bin/false 
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash 
lanf:x:500:500::/home/hujm:/bin/bash 
mysql:x:101:101:MySQL server:/var/lib/mysql:/bin/bash 
imnotroot:x:0:0::/home/imnotroot:/bin/bash 

在这个文件里只有一个普通帐号lanf。其它都是系统或系统服务的进程需要的帐号，包括我们非常熟悉的root这个超级用户。在passwd的文件里，每一行被冒号（":"）分成7个部分，分别是： 
[用户名]：[密码]：[UID]：[GID]：[身份描述]：[主目录]：[登录shell] 
其中： 
⒈[用户名]是passwd文件里各记录行唯一的有"唯一性"要求的域。也就是说每一行的第一个区域的内容都不能相同，其它区域就无所谓了。 
⒉[密码]区域在以前，保存着一个经过不可逆的哈希算法进行DES加密的13位字符，但不包括单引号和冒号。这13位字符中，前两位是密钥，在加密的时候随机生成的。由于这个字符串不包括单引号，所以以前有一种不修改密码又禁止用户登录的方式就是在密码前面加一个单引号。值得注意的是，现在由于使用了shadow口令，在密码区域只有一个x字符。　 
⒊[UID]虽然是系统用来标志文件归属，确定各种权限的标志，但这个区域的内容并不要求唯一的。比较常见而又与安全问题相关的一个例子是有多个UID和GID均为0的用户帐号。注意到在该文件最后一行还有一个UID和GID为0的用户imnotroot，虽然它声称自己不是root，但是它却有和root完全相同的权限，因为系统并非根据[用户名]，而是根据UID和GID来分用户的权力的。所以，这种情况无疑为系统埋下了安全的炸弹。但是，当imnorroot做锁定屏幕等操作的时候，如果它的密码和root的不一样，它将无法解锁，因为系统只是查到第一个UID为0的用户（自然是root）后，就不在往下查找了——它当UID也是唯一的。 
⒋[GID]用户默认的组ID，这个ID可以在文件 /etc/group里查到对应的组名。 
⒌[身份描述]：就是用户的身份说明，默认的是无任何说明，可人工添加。 
⒍[主目录]：用户的主目录，可以使用前面介绍的命令修改。 
⒎[登录shell]：用户登录时系统提供的shell，请参考前面的有关内容。 
<注意>：[UID]和[GID]小于500的一般都是系统自己保留，不做普通用户和组的标识的，所以新增加的用户和组一般都是UID和GID大于500的。 

◆/etc/group文件说明 
下面是RH的一个group文件的例子： 
root:x:0:root,hujm,hjm 
bin:x:1:root,bin,daemon 
daemon:x:2:root,bin,daemon 
sys:x:3:root,bin,adm 
adm:x:4:root,adm,daemon 
tty:x:5: 
disk:x:6:root 
lp:x:7:daemon,lp 
mem:x:8: 
kmem:x:9: 
wheel:x:10:root 
mail:x:12:mail 
news:x:13:news 
uucp:x:14:uucp 
…… 
hujm:x:503:root,mynoshell,hjm 
mysql:x:101: 
mynoshell:x:505: 
ftpusers:x:506: 
它总共分四个部分： 
[组名]：[密码域]：[GID]：[组员列表] 
意思非常明显，需要说明一下的是，由于组一般都不用密码保护，所以虽然看起来密码域有个X字符，其实那只表示使用了SHADOW（对应文件为gshadow）。组员列表用逗号分隔各个帐号。另外，一个组的组员如果默认登录组就是它的话，那么在组员列表里将不显示这个组员的帐号，例如用如下命令增加的用户： 
useradd -g ftpusers floatboat 
在/etc/group文件里ftpusers的组员列表将不显示这个组员（真是失败），而只是在passwd文件中的GID被设置为506。而使用如下命令： 
usermod -G ftpusers,mysql,webusers floatboat 
就可以看见相关的组后边加上了floatboat帐号。当然，你可以直接用vi来直接编辑这个文件。 
group文件和passwd文件是通过GID联系在一起的，这有点象关系数据库。根据passwd文件中一个帐户的GID，可以在group文件中找到对应的组名。如果采用了用户私有组机制的话，那么一般新增一个帐号，就会有对应的一个与帐号同名的组增加到group文件中。虽然这时passwd文件中具有唯一性的[用户名]字段和group文件中具有唯一性的[组名]字段一样，并不代表着它们是通过这两个字段形成一一对应的关系的。千万别忘记，系统对数字（UID，GID）更加敏感^_^。 
再有一点应该注意，你统计一个组的组成员的时候，千万别只记得看组成员列表哦，还应该查找默认登录组也是这个组的用户——它们可不一定在列表里。 
〈提示〉新组的增加可以使用 groupadd newgroupname。


