Linux 基础 - 用户和群组
参考资料:
本文大纲:
Linux 使用文件及配置相应的权限来存储用户帐号和群组信息,在成功创建好用户帐号之后,以下几处文件会发生相应的改变
- /etc/passwd: Linux 管理用户帐号的数据库
- /etc/shadow: Linux 管理用户帐号密码配置的数据库
- /etc/group: Linux 管理群组的数据库
- /etc/gshadow: Linux 管理群组密码配置的数据库
用户帐号管理
Linux 系统用户管理相关命令主要有:
useradd
:新建用户passwd
:设置用户密码chage
: 变更密码策略usermod
:编辑用户userdel
:删除用户
新建用户帐号 - useradd
linux 系统以 useradd
命令来新建 Unix 用户,该命令带有一系列参数:
1 | useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM] [-c 说明栏] [-d 家目录绝对路径] [- s shell] <new-user-name> |
例如,执行以下命令新建一个用户:
1 | $sudo useradd pango |
该命令创建一个名为 pango
的用户,由于没有使用 -r
指令,将随机分配一个 1000 以上的数值作为 uid
,创建一个名为 pango
的群组并作初始群组,为该用户创建 Home 目录,使用 /bin/bash 作为工作环境。该命令对系统的以下部分做出修改:
- 在 /etc/passwd 里面新建一行用户值,包含 UID/GID/Home 目录等;
- 在 /etc/shadow 里面将此用户的密码相关参数填入,但是尚设置密码;
- 在 /etc/group 里面加入一个与用户名称一样的群组名称,如果已经存在与该用户名同名的群组名,则不会新建群组
- 在 /home 目录下新建一个与帐号同名的目录作为用户的 Home 目录,且权限为 700
注意,在 linux 系统中新增用户帐号和群组时,名称是区分大小写的
useradd
指令参考 /etc/defaults/useradd 文件中的配置作为缺省参数的预设值,使用 useradd -D
指令查看预设值:
1 | $ useradd -D |
使用 nano
或 vim
查看 /etc/default/useradd 文件可以得到更多的详细信息:
1 | $ nano /etc/default/useradd |
登录信息参考在 /etc/login.defs 文件中定义,使用 nano
查看该文件
1 | $ nano /etc/login.defs |
所以,系统在执行 useradd
命令时至少会参考:
- /etc/default/useradd
- /etc/login.defs
- /etc/skel/*
现在查看 /etc/passwd 档案的最后一行:
1 | pango:x:1000:1000::/home/pango:/bin/bash |
该文件是存放所有用户信息的数据库,每一行代表一个用户,每行由 6 个 :
分隔成了 7 个栏位:
- 用户名
- 密码
- 用户 UID:0 保留给系统管理员 root 账号;1
999 保留给系统账号,这些账号通常为执行某些系统服务所用,不能通过4294967295,保留给一般账号shell
登录;1000 - 用户初始群组 GIP
- 备注
- Home 目录,预设值为 /home/{username}
- 执行 Shell 的程序目录,预设值为 /bin/bash
设置帐号密码 - passwd
现在,新建的用户 pango 还没有密码,在设置密码之前是无法登录的,执行 passwd
1 |
|
passwd
指令在不接参数时表示修改当前登录用户的密码
密码设置成功后,在 /etc/shadow
文件中发生了一些改变,定位到该文件的最后一行:
1 | pango:$6$csIys5qj$OslSKU.3SljbHXTXJEPgWvNi1w9CGlBKO3uqJyWueQN1ypA7SuNzJWjesdSvg6KPv0X6tRmkkDBFI2cbSJ.xR/:17600:0:99999:7::: |
该文件存储了所有用户的密码相关配置,每一行代表一个用户的密码信息,每行由 8 个 :
分隔为 9 个栏位:
- 用户名
- 经过加密的密码
- 最近修改密码日期,该值为一个代表
day
的数值,从 1970-01-01 日算起 - 密码不可修改天数:该值指示密码在最近一次修改后多久之后才能再次被修改
- 密码有效期(天):该值指示密码再最近一次修改后的有效天数
- 密码需要变更前的警告天数
- 密码失效延迟(天):密码过期后的缓冲时间
- 账号失效日期(天):该值指示该用户的总生命周期多长,与密码有效无效无关
- 系统保留扩展项:
通过标准输入 --stdin
来修改密码,例如,帮助 pango 用户将其密码修改为 ‘abc543CC’
1 | $ echo "abc543CC" | passwd --stdin pango |
--stdin
选项并不存在于所有 Linux 发行版本的系统中,使用前先man passwd
查看是否支持
管理帐号密码策略 - chage
除了使用 passwd
指令,还可以使用 chage
指令来管理密码策略,其用法大致如下:
1 | $ chage [-ldEImMW] 用户帐号名 |
passwd -S
只是简单显示了密码详情,而 chage -l
更多为管理员提供了更强的参考信息,列出 pango 的详细密码参数 :
1 | $ chage -l pango |
修改用户帐号信息 - usermod
当需要修改用户帐号的信息时,我们可以通过前往相应的文件例如,/etc/passwd 和 /etc/shadow 中去修改对应行的值以达到修改用户帐号信息的目的。也可以使用 usermod
指令对用户帐号进行修改:
1 | $ usermod [-cdegGlsuLU] username |
删除用户帐号 - userdel
当需要删除用户帐号时,执行 userdel
命令,该命令会对以下文件造成影响:
- 用户帐号/密码相关值:/etc/passwd,/etc/shadow
- 用户群组相关参数:/etc/group,/etc/gshadow
- 用户个人资料目录:/home/{username},/var/spool/mail/{username}
该指令用法如下:
1 | $ userdel [-r] username |
例如,删除 pango 用户帐号及其 Home 目录:
1 | $sudo userdel -r pango |
通常,在移除一个帐号时,我们可以手动修改 /etc/passwd 和 /etc/shadow 文件中该用户关联的行数据。如果该帐号只是「暂时冻结」,那么将 /etc/shadow 中第 8 栏(帐号失效日)设为 0 就可让该账户无法使用,但所有与该帐号相关的资料都会保留,使用 userdel
意味着「真的确定该用户不会在主机上的使用任何资料了」。
通常,一个用户在使用主机一段时间之后,会在更多其他的目录中产生属于他的文档,因此,在下达
userdel -r username
之前,先以find / -user username
指令查出整个系统内属于 username 的档案,删除之后,再删除该用户帐号。
用户端指令 - id, finger, chfn, chsh
useradd
,usermod
,userdel
都是系统管理员才能使用的命令,一般用户无法进行操作,有以下几个指令供一般用户使用:
- id: 该指令可以查询当前用户或其他用户的 UID/GID 值
- finger: 查询用户的口令信息,将有
- Login: 用户帐号信息
- Name: 备注信息
- Directory: Home 目录
- Shell: shell 对应的程序
- Never logged in: 登入信息
- No mail: 查看 /var/spool/mail 中的信箱资料
- No Plan: 查看 ~{username}/.plan 资料
- chfn: 修改指纹信息,不常用
- chsh: 修改 shell,参数如下:
- -l,列出所有可用的 shell,即 /etc/shells 中的内容
- -s,修改为指定的 shell
群组管理
群组管理涉及新增,修改和删除,群组的内容与以下两个档案有关:
- /etc/group
- /etc/gshadow
新增群组 - groupadd
使用 groupadd
来新增群组,该命令使用方法如下:
1 | $ groupadd [-g gid] [-r] 群组名称 |
执行命令查看新建的群组:
1 | $ nano /etc/group |
该命令查询 /etc/group 文件,该文件是 linux
系统保存所有群组的数据库,每一行代表一个群组,每行的值由 3 个 :
分隔为 4 栏不同的值,其具体指:
- 群组名称
- 群组密码,以
x
表示,引用 /etc/gshadow 的第 2 栏 - 群组 id
- 该群组包含的用户名称,每个用户名称由
,
分隔
x
表示该群组的密码,其在 /etc/gshadow 文件中对应第 2 栏的值,gshadow
文件保存了所有群组的详细配置,但只有拥有 root
权限的用户才能查看该文件。由于该群组刚刚创建,没有指定任何用户,故该值为空。
查看 /etc/gshadow 文件可以看到对应的行,其格式如下:
1 | <your-new-group-name>:!::usernames |
这个文件内的格式几乎与 /etc/group 一摸一样,第 2 栏是密码栏,如果密码栏为 ‘!’ 或空,表示该群组不具有群组管理员:
- 群组名称
- 密码栏,若为 ‘!’ 表示无合法密码,无群组管理员
- 群组管理员的帐号
- 所有加入该群组的帐号,与 /etc/group 内容相同
修改群组 - groupmod
与 usermod
类似,groupmod
指令用于对已有群组的信息进行修改
1 | $ groupmod [-g gid] [-n group_name] 群组名 |
一个群组创建之后,为了避免引起不必要的错乱,通常不建议随意修改其 GID
删除群组 - groupdel
1 | groupdel [groupname] |
使用 groupdel
来删除已有的群组,如果有用户帐号已经关联一个群组作为其初始群组,将无法直接删除该群组,否则当用户登入系统后,系统将找不到其对应的群组。想要删除该群组,必须:
- 修改与之关联的用户的初始群组
- 删除该用户,再删除群组
群组管理员 - gpasswd
1 | $ gpasswd groupname |
初始群组,次要群组和有效群组
在执行 useradd
命令新建用户时,使用 -g
命令指定初始群组,该群组的 GID 被写入到 /etc/passwd 对应的 GID 栏位,而 -G
指定的次要群组则将用户名写入 /etc/group 第 4 栏。
当用户登入系统进入 shell
环境后,系统总是以该用户所在的初始群组作为有效群组,即,当用户执行类似 touch
的指令创建新的文件或文件夹时,其权限会给予用户当前的有效群组。执行 groups
可查看当前登录用户所属的所有群组,排在第一位的即表示当前有效群组。
可通过执行 newgrp
指令将用户所属的另一个群组切换为当前有效群组,该动作导致用户进入另一个 shell
环境,当用户完成操作不再需要该群组支持时,应使用 exit
指令退回到之前的 shell
环境。