1、了解用户和用户组的概念
2、可以添加useradd
3、删除userdel用户
4、修改用户密码passwd
5、可以添加groupadd
6、删除groupdel用户组
用户与用户组管理
==部门:运维,开发,人事==
用户和用户组管理,就是添加用户和用户组,针对每个用户设置不同的密码。
大家平时的笔记本电脑,会设置多个账户吗?为什么?
服务器要添加多账户的作用
针对不同用户分配==不同的权限==,不同权限可以限制用户==可以访问到的系统资源==
提高系统的安全性,帮助系统管理员对使用系统的用户进行跟踪
多用户多任务
Linux 系统是一个多用户多任务的操作系统,所谓多用户多任务,是指支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响。
小明所在的运维团队一共有四个人,分别有大毛,二毛,三毛,大毛负责网站,他的账户叫wangzhan, 二毛负责数据库,他的账户叫shujuku。
在同一时间,大毛和二毛都可以登录这台服务器,大毛可以查询网站的日志,二毛可以处理数据库的问题,他们之间互不影响。
由于我们设置了权限,大毛只能访问网站的日志,无法访问数据库;二毛可以处理数据库问题,但是不能访问网站的日志。这就实现了我们的多用户多任务的运行机制。
Linux作为一种多用户的操作系统(服务器系统),允许多个用户同时登陆到系统上,并响应每个用户的请求。
任何需要使用操作系统的用户,都需要一个系统账号,账号分为:管理员账号与普通用户账号。
在Linux中,根据UID来判断用户! 而不是用户名!只要id为0就是管理员,哪怕有多个id为 0 的账号;
系统在新建账号时,会根据账号类型,自动分配递增账号的UID与GID(用户身份编号,组编号),也可自行分配。通常情况下,应当保证UID与GID唯一且不重复。
用户
任何一个运维人员想要登录服务器,都必须先申请一个账号,然后以这个账号的身份进入系统,就像我们前面说的wangzhan这个账号。
每个账号都拥有一个==唯一的用户名和各自的密码==,用户在登录时输入正确的用户名和密码后,就能够进入系统,默认会进入到这个用户自己的主目录。
root -> /root
普通用户 -> /home/用户名
用户在系统中是分角色的,在Linux系统中,由于角色的不同,权限和所完成的任务也不同;值得注意的是用户的角色是通过UID和GID识别的;
特别是UID,在运维工作中,一个UID是唯一标识一个系统用户的账号。
创建软件的时候需要创建对应的用户
mysql数据库 -> mysql
mycat软件 -> mycat
Linux系统的用户账户:
超级用户root(0)
程序用户(1~499)
普通用户(500~65535)
超级用户:
默认是root用户,其UID和GID均为0。在每台unix/linux操作系统中都是唯一且真实存在的,通过它可以登录系统,可以操作系统中任何文件和命令,拥有最高的管理权限。在生产环境,一般禁止root账号远程登录SSH连接服务器,以加强系统安全。
普通用户:
这类用户一般是由具备系统管理员root的权限的运维人员添加的
程序用户: 与真实用户区分开来,这类用户的最大特点是安装系统后默认就会存在的,且默认情况不能登录系统,它们是系统正常运行必不可少的,他们的存在主要是方便系统管理,满足相应的系统进程都文件属主的要求。例如系统默认的bin、adm、nodoby、mail用户等。由于服务器角色的不同,有部分用不到的系统服务被禁止开机执行,因此,在做系统安全优化时,被禁止开机启动了的服务对应的虚拟用户也是可以处理掉的(删除或注释)。
用户组
有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件或目录,如果不用用户组,这种需求在授权时就很难实现。
如果使用用户组就方便多了,只需要把授权的用户都加入到同一个用户组里,然后通过修改该文件或目录的对应的用户组的权限,让用户组具有符合需求的操作权限,这样用户组下的所有用户对该文件或目录就会具有相同的权限,这就是用户组的用途。
将用户分组是linux系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,在很大程度上简化了运维管理工作。
简单来说,就是具有相同==权限==的用户的集合。
例如:人事部有20名员工,他们都需要访问一个文件夹,如果我们给这20个用户的账号分别设置权限,这样太麻烦了,所以我们会建立一个用户组叫HR,对这个组设置权限,将这20个用户加入这个组就可以了。
用户和用户组
A 一个用户可以属于一个用户组,具有此用户组的权限
HR组可以访问/hrfile的文件夹,当user01属于HR组,那么user01就可以访问/hrfile这个文件夹
B 一个用户可以属于多个用户组,此时具有多个组的共同权限
HR可以访问/hrfile的文件夹,运维可以访问/yunweifile的文件夹,当user01同时属于HR组和运维组,那么user01可以访问 /hrfile和/yunweifile
C 多个用户可以属于一个用户组,多个用户都具有此用户组的权限。
属组: 只能有一个
附加组: 可以有多个
创建用户的时候如果没有任何指定
uid是自增的,gid也只自增的
默认的组和用户的名称一致
主组:指用户创建时默认所属的组,==每个用户的主组只能有一个==。创建用户时会同时创建一个和用户名相同的组
例如:添加用户xiaoming,在建立用户 xiaoming 的同时,就会建立 xiaoming 组作为 xiaoming 用户的初始组。
附加组:每个用户只能有一个主组,除主组外,用户再加入其他的用户组,这些用户组就是这个用户的附加组。
==每个用户的附加组可以有多个==,而且用户可以有这些附加组的权限。
用户组管理命令
groupadd
:创建用户组
语法:
groupadd [选项] 组名
常用选项:
-g GID
:指定组ID(默认自动生成)。
-r
选项:表示创建系统组,系统会自动分配一个 系统级 GID(通常在 1-999
或 1-499
,具体范围取决于发行版)。
示例:
-
基础创建
groupadd dev # 创建名为 "dev" 的组,系统自动分配GID
场景:快速创建默认配置的组,适用于简单开发环境。
-
指定GID
groupadd -g 1001 dev # 创建GID为1001的组 "dev"
场景:需要固定GID时(如与第三方服务权限绑定)。
-
创建系统组
groupadd -r system_group # 创建系统组(GID范围通常为1-999)
场景:为系统服务(如Nginx、MySQL)分配专用组。
groupmod
:修改用户组
语法:
groupmod [选项] 组名
常用选项:
-g 新GID
:修改组ID。 -n 新组名
:修改组名称。
示例:
-
修改组名
groupmod -n developers dev # 将组 "dev" 重命名为 "developers"
场景:项目名称变更后同步调整组名。
-
修改GID
groupmod -g 2000 developers # 将组GID从1001改为2000
场景:修复GID冲突或适配外部权限系统。
-
同时修改组名和GID
groupmod -g 3000 -n dev_team developers
场景:全面调整组的标识信息。
groupdel
:删除用户组
语法:
groupdel 组名
注意:组内不能有用户作为主组,否则删除失败。
示例:
-
基础删除
groupdel test_group # 删除空组 "test_group"
场景:清理临时测试组。
-
强制删除依赖组
userdel -r user1 && groupdel dev # 先删除用户再删组
场景:组内有用户时,需先移除用户。
-
删除系统组
groupdel system_group # 删除无用的系统组
场景:卸载软件后清理残留组。
-
错误处理示例
groupdel dev # 若失败,输出:groupdel: cannot remove the primary group of user 'user1'
场景:提示用户需先处理关联用户。
用户管理
useradd
:创建用户
语法:
useradd [选项] 用户名
常用选项:
-g GID
:指定主组。 -G GID1,GID2
:指定附属组。 -s Shell路径
:指定登录Shell。 -d 家目录
:自定义家目录。 -u UID
:指定用户ID。 -c "注释"
:添加描述。
useradd -G dev,ops -d /wxq -c '这是员工魏小全' wxq
解释器shell:等待用户进入系统之后,用户输入指令之后,该解释器会收集用户输入的指令,转换成机器语言,传递给内核处理;
如果解释器是==/bin/bash 表示用户可以登录到系统==,==/sbin/nologin表示该用户不能登录到系统==
示例:
-
基础用户创建
useradd user1 # 创建用户 "user1",自动生成同名组
场景:快速创建普通用户。
-
指定主组和附属组
useradd -g 1001 -G 2000,2001 dev_user
场景:开发人员需要同时访问多个项目组资源。
-
创建系统用户
useradd -r -s /sbin/nologin service_user # 创建无登录权限的系统用户
场景:为后台服务(如Apache)分配专用用户。
-
自定义家目录和UID
useradd -d /opt/app_user -u 1500 app_user
场景:将用户家目录部署到非标准路径,并固定UID。
id
:查看用户信息
语法:
id [用户名]
示例:
-
查看当前用户信息
id # 输出:uid=1000(user) gid=1000(user) groups=1000(user),4(adm)
场景:快速确认当前用户权限。
-
检查用户所属组
id dev_user # 确认用户是否在 "developers" 组中
场景:权限调试时验证组绑定。
-
验证UID/GID冲突
id -u user1 # 输出:1001
场景:脚本中判断用户是否存在。
用户修改命令 usermod
语法:
usermod [选项] 用户名
示例:
-
修改用户名
usermod -l new_user old_user # 将用户 "old_user" 重命名为 "new_user"
场景:员工更名后同步账户信息。
-
追加附属组
usermod -aG docker dev_user # 添加用户到docker组(保留原有附属组)
场景:为用户授予新权限(如容器管理)。
-
禁用登录
usermod -s /sbin/nologin dev_user # 禁止用户登录Shell
场景:保留用户但禁止交互式访问。
-
锁定与解锁
L lock
U unLock
usermod -L dev_user # 锁定账户 usermod -U dev_user # 解锁账户
场景:临时封禁可疑账户。
-
迁移家目录
usermod -d /new_home -m dev_user # 移动家目录并更新配置
场景:服务器存储扩容后调整目录。
密码管理命令 passwd
语法:
passwd [用户名]
示例:
-
普通用户改密
passwd # 根据提示输入新密码
场景:定期更新个人密码。
-
root重置他人密码
passwd dev_user # 直接设置新密码
场景:用户忘记密码后管理员协助重置。
Linux ==不允许没有密码的用户登录到系统==,因此前面创建的用户目前都处于锁定状态,需要设置密码之后才能登录计算机。
-
清空密码
passwd -d dev_user # 删除密码(允许无密码登录,需配置SSH)
场景:内部测试环境中简化登录。
-
强制密码策略
passwd -x 30 -w 7 dev_user # 密码30天后过期,提前7天警告
场景:企业合规性要求。
用户切换命令 su
语法:
su [-] 用户名
示例:
-
加载环境变量切换
su dev_user # 完全模拟dev_user登录环境
场景:调试用户环境问题。
-
执行单条命令
su dev_user -c "whoami" # 输出:dev_user
场景:脚本中以特定用户身份运行命令。
-
root快速切换
su # 省略用户名时默认切换到root
场景:管理员执行特权操作。
-
受限切换
su dev_user # 不加载环境变量,可能导致路径错误
场景:临时切换但保留原环境(谨慎使用)。
-
结合sudo使用
sudo su dev_user # 非root用户通过sudo切换
场景:普通用户获得临时权限后切换身份。
用户删除命令 userdel
语法:
userdel [-r] 用户名
示例:
-
保留家目录删除
userdel dev_user # 删除用户但保留/home/dev_user
场景:保留用户数据以备后续审计。
-
彻底删除用户
userdel -r dev_user # 删除用户及家目录
场景:清理离职员工账户。
-
强制删除锁文件
userdel -f dev_user # 强制删除(用户已退出登录)
场景:处理僵尸账户。
-
删除系统用户
userdel -r system_user # 删除系统用户及其配置
场景:卸载服务后清理残留用户。
案例
公司新员工lisi,属于gzhr部门,用户ID1200,不允许登录系统
创建用户lisi,默认lisi属于自己同名的主组,让lisi 属于附加组gzhr,用户ID 1200,注释为"hruser lisi",解释器为/sbin/nologin
公司员工wangwu,属于shhr部门,现在要休产假,产假期间,暂时停止她登陆电脑的权限,同时原来属于gzhr部门的员工lisi,负责wangwu的工作。
所以,需要把lisi加入到shhr的组,同时,修改lisi的账户注释为“gzhr shhr user”
对于wangwu用户,我们要执行锁定和解锁操作
对于lisi用户,我们要将lisi加入到shhr的附加组,同时修改lisi账户的注释
王五产假休完回到公司上班,需要将王五的账户解锁,在使用usermod -U解锁时,我们看到一个错误信息如下:
usermod: unlocking the user's password would result in a passwordless account.
解锁这个账户,将导致一个没有密码的账户,因为之前王五的账户没有密码。
这时候,我们就需要使用passwd命令,给王五的账户设置一个密码。
相关文件
/etc/passwd 存放用户的账号等相关信息(密码除外) /etc/shadow 保存用户的密码 /etc/group:组及其属性信息 /etc/gshadow:组密码及其相关属性
/etc/passwd
/etc/passwd文件中每行定义一个用户账号,有多少行就表示多少个账号,在一行中可以清晰的看出,各内容之间又通过”:”号划分了7个字段。
这7个字段分别定义了账号的不同属性,passwd文件实际内容如下:
字段1:帐号名,这是用户登陆时使用的账户名称,在系统中是唯一的,不能重名 字段2:密码占位符x;早期的unix系统中,该字段是存放账户和密码的,由于安全原因,后来把这个密码字段内容移到/etc/shadow中了。这里可以看到一个字母x,表示该用户的密码是/etc/shadow文件中保护的。 字段3:UID;范围是0-65535 字段4:GID;范围是0-65535;当添加用户时,默认情况下会同时建立一个与用户同名且UID和GID相同的组。 字段5:用户说明;这个字段是对这个账户的说明 字段6:宿主目录;用户登陆后首先进入的目录,一般与"/home/用户名"这样的目录 字段7:登录Shell 当前用户登陆后所使用的shell,在centos/rhel系统中,默认的shell是bash;如果不希望用户登陆系统,可以通过usermod或者手动修改passwd设置,将该字段设置为/sbin/nologin 即可。大多数内置系统账户都是/sbin/nologin,这表示禁止登陆系统。
/etc/shadow
字段1:帐号名称 字段2:加密的密码(通常使用shad512加密) 字段3:最近更改密码的时间;从1970/1/1到上次修改密码的天数 字段4:禁止修改密码的天数;从1970/1/1开始,多少天之内不能修改密码,默认值为0 字段5:用户必须更改口令的天数;密码的最长有效天数,默认值为99999 字段6:警告更改密码的期限;密码过期之前警告天数,默认值为7;在用户密码过期前多少天提醒用户更改密码 字段7:不活动时间;密码过期之后账户宽限时间 3+5;在用户密码过期之后到禁用账户的天数 字段8:帐号失效时间,默认值为空;从1970/1/1日起,到用户被禁用的天数 字段9:保留字段(未使用),标志
/etc/group
字段1:组账户名称 字段2:密码占位符x;通常不需要设置该密码,由于安全原因,该密码被记在/etc/gshadow中,因此显示为'x'。这类似/etc/shadow。 字段3:组账户GID号,用户组ID 字段4:本组的成员用户列表;加入这个组的所有用户账号
/etc/gshadow