# 用户
用户分类:
- 管理员用户:UID 为 0 ,名为 root 。
- 系统用户:UID 为 1~999 。
- 普通用户:UID 从 1000 开始。
# 用户组
:可包含多个用户,便于统一管理。
- 每个用户有且仅有一个基本用户组,可以添加多个扩展用户组。
- 系统基于 UID、GID 来识别用户、用户组。多个用户可以使用相同的 UID ,多个用户组可以使用相同的 GID 。
# 家目录
- 一般的用户都会被分配一个独立的主目录(又称为家目录),默认为
/home/<user>/
。- 例如 leo 的家目录是 /home/leo 。
- 特别地,root 用户的家目录是 /root 。
- 在终端中可以用
~
指代家目录,例如执行 cd ~ 即可进入家目录(执行 cd 也行)。
# 相关文件
/etc/passwd
文件允许被所有用户读取,用于保存所有用户的简介信息。如下:root:x:0:0:Superuser:/: daemon:x:1:1:System daemons:/etc: bin:x:2:2:Owner of system commands:/bin: sys:x:3:3:Owner of system files:/usr/sys:
- 每行的格式为 "用户名:密码(不显示):用户 ID:组 ID:描述信息:主目录: login shell" 。
- 伪用户:有些用户没有 login shell ,系统创建它们是为了方便管理。
- /etc/passwd 文件可以被所有用户读取。
/etc/shadow
文件只允许被 root 用户读取,用于保存加密后的用户密码。如下:root:$6$4jYHVJzl2zLgCJSrRJjyigxoP:18223:0:99999:7::: nobody:*:17834:0:99999:7::: sshd:!!:18178:::::: nginx:!!:18224::::::
- 每行的第一个字段是用户名,第二个字段是用户加密后的密码。其中,* 表示该用户被锁定,!! 表示密码已过期。
/etc/group
文件允许被所有用户读取,用于保存所有用户组的信息。如下:root::0:root bin::2:root,bin sys::3:root,uucp
- 每行的格式为 "组名:密码:组 ID:组内用户列表" 。
# PAM
:PAM(Pluggable Authentication Modules ,插入式认证模块)。是一组共享库,用于验证 Linux 用户身份。
- 例如执行 login 命令时就是调用 PAM 验证用户密码。
- 在
/etc/pam.d/
目录下保存各个程序的配置文件。 - 包含四个处理不同任务的模块:
- account :用于检查账号的属性,比如是否允许登录、是否过期。
- auth :用于验证用户的身份,比如提示输入密码、账号是否为 root 。
- password :用于修改密码。
- session :用于在开始会话、结束会话时执行任务,比如打开用户信息、挂载文件系统。
- 用户通过身份认证之后才会开始会话。
# 管理用户
# useradd
$ useradd <user> # 创建一个用户
-u <uid> # 指定 uid ,默认会自动分配一个数字
-g <group> # 指定基本用户组(默认会自动创建并分配一个与该用户同名的基本用户组)
-G <group>,... # 指定扩展用户组
-d /home/leo # 指定家目录
-m # 如果家目录不存在,则自动创建。默认会自动创建
-s /bin/bash # 指定 shell 解释器(默认为 /bin/bash )
-c <comment> # 加上描述信息
-e 2019-08-01 # 设置该用户的过期时间
- 管理用户的命令都需要 root 权限才能执行。
- 用 useradd 刚创建的用户,其初始密码是过期的,需要用 passwd 命令修改密码。
- login shell 为 /sbin/nologin 表示禁止该用户登录。
# usermod
$ usermod <user> # 修改用户的配置
-s /sbin/nologin # 修改 login shell
-dm /home/leo # 修改家目录,并将旧的家目录的文件移动过去
-aG <group>,... # 添加扩展用户组
- usermod 命令支持 useradd 命令的选项。
# userdel
$ userdel <user> # 删除一个用户,并删除其主目录
-r # 同时删除其主目录和 mail 文件
-f # 强制删除
# passwd
$ passwd [user] # 修改用户的密码(默认是当前用户)
-d # 删除用户的密码,使其登录时不再需要密码
-l # 锁定用户,使其不能登录
-u # 解锁用户
-S # 显示用户的密码状态(是否设置了密码、是否锁定)
- 普通用户使用 passwd 命令时只能修改自己的密码,并且要输入旧密码进行验证。而 root 用户可以直接修改任意用户的密码。
# 切换用户
# su
$ su [user] # 切换到指定用户(默认是 root )
- # 创建一个 login shell (默认是创建一个 non-login shell )
-c <command> # 不切换用户,只是以指定用户的身份执行一条命令
- 切换用户时并不会切换 tty 。
- 切换用户时, logname、tty 命令的结果不会变,而 whoami 命令的结果会改变。
# sudo
$ sudo <command> # 以 root 用户的身份执行命令
-u <user> <command> # 以指定用户的身份运行命令(可以用用户名或用户 ID 指定)
-l # 显示当前用户可通过 sudo 执行的命令
-S # 从 stdin 读取密码(从而可以通过 echo PASSWORD | sudo -l 的格式输入密码)
-v # 要求立即验证密码(每次验证密码后,默认 5 分钟内可免认证多次使用 sudo )
-k # 要求用户在下一次使用 sudo 时验证密码
- 普通用户执行
sudo
时需要输入自己的密码,而执行su -
时需要输入 root 的密码。因此,执行sudo su -
即可使用自己的密码切换到 root 用户。 /etc/sudoers
文件中记录了哪些用户有权限使用 sudo 命令,如下:root ALL=(ALL) ALL # 允许 root 用户在任何目录下以任何用户的身份执行任何命令 %sudo ALL=(ALL) ALL # 允许 sudo 用户组 leo ALL=(ALL) NOPASSWD: /usr/bin/docker,/root/run.sh # 允许 leo 用户不需要输入密码就执行规定的命令
- 只有 root 用户有权限编辑该文件。建议通过 visudo 命令编辑,以检查语法正确。
# 管理用户组
# id
$ id # 显示当前用户的 uid、gid、扩展用户组 id
<user> # 显示指定用户的
-u # 只显示 uid
-g # 只显示 gid
-G # 只显示扩展用户组 id
# groups
$ groups # 显示当前用户所属的用户组(用 su 切换用户之后会改变)
<user>... # 显示指定用户所属的用户组
# groupadd
$ groupadd <组名> # 增加一个用户组
# groupmod
$ groupmod
<旧组名> <新组名> # 修改用户组的名字
-g <ID> <组名> # 修改用户组的 ID
# groupdel
$ groupdel <组名> # 删除一个用户组