4.3 用户和组的管理
4.3.1与管理用户和组有关的配置文件
Linux把用户账户、用户密码、组账户和组密码信息存放在不同的配置文件中。
1.用户账户文件/etc/passwd
Linux系统把用户账户及其相关信息(密码除外)存放在配置文件“/etc/passwd”中,该文件的预设属性是“-rw-r--r--”,形式如图4-11所示。
图4-11 一个“/etc/passwd”文件
可以看出,passwd文件中每行定义一个用户账户,由7个字段构成,分别表示账户名、密码、UID(所属的用户)、GID(用户的有效组,即用户所创建文件默认所属的组)、用户信息说明、家目录、Shell,各字段值间用“:”分隔。
注意:“/sbin/nologin”是一个特殊的Shell,使用户无法登录,通常用于系统账户。
2.用户密码文件/etc/shadow
2.用户密码文件/etc/shadow
Linux系统将用户密码及其相关的信息单独保存在配置文件“/etc/shadow”中,该文件的预设属性是“-r--------”,形式如图4-12所示。
图4-12 一个“/etc/passwd”文件
可以看出,shadow文件的形式类似于passwd文件,其每行由9个字段构成,分别表示账户名、密码、最近更改密码的日期、密码不可被更改的天数、密码需要重新变更的天数、密码需要变更期限前的警告期限、密码过期的宽限时间、账户失效日期、保留字段。
3.用户组账户文件
用户组账户信息保存在配置文件“/etc/group”中,其预设属性是“-rw-r--r--”,形式如图4-13所示。该文件每行定义一个组账户,由4个字段构成,分别表示用户组名称、密码、GID、支持的账户名称。
图4-13 一个“/etc/group”文件
4.用户组密码文件
用户组的真实密码保存在配置文件“/etc/gshadow”中,其预设属性是“-r--------”,形式如图4-14所示。该文件由4个字段构成,分别表示用户组名称、密码、组管理员账户、支持的账户名称。
图4-14 一个“/etc/gshadow”文件
5.新建用户的配置文件
为什么在创建一个用户时,会自动创建其主目录、分配UID并设置密码策略呢?其实奥妙就在文件“/etc/login.defs”中,下面就来对该文件的内容进行分析。
4.3.2 私有(primary)组和有效(effective)组
用户一登录系统,就立刻拥有他的私有组的相关权限。例如,用户teacher的/etc/passwd、/etc/group、/etc/gshadow的相关内容以及用户teacher的身份信息如图4-15所示。
图4-15 用户teacher的属组信息
可以看出,用户teacher目前仅属于其私有组teacher,该组默认成为用户teacher的有效组。下面新建一个network组,并把用户teacher加入该组,命令如下:
# groupadd network # usermod -G network teacher # id teacher uid=522(teacher) gid=522(teacher) groups=522(teacher),525(network)
其中,gid所指的组即为有效组。此时尽管teacher加入了network组,但有效组不变。
下面试着改变用户teacher的有效组,并再次验证其身份信息,如图4-16所示。
图4-16 改变用户teacher的有效组
4.3.3与用户和组管理有关的命令
1.用户账户管理
(1)添加用户账户。
用法:# useradd [option] username
选项及参数说明:
◇ -u 用户ID 手工指定新用户的UID,该值必须唯一,且大于499。
◇ -g 所属的主要组 该GID会被放置到文件“/etc/passwd”的第4栏。
◇ -G 所属的其他组 该参数会修改文件“/etc/group”的相关内容。
◇ -d 主目录 指定用户的家目录,默认为“/home/username”。
◇ -m 若家目录不存在,则创建它。
◇ -M 不创建家目录。
◇ -s shell 指定用户登录时的shell,默认为“/bin/bash”。
◇ -r 创建一个系统账户,该类用户的UID值在1~499之间。默认不创建对应的家目录。
【范例】 创建一个名为zyc1的用户,并作为network组的成员:
# useradd -g network zyc1 # passwd zyc1 # tail -1 /etc/passwd zyc1:x:524:525::/home/zyc:/bin/bash
(2)设置用户账户属性。
用法:# usermod [option] username
选项及参数说明:
◇ -c 注释信息 对账户进行说明,该参数修改文件“/etc/passwd”的第5栏。
◇ -g 组账户名 该参数修改文件“/etc/passwd”的第4栏(GID)。
◇ -G组账户名 该参数修改该用户所属的其他组(附加组),即修改文件“/etc/group”。
◇ -d 用户的家目录 该参数修改文件“/etc/passwd”的第6栏。
◇ -e 失效日期 日期格式为:YYYY-MM-DD,该参数修改文件“/etc/shadow”的第8栏。
◇ -l 用户账户名 该参数修改文件“/etc/passwd”的第1栏。
◇ -s Shell文件 设置用户登录使用的shell,例如:/bin/bash、/bin/csh等。
◇ -u UID 该参数修改文件“/etc/passwd”的第3栏。
◇ -L 锁定用户账户,使其无法登录系统。该参数在“/etc/shadow”的密码栏首位添加“!”。
◇ -U 将用户账户解锁,该参数将去掉文件“/etc/shadow”的密码栏首位的“!”。
【范例】 将用户zy1c更名为zhangyingchun,将其家目录更改为“/home/zhangyingchun”,设置其密码在2012年12月12日失效。命令如下:
# usermod -l zhangyingchun -d /home/zhangyingchun -e “2012-12-12” zyc1 # tail -1 /etc/passwd zhangyingchun:x:524:525::/home/zhangyingchun:/bin/bash # grep zhangyingchun /etc/shadow zhangyingchun:$1$Brbh5rBf$SCwajnNVcfLA16aYLc9w9.:15041:0:99999:7::15686:
【范例】 暂时锁定用户账户zhangyingchun。
# usermod -L zhangyinchun # grep zhangyingchun /etc/shadow zhangyingchun:!$1$Brbh5rBf$SCwajnNVcfLA16aYLc9w9.:15041:0:99999:7::15686:
(3)删除用户账户。
用法:# userdel [-r] username
选项及参数说明:
-r:连同用户的家目录一并删除。
【范例】 将用户账户zhangyingchun完整地删除。
# userdel -r zhangyingchun
2.用户密码管理
(1)设置用户登录密码。
使用useradd建立了用户账户之后,必须先设置密码才能登录系统。只有root才有权设置指定账户的密码,一般用户只能设置自己账户的密码。
用法:# passwd [username]
(2)锁定账户密码。
用法:# passwd -l username
在Linux中,除了用户账户可被锁定外,账户密码也可被锁定。只要任何一方被锁定,都将导致该账户无法登录系统。该命令在文件“/etc/shadow”的密码栏首位添加“!!”。只有root才有权执行该命令。
(3)解锁账户密码。
用法:# passwd -u username
该命令去掉文件“/etc/shadow”中密码栏首位的“!!”。只有root才有权执行该命令。
(4)查询密码状态。
用法:# passwd -S username
该命令用来查询当前账户的密码是否被锁定。若账户密码被锁定,将输出“Password locked.”,若未锁定,则显示“Password set,MD5 crypt.”。
【范例】 锁定用户petcat的密码,查询其状态,然后解锁:
(5)删除账户密码。
用法:# passwd -d username
只有root才有权删除账户的密码。密码被删除后该账户将不能登录系统。
3.管理用户组
(1)创建用户组。
用法:# groupadd [-g gid] [-r] groupname
选项及参数说明:
◇ -g gid 直接指定该组的GID值。
◇ -r 建立系统组。该类用户组的GID值在1~499之间。
(2)修改用户组属性。
用户组创建后,可以修改用户组的名称和用户组的GID值。
用法:# groupmod [-g gid] [-n groupname] groupname
选项及参数说明:
◇ -g gid 修改用户组的GID 值。
◇ -n groupname 修改用户组的账户名称。
【范例】 创建一个名为sg的系统用户组,然后将其账户名更改为sgnew,GID更改为102:
# groupadd -r sg # tail -1 /etc/group sg:x:101: # groupmod -g 102 -n sgnew sg # grep sgnew /etc/group sgnew:x:102:
(3)删除用户组。
用法:# groupdel groupname
在删除用户组时,被删除的用户组不能是某个账户的私有组,否则将无法删除,若要删除,则应先删除该私有组中的账户,然后再删除该组。
(4)设置组管理员。
用法:# gpasswd [-A user1, ...] groupname
说明:设置为组管理员的用户不一定属于该组。
(5)管理组。
所谓管理组,就是将用户加入/移出指定的组。
用法:# gpasswd -a|-d username groupname
【范例】 用户student是testgroup组中的成员,请将用户petcat设置为network组的管理员,然后以petcat的身份将用户zhangyingchun加入该组,并从该组中移除用户teacher。操作过程如图4-17所示。
图4-17 管理组范例