07-账户管理
07-账户管理
基本概念
在 Linux 操作系统中,每个用户对应一个账户。用户账户是用户的身份标识,通过账户用户可登录到某台计算机上,访问已经被授权访问的资源。每个用户账户都可以有自己的主目录(Home Directory,“家目录"),主目录或称主文件夹,是用户登录后首次进入的目录。
Linux的系统通常将用户分为三种类型:
- 超级用户(super user):超级用户就是root用户,可以用于执行所有的任务,具有系统的最高权限
- 系统用户(system user):由管理员创建,用于日常登录和操作的用户账户。
- 普通用户(regular user):既不是文件所有者,也不属于文件所属组的用户。
| 类型 | 英文 | 含义 |
|---|---|---|
| 👑 超级用户 | root | 老大,啥都能干 |
| 👤 普通用户 | user | 正常使用的人 |
| 👥 其他用户 | other | 既不是你,也不是你这组的人 |
Linux 系统中使用用户 ID(简称 UID)作为用户账户的唯一标识。 在 Linux系统中,root账户的UID 为 0; 系统账户的 UID的范围为 1-999, 还包括 65534; 普通用户的 UID 默认从1000 开始顺序编号一直到65535。
除了用户当然还有用户组这东西存在,用于进行权限的划分。
用户和用户组有4种对应关系:
- 一对一:一个用户只存在一个组,是唯一的成员
- 一对多:一个用户可以存在与多个组别,用户拥有多个组的权限
- 多对一:多个用户可以存在于同一个组,和这些用户具有相同的权限
- 多对多,多个用户存在于多个组
配置文件
用户
Linux 操作系统用户账户及其相关信息(除密码之外)均存放在/etc/passwd 配置文件中。由于所有用户对该文件均有读取权限,因此密码信息并未保存在该文件中,而是保存在/etc/shadow 文件中。
我们可以使用cat命令**[文件查看的命令都是可以的]**查看passwd和shadow文件:
cat /etc/passwd
passwd文件内容的格式如下:
用户名:密码:UID:GID:用户描述:主目录:默认shell- 用户名:长度不能超过32个字符,可以使用下划线和连字符,不同的发行版可能有自己独特的命名规则。
- 密码:密码使用的是x代替,因为passwd文件不保存密码信息
- UID:用户账户的编号
- GID:用户所属的默认组
- 用户描述:可以是用户的名称或者其他信息
- 主目录:用户登陆后首次进入的目录,这里是绝对路径
- shell:用户登陆后使用的命令行界面
注
如果默认的shell字段是空,也就是什么都没显示,表示使用的是/bin/bash

shadow文件内容格式解析如下:
用户名 : 加密密码 : 最后一次修改密码的时间 : 最小修改间隔天数 :
大密码有效期 : 密码到期前警告天数 :
密码过期后的宽限期(不活动期) :
账号失效日期 : 保留字段注
shadow为文件查看权限只有Root用户才有,系统用户需要提权操作,shadow每行定义和保存一个账户的相关信息
用户组
用户组的配置文件是/etc/group 文件

group文件字段解析如下:
组名:组密码:GID:组成员列表在该文件中,用户的主要组不会将该用户自己作为成员列出,只有用户的次要组才会将其作为成员列出。
组账户密码配置文件是gshadow。

gshadow字段格式如下:
组名:加密后的组密码:组管理员:组成员列表配置文件的每一个字段信息我们都必须了解并且熟知,这有利于我们对用户进行更好的权限分配与管理。介绍了配置文件,用户和用户组的概念,接下来就是用户管理的内容了。
用户与用户组的管理
su
su命令用于切换当前用户身份到指定用户或者以指定用户的身份执行命令或程序。直接使用su默认切换root用户。
语法:
su [选项] [-] [<用户> [参数...]]
-m, -p, --preserve-environment:不重置环境变量
-w, --whitelist-environment <list>:不重置指定的环境变量
-g, --group <group>:指定主组
-G, --supp-group <group>:指定辅助组
-, -l, --login:将 shell 设置为登录 shell
-c, --command <command>:通过 -c 将单个命令传递给 shell
--session-command <command>:通过 -c 将单个命令传递给 shell,并且不创建新的会话
-f, --fast:为 csh 或 tcsh 设置快速模式
-s, --shell <shell>:如果 /etc/shells 允许的话,就运行指定的 shell
-P, --pty:创建一个新的伪终端
-h, --help:显示此帮助信息
-V, --version:显示版本信息常见的root用户切换方法,操作如下:
切换到root用户
miui@Fedora:~$ su
密码:
root@Fedora:/home/miui#退出root用户
root@Fedora:/home/miui# exit
exit
miui@Fedora:~$我们可以观察到命令提示符前面的变化,从miui@Fedora:~$到root@Fedora:/home/miui#,然后再回到miui@Fedora:~$的一个过程。
sudo
sudo命令是Linux中给普通用户用于提升一些权限的操作,我们在前面的一些演示中已经用过很多次了,但是一直没有讲解。在某些情况下,我们不能使用权限更高的root账户,因为危险系数过高,误操作难以造成一些不必要的损失,为了提高工作效率和安全性,sudo命令诞生,他允许系统管理员让普通用户执行一次权限更高的危险操作。
sudo - 以其他用户身份执行一条命令
usage: sudo -h | -K | -k | -V
usage: sudo -v [-ABkNnS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-ABkNnS] [-g group] [-h host] [-p prompt] [-U user]
[-u user] [command [arg ...]]
usage: sudo [-ABbEHkNnPS] [-r role] [-t type] [-C num] [-D directory]
[-g group] [-h host] [-p prompt] [-R directory] [-T timeout]
[-u user] [VAR=value] [-i | -s] [command [arg ...]]
usage: sudo -e [-ABkNnS] [-r role] [-t type] [-C num] [-D directory]
[-g group] [-h host] [-p prompt] [-R directory] [-T timeout]
[-u user] file ...
选项:
-A, --askpass 使用助手程序进行密码提示
-b, --background 在后台运行命令
-B, --bell 提示时响铃
-C, --close-from=num 关闭所有 >= num 的文件描述符
-D, --chdir=directory 运行命令前改变工作目录
-E, --preserve-env 在执行命令时保留用户环境
--preserve-env=list 保留特定的环境变量
-e, --edit 编辑文件而非执行命令
-g, --group=group 以指定的用户组或 ID 执行命令
-H, --set-home 将 HOME 变量设为目标用户的主目录
-h, --help 显示帮助消息并退出
-h, --host=host 在主机上运行命令(如果插件支持)
-i, --login 以目标用户身份运行一个登录
shell;可同时指定一条命令
-K, --remove-timestamp 完全移除时间戳文件
-k, --reset-timestamp 无效的时间戳文件
-l, --list
列出用户权限或检查某个特定命令;对于长格式,使用两次
-n, --non-interactive 非交互模式,不提示
-P, --preserve-groups
保留组向量,而非设置为目标的组向量
-p, --prompt=prompt 使用指定的密码提示
-R, --chroot=directory 运行命令前改变根目录
-r, --role=role 以指定的角色创建 SELinux 安全环境
-S, --stdin 从标准输入读取密码
-s, --shell 以目标用户运行
shell;可同时指定一条命令
-t, --type=type 以指定的类型创建 SELinux 安全环境
-T, --command-timeout=timeout 在达到指定时间限制后终止命令
-U, --other-user=user 在列表模式中显示用户的权限
-u, --user=user 以指定用户或 ID
运行命令(或编辑文件)
-V, --version 显示版本信息并退出
-v, --validate 更新用户的时间戳而不执行命令
-- 停止处理命令行参数其实这里面很多选项我们都用不到,我们进行提权操作的时候会直接在命令前面添加sudo。
新增用户
useradd命令增加新用户。使用 useradd 命令所增加的新用户,实际上是保存在/etc/passwd 文本文件中。
语法:
useradd [选项] 登录名
useradd -D
useradd -D [选项]
-b, --base-dir BASE_DIR 新账户的主目录的基目录
--btrfs-subvolume-home use BTRFS subvolume for home directory
-c, --comment COMMENT 新账户的 GECOS 字段
-d, --home-dir HOME_DIR 新账户的主目录
-D, --defaults 显示或更改默认的 useradd 配置
-e, --expiredate EXPIRE_DATE 新账户的过期日期
-f, --inactive INACTIVE 新账户的密码不活动期
-F, --add-subids-for-system add entries to sub[ud]id even when adding a system user
-g, --gid GROUP 新账户主组的名称或 ID
-G, --groups GROUPS 新账户的附加组列表
-h, --help 显示此帮助信息并退出
-k, --skel SKEL_DIR 使用此目录作为骨架目录
-K, --key KEY=VALUE 不使用 /etc/login.defs 中的默认值
-l, --no-log-init 不要将此用户添加到最近登录和登录失败数据库
-m, --create-home 创建用户的主目录
-M, --no-create-home 不创建用户的主目录
-N, --no-user-group 不创建同名的组
-o, --non-unique 允许使用重复的 UID 创建用户
-p, --password PASSWORD 加密后的新账户密码
-r, --system 创建一个系统账户
-R, --root CHROOT_DIR chroot 到的目录
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
-s, --shell SHELL 新账户的登录 shell
-u, --uid UID 新账户的用户 ID
-U, --user-group 创建与用户同名的组
-Z, --selinux-user SEUSER 为 SELinux 用户映射使用指定 SEUSER
--selinux-range SERANGE use a specific MLS range for the SELinux user mapping我们直接通过一些实践案例来进行学习,熟练操作。
我们创建一个qingyao的账户,操作如下:

警告
注意:在fedora操作系统中添加用户需要使用sudo进行提权,或者使用root用户,在其他的Linux发行版中,可能不需要提权,不同的发行版对设计时候的需求不同,因此存在差异。
创建一个用户lisa,并且指定所属的群组为root组,操作如下:

添加一个新的用户meizu,指定一个目录为/home/Flyme11,操作如下:

添加一个用户geek,并且指定他的UID为1010,操作如下:

以上就是一些简单的用户添加操作,也是比较常用的没还可以多种选项同时使用。
修改用户密码
passwd命令用于用户认证的设置,如账户密码修改,账户锁定,密码有效时长等。直接运行passwd命令是对当前用户进行操作,如果要对其他用户进行操作,需要root权限。
语法:
passwd [选项] <账户>
-k, --keep-tokens 保持身份验证令牌不过期
-d, --delete 删除命名帐户的密码(仅限 root 用户);也删除密码锁(如果有)
-l, --lock 锁定指名帐户的密码(仅限 root 用户)
-u, --unlock 解锁指名帐户的密码(仅限 root 用户)
-e, --expire 终止指名帐户的密码(仅限 root 用户)
-f, --force 强制执行操作
-x, --maximum=DAYS 密码的最长有效时限(只有 root 用户才能进行此操作)
-n, --minimum=DAYS 密码的最短有效时限(只有 root 用户才能进行此操作)
-w, --warning=DAYS 在密码过期前多少天开始提醒用户(只有 root 用户才能进行此操作)
-i, --inactive=DAYS 当密码过期后经过多少天该帐号会被禁用(只有 root
用户才能进行此操作)
-S, --status 报告已命名帐号的密码状态(只有 root 用户才能进行此操作)
--stdin 从标准输入读取令牌(只有 root 用户才能进行此操作)修改用户qingyao的密码,操作如下:

我们可以使用-S来查看账号的密码状态,

删除用户
userdel命令用于删除指定的用户及与该用户相关的文件,英文全称即“user delete"。其实userdel 命令实际上是修改了/etc/passwd、/etc/shadow 以及/etc/group 文件中对应用户的信息。
语法:
user [选项] [用户名]
-f, --force force some actions that would fail otherwise
e.g. removal of user still logged in
or files, even if not owned by the user
-h, --help 显示此帮助信息并退出
-r, --remove 删除主目录和信件池
-R, --root CHROOT_DIR chroot 到的目录
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
-Z, --selinux-user 为用户删除所有的 SELinux 用户映射删除用户qingyao,并且不删除家目录和文件,操作如下:

删除用户lisa,并且删除掉用户的目录和文件,操作如下:

强制删除用户meizu,操作如下:

警告
注意:只有使用强制删除,才能避免创建重复用户已存在的情况,删除用户的时候可以同时使用多个参数,例如-f、-r同时使用,防止出现更多的问题。如图:

修改用户信息
usermod命令用于修改用户账号。usermod 可用来修改用户账号的各项设定,修改系统账号文件来反映通过命令行指定的变化。
语法:
user [选项] [登录名]
-a, --append GROUP 将用户追加至上边 -G 中提到的附加组中,
并不从其它组中删除此用户
-q, --badname 允许 bad name
-c, --comment COMMENT GECOS 字段的新值
-d, --home HOME_DIR 用户的新主目录
-e, --expiredate EXPIRE_DATE 设定帐户过期的日期为 EXPIRE_DATE
-f, --inactive INACTIVE 过期 INACTIVE 天数后,设定密码为失效状态
-g, --gid GROUP 强制使用 GROUP 为新主组
-G, --groups GROUPS 新的附加组列表 GROUPS
-h, --help 显示此帮助信息并退出
-l, --login NEW_LOGIN 新的登录名称
-L, --lock 锁定用户帐号
-m, --move-home 将家目录内容移至新位置 (仅于 -d 一起使用)
-o, --non-unique 允许使用重复的(非唯一的) UID
-p, --password PASSWORD 将加密过的密码 (PASSWORD) 设为新密码
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
-r, --remove remove the user from only the supplemental GROUPS
mentioned by the -G option without removing
the user from other groups
-R, --root CHROOT_DIR chroot 到的目录
-s, --shell SHELL 该用户帐号的新登录 shell
-u, --uid UID 用户帐号的新 UID
-U, --unlock 解锁用户帐号
-v, --add-subuids FIRST-LAST 添加子 UID 范围
-V, --del-subuids FIRST-LAST 移除子 UID 范围
-w, --add-subgids FIRST-LAST 添加子 GID 范围
-W, --del-subgids FIRST-LAST 移除子 GID 范围
-Z, --selinux-user SEUSER 用户的新的 SELinux 用户映射
--selinux-range SERANGE new SELinux MLS range for the user account更改用户geek的登陆目录为Flyme11,操作如下:

重要
注意:修改完登录目录后在登录之前需要将目录 /etc/skel/ 下的.bash_logout、.bash_profile、.bashrc 三个隐藏文件拷贝到更改后的用户主目录。登录后才能正常进入该用户的用户环境。
修改用户qingyao的用户UID为1002,操作如下:

修改qingyao用户的用户名为xiaoqingyao,操作如下:

新增用户组
groupadd命令用于创建一个新的组群,新组群的信息将被添加到文件/etc/group和文件/etc/gshadow 等系统文件中。
语法
groupadd [选项] [组名]
-f, --force 如果组已经存在则成功退出
并且如果 GID 已被使用则取消 -g
-g, --gid GID 为新组使用 GID
-h, --help 显示此帮助信息并退出
-K, --key KEY=VALUE 不使用 /etc/login.defs 中的默认值
-o, --non-unique 允许创建有重复 GID 的组
-p, --password PASSWORD 为新组使用此加密过的密码
-r, --system 创建一个系统账户
-R, --root CHROOT_DIR chroot 到的目录
-P, --prefix PREFIX_DIR directory prefix
-l, --list 该组的用户成员列表创建一个GID为1009,组群名称为tianyunge的组,操作如下:
sudo groupadd -g 1009 tianyunge
[sudo] miui 的密码:
cat /etc/group
...省略
miui:x:1000:
docker:x:990:
mysql:x:27:
geek:x:1010:
qingyao:x:1011:
tianyunge:x:1009:创建一个GID为368,组群名为development的系统群组,操作如下:
sudo groupadd -r -g 368 development
cat /etc/group
...省略
miui:x:1000:
docker:x:990:
mysql:x:27:
geek:x:1010:
qingyao:x:1011:
tianyunge:x:1009:
development:x:368:删除组群
groupdel命令用于删除指定的组群,本命令要修改的系统文件同样包括/etc/group和/etc/gshadow 两个文件。
注
userdel修改系统账户文件,删除与 GROUP 相关的所有项目。给出的组名必须存在。若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。
语法:
groupdel [选项] [组]
-h, --help 显示此帮助信息并退出
-R, --root CHROOT_DIR chroot 到的目录
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
-f, --force 即便是用户的主组也继续删除使用groupdel命令删除刚才创建的development群组,操作如下:
sudo groupdel development
[sudo] miui 的密码:
cat /etc/group
...省略
miui:x:1000:
docker:x:990:
mysql:x:27:
geek:x:1010:
qingyao:x:1011:
tianyunge:x:1009:组群管理
roupmod可以更改组群的识别码或名称
语法:
groupmod [选项] [组]
-a, --append 将-U选项提到的用户添加到组中
无需删除现有用户成员
-g, --gid GID 将组 ID 改为 GID
-h, --help 显示此帮助信息并退出
-n, --new-name NEW_GROUP 改名为 NEW_GROUP
-o, --non-unique 允许使用重复的 GID
-p, --password PASSWORD 将密码更改为(加密过的) PASSWORD
-R, --root CHROOT_DIR chroot 到的目录
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
-l, --list 该组的用户成员列表更改组群tianyunge名称为tiangesec,操作如下:
miui@Fedora:~$ sudo groupmod -n tiangesec tianyunge
[sudo] miui 的密码:
miui@Fedora:~$ cat /etc/group
...省略
miui:x:1000:
docker:x:990:
mysql:x:27:
geek:x:1010:
qingyao:x:1011:
tiangesec:x:1009:管理工作组文件
gpasswd命令是 Linux 下工作组文件/etc/group 和/etc/gshadow 的管理工具,系统管理员可以使用其定义组管理员、定义成员,组管理员可以使用它修改组群密码。
语法:
gpasswd [选项] [组]
-a, --add USER 向组 GROUP 中添加用户 USER
-d, --delete USER 从组 GROUP 中添加或删除用户
-h, --help 显示此帮助信息并退出
-Q, --root CHROOT_DIR 要 chroot 进的目录
-r, --delete-password remove the GROUP's password
-R, --restrict 向其成员限制访问组 GROUP
-M, --members USER,... 设置组 GROUP 的成员列表
-A, --administrators ADMIN,...
设置组的管理员列表把geek用户添加的root组,操作如下:

把geek从root组删除,操作如下:

其他扩展
id
id命令用于查看用户的 UID、GID 和附加组信息。当我们想知道某个用户的 UID 和 GID时 id 命令是非常有用的。一些程序可能需要 UID/GID 来运行。id 使我们更加容易地找出用户的 UID 以GID 而不必在/etc/group 文件中搜寻。
语法:
id [选项]... [用户]...
-a 忽略,仅为兼容其他版本而设计
-Z, --context 仅打印当前进程的安全上下文
-g, --group 仅打印有效组 ID
-G, --groups 仅打印所有的组 ID
-n, --name 打印名称而非数字,与 -ugG 一起使用
-r, --real 打印真实 ID 而非有效 ID,与 -ugG 一起使用
-u, --user 仅打印有效用户 ID
-z, --zero 使用 NUL 字符而非空格来分隔各个条目,在默认格式下不可使用
--help 显示此帮助信息并退出
--version 显示版本信息并退出可以使用id查看当前用户的信息,操作如下:

显示用户所在群组

显示指定用户信息,例如显示xiaoqingyao的用户信息,操作如下:

groups
groups命令用于查询用户所在的组。
语法:
groups [选项]... [用户名]...查看用户xiaoqingyao所在组,操作如下:

显示当前的用户所在组,操作如下:

groupmems
groupmems命令可以管理用户主要组群的成员。
语法:
groupmems [选项] [动作]
选项:
-g, --group groupname 更改组 groupname,而不是用户的组(仅限 root)
-R, --root CHROOT_DIR chroot 到的目录
动作:
-a, --add username 将用户 username 添加到组成员中
-d, --delete username 从组的成员中删除用户 username
-h, --help 显示此帮助信息并退出
-p, --purge 从组中移除所有成员
-l, --list 列出组中的所有成员将当前的用户添加到root组群中:

列出组织中所有成员:

打赏
如果觉得文章写的还不错,可以给作者一个小小的支持嘛?请我喝杯蜜雪冰城可好?


