为什么要写这篇博客?
小编最近搞了一台小服务器,然后要给同事们用,正常运维这个服务器就是给同事们添加账号,然后设置权限,这样子只是一些简单的操作,如果服务器出问题了,也不知道怎么去解决,所以小编想深入了解一下linux系统,本篇博客就从简单的添加用户开始入手,主要有以下几个问题:
对用户的操作(增、删、改、查):
在 Linux 系统中,用户管理是维护系统安全和资源分配的核心任务之一。无论是个人电脑还是服务器,合理的用户权限配置可以防止误操作、保护敏感数据,并支持多用户协作。本文将以 Ubuntu 为例,详细介绍用户管理的常用操作,涵盖创建、修改、删除用户,以及用户组和权限配置的技巧。
以下表格详细列举了用户与组管理命令的参数、缩写来源、示例及详细解释,涵盖 创建、修改、权限控制、安全策略 等核心操作。
以下为 Linux Ubuntu 系统中 用户管理 的核心命令及参数总结,涵盖 创建、删除、修改、权限分配、密码策略 等操作,并附有示例与详细解释。
命令 | 参数 | 缩写来源 | 示例 | 示例详细解释 |
---|---|---|---|---|
useradd |
-m |
make home directory | sudo useradd -m alice |
创建用户 alice ,并自动生成家目录 /home/alice 。 |
-d |
directory | sudo useradd -d /data/alice -m alice |
指定家目录为 /data/alice (需确保目录存在或为空)。 |
|
-s |
shell | sudo useradd -s /sbin/nologin alice |
设置用户默认 Shell 为禁止登录(适用于服务账户)。 | |
-G |
Groups | sudo useradd -G sudo,developers alice |
创建用户时直接加入 sudo 和 developers 组(覆盖原有附加组)。 |
|
-u |
user ID | sudo useradd -u 1500 alice |
指定用户 UID 为 1500 (避免与系统保留 UID 0-999 冲突)。 |
|
-e |
expire date | sudo useradd -e 2024-12-31 alice |
设置账户过期时间为 2024-12-31 ,过期后用户无法登录。 |
|
adduser |
(交互式) | 无缩写(封装工具) | sudo adduser alice |
交互式创建用户:自动生成家目录、提示设置密码,并填写用户信息(全名、电话等)。 |
usermod |
-l |
login name | sudo usermod -l alice_new alice |
将用户名从 alice 修改为 alice_new (需手动更新家目录名)。 |
-d |
directory | sudo usermod -d /new_home/alice -m alice |
修改家目录为 /new_home/alice ,-m 表示迁移原家目录内容。 |
|
-g |
group | sudo usermod -g developers alice |
修改用户主组为 developers (需目标组已存在)。 |
|
-aG |
append Groups | sudo usermod -aG docker alice |
将用户追加到 docker 组(保留原有附加组)。 |
|
-L |
Lock | sudo usermod -L alice |
锁定用户账户(禁止登录),在 /etc/shadow 的密码字段前添加 ! 。 |
|
-U |
Unlock | sudo usermod -U alice |
解锁用户账户(需未被其他机制锁定)。 | |
userdel |
-r |
remove files | sudo userdel -r alice |
删除用户 alice 及其家目录和邮件池(谨慎操作,数据不可恢复)。 |
passwd |
-l |
lock | sudo passwd -l alice |
锁定用户密码(等同于 usermod -L )。 |
-u |
unlock | sudo passwd -u alice |
解锁用户密码(需未被其他方式锁定)。 | |
-e |
expire | sudo passwd -e alice |
强制用户下次登录时修改密码(适用于首次创建账户后)。 | |
-S |
Status | sudo passwd -S alice |
显示账户状态:密码设置时间、有效期、警告天数等。 | |
chage |
-E |
Expiry date | sudo chage -E 2024-12-31 alice |
设置账户过期时间(与 useradd -e 功能相同)。 |
-M |
Max days | sudo chage -M 90 alice |
密码最长有效期为 90 天,到期后必须修改。 | |
-W |
Warn days | sudo chage -W 7 alice |
密码过期前 7 天提醒用户。 | |
-I |
Inactive days | sudo chage -I 5 alice |
密码过期后,账户宽限期为 5 天,超时后完全锁定。 | |
id |
-u |
user ID | id -u alice |
显示用户 UID(输出 1001 )。 |
-g |
group ID | id -g alice |
显示用户主组 GID(输出 1001 )。 |
|
-Gn |
Groups names | id -Gn alice |
显示用户所属的所有组名(输出 alice sudo developers )。 |
|
groups |
- | 无 | groups alice |
显示用户主组和附加组(输出 alice : alice sudo developers )。 |
getent |
- | get entries | getent passwd alice |
查询用户详细信息(本地或远程用户),输出格式:alice:x:1001:1001::/home/alice:/bin/bash 。 |
sudo useradd -m -s /bin/bash -G sudo,developers -u 1500 alice # 创建用户
sudo passwd alice # 设置密码
id alice # 输出:uid=1500(alice) gid=1500(alice) groups=1500(alice),27(sudo),1001(developers)
补充:
Q1. 为什么需要指定
-s /bin/bash
?
(1) 允许用户交互式登录
- 如果不指定
-s
参数,系统会使用默认的 Shell(通常是/bin/sh
),但不同 Linux 发行版的默认 Shell 可能不同。- 使用
/bin/bash
可以确保用户获得一致的交互体验,因为 Bash 提供了更丰富的功能(如命令补全、历史记录、脚本支持等)。(2) 支持脚本和自动化
- Bash 是 Linux 系统中默认的脚本语言环境。如果用户需要运行脚本或自动化任务,使用 Bash 可以避免兼容性问题。
- 例如,用户可以直接在终端中执行脚本文件(如
./script.sh
),而无需额外配置。(3) 避免权限问题
- 如果用户需要访问文件系统、执行命令或运行服务,Bash 提供了完整的权限控制和环境变量支持。
- 如果未指定 Shell,用户可能无法正常使用系统功能(如无法运行
ls
、grep
等命令)。(4) 明确用户意图
- 通过显式指定
-s /bin/bash
,管理员可以明确该用户是交互式用户(需要登录和操作),而不是系统服务账户(不需要登录)。- 例如,为普通用户设置
/bin/bash
,为服务账户设置/sbin/nologin
。
Q2. 不指定
-s /bin/bash
有什么后果?
- 默认 Shell 可能不兼容:如果系统默认 Shell 是
/bin/sh
,用户可能无法使用 Bash 特有的功能(如[[ ]]
条件判断、数组等)。- 用户无法正常登录:如果未指定 Shell,系统可能使用
/bin/false
或/usr/sbin/nologin
,导致用户无法登录。- 脚本执行异常:某些脚本依赖 Bash 的特性(如
source
命令、[[
操作符),在非 Bash Shell 中可能无法运行。
Q3. 如何查看用户的默认 Shell?
grep username /etc/passwd
示例输出:
john_doe:x:1001:1001::/home/john_doe:/bin/bash nginx:x:1002:1002::/home/nginx:/sbin/nologin
其他常见 Shell 的用途
Shell 类型 | 路径 | 用途 |
---|---|---|
Bash | /bin/bash |
通用交互式 Shell,适合大多数用户。 |
sh | /bin/sh |
简单 Shell,兼容性好,但功能有限。 |
nologin | /sbin/nologin |
禁止用户登录,常用于服务账户(如 www-data 、mysql )。 |
zsh | /bin/zsh |
功能更强大的 Shell,支持语法高亮、插件扩展等。 |
dash | /bin/dash |
轻量级 Shell,常用于系统初始化脚本。 |
补充案例:
补充案例 1:创建普通用户
sudo useradd -m -s /bin/bash john_doe
- 目的:为用户
john_doe
创建主目录(-m
)并指定 Bash 作为默认 Shell。- 结果:用户可以登录系统、运行脚本、访问文件系统。
补充 2:创建服务账户
sudo useradd -s /sbin/nologin nginx
- 目的:创建服务账户
nginx
,禁止其登录系统。- 结果:
nginx
进程可以运行,但用户无法通过 SSH 登录。
补充案例 3:使用其他 Shell
sudo useradd -s /bin/zsh alice
- 目的:为用户
alice
指定 Zsh 作为默认 Shell。- 结果:用户登录后进入 Zsh 环境,享受更高级的功能。
补充总结:
/bin/bash
是合理的选择。/sbin/nologin
或其他 Shell。sudo usermod -l alice_new -d /home/alice_new -m alice # 重命名用户并迁移家目录
sudo usermod -aG docker alice_new # 追加到 docker 组
sudo chage -M 60 -W 7 -E 2024-12-31 alice # 密码 60 天过期,过期前 7 天提醒,账户年底锁定
sudo usermod -L alice # 锁定账户
sudo userdel -r alice # 删除用户及数据
文件 | 作用 |
---|---|
/etc/passwd |
存储用户基本信息(UID、GID、家目录、Shell 等)。 |
/etc/shadow |
存储用户密码哈希及安全策略(仅 root 可读)。 |
/etc/login.defs |
定义用户创建的默认规则(如 UID/GID 范围、密码策略)。 |
sudo
权限,除非必要。/sbin/nologin
)。/etc/passwd
和 /etc/shadow
,清理无效账户。last
或 lastlog
监控用户登录记录。tar -czf alice_backup.tar.gz /home/alice
)。/home/用户名
。例如,用户 dev01
的家目录是 /home/dev01
。useradd
命令时未加 -m
参数(如 sudo useradd username
),则不会自动创建家目录。需手动创建或通过 -m
参数强制生成。如果服务器挂载了多个硬盘,可以通过以下方式指定用户家目录到其他硬盘分区:
sudo useradd -m -d /mnt/data/username -s /bin/bash username
-d
:指定家目录路径(需提前创建挂载点,例如 /mnt/data
挂载到第二块硬盘)。sudo chown username:username /mnt/data/username
/home
子目录将第二块硬盘挂载到 /home
的子路径(如 /home2
),然后创建用户时指定路径:
sudo mkdir /home2
sudo mount /dev/sdb1 /home2 # 假设第二块硬盘为 /dev/sdb1
sudo useradd -m -d /home2/username username
sudo usermod -d /new/path/username -m username
-m
参数会将原家目录内容移动到新路径。/data
),便于备份和扩容。developers
)批量分配权限,而非单独配置用户。/etc/passwd
和 /etc/group
,删除无用账户和组。示例命令:将第二块硬盘挂载到 /data
并创建用户
# 格式化并挂载硬盘(假设为 /dev/sdb1)
sudo mkfs.ext4 /dev/sdb1
sudo mkdir /data
sudo mount /dev/sdb1 /data
# 创建用户并指定家目录
sudo useradd -m -d /data/dev02 -s /bin/bash dev02
sudo passwd dev02
dev01
的主组为 dev01
)。sudo
等特权组,需手动添加(如 sudo usermod -aG sudo dev01
)。以下为 Linux Ubuntu 系统中 组管理 的核心命令及参数总结,涵盖 创建、删除、修改、查询 等操作,并附有示例与详细解释。
命令 | 参数 | 缩写来源 | 示例 | 示例详细解释 |
---|---|---|---|---|
groupadd |
-g |
group ID | sudo groupadd -g 1005 developers |
创建组 developers 并指定 GID 为 1005 (避免与系统保留 GID 0-999 冲突)。 |
-r |
reserved (system) | sudo groupadd -r system_group |
创建系统组(默认分配 GID < 1000)。 | |
groupmod |
-n |
new name | sudo groupmod -n new_dev developers |
将组名从 developers 修改为 new_dev (需确保无进程依赖原组名)。 |
-g |
group ID | sudo groupmod -g 2000 new_dev |
修改组 new_dev 的 GID 为 2000 (需手动更新文件所属组)。 |
|
groupdel |
- | 无 | sudo groupdel new_dev |
删除组 new_dev (组必须为空,否则需先移除成员)。 |
gpasswd |
-a |
add user | sudo gpasswd -a alice developers |
将用户 alice 添加到 developers 组(等同于 usermod -aG )。 |
-d |
delete user | sudo gpasswd -d bob developers |
从 developers 组中移除用户 bob 。 |
|
-M |
Members | sudo gpasswd -M alice,bob,charlie developers |
批量设置 developers 组成员为 alice 、bob 、charlie (覆盖原有成员列表)。 |
|
-r |
remove password | sudo gpasswd -r developers |
移除组 developers 的密码(若已设置密码认证)。 |
|
getent |
- | get entries | getent group developers |
查询组 developers 的详细信息(本地组或远程组,如 LDAP/NIS)。 |
groups |
- | 无 | groups alice |
显示用户 alice 所属的所有组(主组 + 附加组)。 |
groupmems |
-l |
list | sudo groupmems -g developers -l |
列出 developers 组的所有成员(需 sudo 权限)。 |
-d |
delete | sudo groupmems -g developers -d alice |
从 developers 组中移除用户 alice 。 |
|
newgrp |
- | new group | newgrp developers |
临时切换当前用户的主组为 developers (需用户属于该组且组密码已设置或无需密码)。 |
cat |
- | catenate | cat /etc/group | grep developers |
直接查看 /etc/group 文件中 developers 组的配置信息(仅本地组)。 |
Ubuntu 系统预装的主要默认组及其用途:
组名 | 描述 |
---|---|
root |
超级管理员组,拥有系统完全控制权。 |
sudo |
组成员可通过 sudo 执行特权命令。 |
adm |
允许查看系统日志文件(如 /var/log )。 |
cdrom |
访问光驱设备。 |
dialout |
访问串行端口(如旧式调制解调器)。 |
plugdev |
访问可移动存储设备(如U盘)。 |
lpadmin |
配置打印机。 |
users |
普通用户默认组(部分发行版),Ubuntu 默认不强制用户加入此组。 |
sudo groupadd -g 1005 developers # 创建组
sudo gpasswd -a alice developers # 添加用户
sudo gpasswd -a bob developers # 添加用户
getent group developers # 输出:developers:x:1005:alice,bob
sudo gpasswd -M alice,charlie developers # 覆盖原有成员
developers
组仅包含 alice
和 charlie
,原成员 bob
被移除。sudo groupdel developers # 删除空组
gpasswd -d
或 groupmems -d
)。groups alice # 输出:alice : alice developers
newgrp developers # 切换主组
groups # 输出:alice : developers alice
developers
)。文件 | 作用 |
---|---|
/etc/group |
存储组的基本信息(组名、GID、成员列表)。 |
/etc/gshadow |
存储组密码和管理员列表(仅 root 可读)。 |
root
、sudo
、adm
等系统默认组的 GID 或成员。find / -gid 1005
)。ldapmodify
)修改组信息。命令 | 参数 | 缩写来源 | 示例 | 示例详细解释 |
---|---|---|---|---|
id |
-u |
user ID | id -u dev01 |
显示用户 dev01 的 UID(例如输出 1001 )。 |
-g |
group ID | id -g dev01 |
显示用户主组 GID(例如输出 1001 )。 |
|
-Gn |
Groups names | id -Gn dev01 |
显示用户所属的所有组名(例如输出 dev01 sudo )。 |
|
groups |
- | 无 | groups dev01 |
显示用户主组和附加组(例如输出 dev01 : dev01 sudo )。 |
getent |
- | get entries | getent passwd dev01 |
查询 /etc/passwd 中 dev01 的信息(输出格式:dev01:x:1001:1001::/home/dev01:/bin/bash )。 |
last |
- | 无 | last dev01 |
查看用户 dev01 的登录历史(包括时间、IP、终端等)。 |
who |
- | 无 | who |
显示当前登录系统的用户列表。 |
Linux 系统目录遵循 FHS(文件系统层次结构标准),以下是核心目录及其用途:
目录 | 作用 |
---|---|
/ |
根目录,所有其他目录的起点。 |
/bin |
存放系统基础命令(如 ls , cp ),所有用户可执行。 |
/etc |
系统全局配置文件(如用户账户、网络配置)。 |
/home |
普通用户的家目录,每个用户独立子目录。 |
/root |
超级管理员 root 的家目录。 |
/var |
存放动态数据(日志、数据库、邮件等)。 |
/tmp |
临时文件,重启后清空。 |
/usr |
用户安装的软件和只读数据,包含 /usr/bin (用户级命令)、/usr/lib 等。 |
/boot |
系统启动文件(内核、引导加载程序)。 |
/dev |
设备文件(如硬盘 /dev/sda 、终端 /dev/tty )。 |
/proc |
虚拟文件系统,显示内核和进程信息。 |
/opt |
可选的应用软件包(如第三方商业软件)。 |
/sbin |
系统管理命令(如 fdisk , reboot ),需 root 权限执行。 |
文件 | 作用 | 字段示例解析 |
---|---|---|
/etc/passwd |
存储用户基本信息。 | dev01:x:1001:1001:Developer User:/home/dev01:/bin/bash :用户名、密码占位符、UID、GID、描述、家目录、Shell。 |
/etc/shadow |
存储用户密码哈希及安全策略(仅 root 可读)。 | dev01:$6$...:19147:0:99999:7::: :密码哈希、最后修改天数、最短有效期、最长有效期、警告天数等。 |
/etc/group |
存储组信息(组名、GID、组成员)。 | developers:x:1005:dev01,dev02 :组名、密码占位符、GID、组成员列表。 |
/etc/sudoers |
配置 sudo 权限(通过 visudo 安全编辑)。 |
%sudo ALL=(ALL:ALL) ALL :允许 sudo 组成员以任意用户身份执行任意命令。 |
OK,看到这里的朋友想必一定累了吧,小编也累了,毕竟写了一万多字呢,希望本篇博客对你有帮助!