Linux之用户和用户组管理

概念

Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须要拥有一个账号进入系统,账号实质上就是一个用户在系统上的标识。系统根据标识分配不同的权限和资源。一个账号包含用户和用户组两个部分。

用户分类

根据UID和权限可以将用户划分为三类:

  • 超级管理员(root):UID为0,具有操作系统的一切权限,一般是root用户,不建议一个系统中有多个超级管理员用户

  • 系统用户:UID为1-999之间,方便系统管理,用来运行系统和服务的用户,没有密码且不能登录系统。比如有些服务不希望使用root用户的身份去运行,而是希望使用权限更小的账号去执行,所以我们就要提供这些运作程序的拥有者

  • 普通用户:UID从1000开始,可登入系统的用户,拥有系统部分权限的用户

用户管理

管理用户无非就是涉及到用户的添加、删除、修改、查看这四个操作,我们下面分别来看下都是什么命令

用户信息存储的文件

  • /etc/passwd:该文件存储的是用户基本信息,格式为 用户名:密码占位符(x):UID:GID:描述:家目录:登录Shell
root@master-02:~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...省略万字内容
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
unscd:x:110:114::/var/lib/unscd:/usr/sbin/nologin
  • /etc/shadow:存储加密密码及有效期(仅root可读)
root@master-02:~# cat /etc/shadow
root:$6$RONxOP1Exfi1ewiA$gFkY1hDAuaJHxKSytAgM/.4lSikmihfocjvzlj/:20153:0:99999:7:::
daemon:*:19820:0:99999:7:::
...省略万字内容
_chrony:*:19881:0:99999:7:::
_rpc:*:19881:0:99999:7:::
statd:*:19881:0:99999:7:::
Debian-exim:!:19881:0:99999:7:::
unscd:*:19881:0:99999:7:::

添加用户 useradd

使用useradd命令来添加用户

语法:

useradd [选项参数] username

选项参数说明:

-u:指定用户id,一般UID要大于1000,如果没有特殊需求尽量不要指定,用系统分配即可
-m:创建用户的家目录(默认位置为 /home/用户名),一般不需要指定,用默认的即可
-M:不创建用户家目录,用于创建系统用户,也就是不需要其登录
-s:指定用户的shell,默认的是/bin/bash,一般不需要指定,用默认的即可
-g:指定用户所属用户组,尽量不要指定,系统会自动创建一个和新增用户名称相同的组,改组会成为新增用户的初始用户组
-c:加上备注文字,备注文字会保存在/etc/passwd文件的第五列
-d:指定自定义家目录路径,一般不需要指定
-e:设置账户过期日期(格式:YYYY-MM-DD)
-p:直接设置加密后的密码(不安全,建议用passwd)

示例:添加user-test01用户,并设置密码

#添加用户
root@master-02:~# useradd -m user-test01

#使用`passwd`指令设置密码
root@master-02:~# passwd user-test01
New password:
Retype new password:
passwd: password updated successfully

#切换用户
root@master-02:~# su - user-test01
$
$ pwd
/home/user-test01

示例:添加www-www的系统用户

#添加www-www用户,-s指定shell,/sbin/nologin指定不能不能登录,-u指定UID,-M不创建家目录
root@master-02:~# useradd -s /sbin/nologin -u 10086 -M www-www

#查看用户
root@master-02:~# grep www-www /etc/passwd
www-www:x:10086:10086::/home/www-www:/sbin/nologin

#切换用户,切换失败
root@master-02:~# su - www-www
su: warning: cannot change directory to /home/www-www: No such file or directory
This account is currently not available.

查看用户

查看用户有多个命令,根据不同的场景使用不同的命令

  • whoami:显示当前用户名称
root@master-02:~# whoami
root
  • id username:查看用户的信息或者检查用户是否存在
#检查root
root@master-02:~# id root
uid=0(root) gid=0(root) groups=0(root)

root@master-02:~# id user-test01
uid=1000(user-test01) gid=1000(user-test01) groups=1000(user-test01)

root@master-02:~# id www-www
uid=10086(www-www) gid=10086(www-www) groups=10086(www-www)

#用户不存在
root@master-02:~# id www
id: ‘www’: no such user

删除用户 userdel

语法:

userdel [选项参数] username

选项说明:

-f:强制删除用户,即使用户的进程仍在运行或用户正在登录。
-r:删除用户家目录和用户邮件

注意事项:

  • 删除用户是危险操作,需要谨慎对待,建议通过在/etc/passwd文件中进行注释操作,替代userdel删除
  • userdel默认不会删除家目录,需要使用-r选项

示例:

#报错是因为没有该用户的邮件
root@master-02:~# userdel -r user-test01
userdel: user-test01 mail spool (/var/mail/user-test01) not found

修改用户:usermod

语法

usermod [选项参数] username

选项说明

-l:修改用户名,不会修改用户组
-d:修改用户的家目录。
-m:移动用户的家目录到新的位置。
-s:修改用户的登录 shell。
-g:修改用户的初始用户组。
-G:修改用户的附加用户组。

示例:

#修改用户的名称,修改后但是用户组没有修改
root@master-02:~# usermod -l www www-www
root@master-02:~# id www
uid=10086(www) gid=10086(www-www) groups=10086(www-www)

修改用户密码:passwd

语法

passwd [选项参数] username

选项说明

-l:lock,锁定用户账户,禁止用户登录。系统会将密码设置为一个不可逆的值,从而阻止用户登录,即把/etc/shadow第二列密文密码前面多加个!!
-u:unlock,解锁用户账户,允许用户再次登录。此选项用于解除 -l 选项设置的锁定,相当于-l的反向操作
-n:设置密码的最小使用期限(天数)。在此期限内,用户无法更改密码,对应/etc/shadow第4列
-x:设置密码的最大使用期限(天数)。超过此期限,密码将过期,用户需要更改密码,对应/etc/shadow第五列
-w:设置密码过期前的警告天数。在此期间,系统会提示用户密码即将过期。
-i:设置密码过期后的宽限天数。在此期间,用户仍然可以登录,但必须更改密码。
-S:显示用户的密码状态信息,包括密码是否过期、是否锁定等。
--s:tdin从标准输入读取令牌,主要用于在通过脚本批量添加用户,不需要交互的场景

示例:

# 修改密码
passwd jhon

# 锁定用户
passwd -l [用户名]

# 解锁用户
passwd -u [用户名]

批量修改用户密码:chpasswd

chpasswd 是一个在类 Unix 系统(如 Linux)中用于批量修改用户密码的命令,通常由系统管理员使用。它可以从标准输入或文件中读取用户名和密码,并批量更新用户的密码

用法:

# 从标准输入修改用户名和密码,格式为 用户名:密码
echo "user1:newpassword1" | chpasswd

#可以将用户名和密码写入一个文件,然后使用 chpasswd 从文件中读取。文件格式为每行一个记录,格式为 用户名:密码。
# 创建一个文件,包含用户名和密码
cat > passwords.txt <<EOF
user1:newpassword1
user2:newpassword2
EOF

# 使用 chpasswd 从文件中读取并修改密码
chpasswd < passwords.txt

用户授权-sudo授权

sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户,若未经授权的用户企图使用sudo,则会发出警告的邮件给管理员,用户使用sudo时,必须先输入命令,之后有5分钟的有效期限,超过期限则必须重新输入密码.

sudo 允许普通用户在满足特定条件的情况下执行需要超级用户权限的命令。这些条件由 /etc/sudoers 文件定义。sudoers 文件是一个配置文件,用于指定哪些用户或用户组可以执行哪些命令,以及是否需要输入密码。

查看和编辑/etc/sudoers 文件

sudoers 文件是 sudo 的核心配置文件,通常位于 /etc/sudoers。直接编辑该文件可能会导致配置错误,因此推荐使用 visudo 命令进行编辑。visudo 会检查语法错误,确保配置文件的正确性。

root@master:~# visudo

# 或者使用
root@master:~# vim /etc/sudoers

Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# User privilege specification
root    ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

文件内容详解:

root    ALL=(ALL:ALL) ALL
# root:表示用户名,
# ALL:表示该规则适用于所有主机。
# =(ALL:ALL):表示 root 用户可以以任何用户(包括 root)和任何组(包括 root)的身份执行命令。
# ALL:表示 root 用户可以执行所有命令。

%sudo   ALL=(ALL:ALL) ALL
# 表示是为 sudo 用户组中的所有成员设置权限的。这里的配置意味着 sudo 组中的任何用户都可以在任何主机上以任何用户和任何组的身份执行任何命令。
# %sudo:指代 sudo 用户组。% 符号表示这是一个用户组而不是单个用户。
# ALL:表示该规则适用于所有主机。
# =(ALL:ALL):表示 root 用户可以以任何用户(包括 root)和任何组(包括 root)的身份执行命令。
# ALL:表示 root 用户可以执行所有命令。

示例:为devops用户添加授权

# 添加用户
root@master:~# useradd -m devops

# 修改密码
root@master:~# passwd devops
New password:
Retype new password:
passwd: password updated successfully


# 编辑/etc/sudoers,添加授权
root@master:~# cat /etc/sudoers
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# User privilege specification
root    ALL=(ALL:ALL) ALL
# 新增授权
devops  ALL=(ALL:ALL) /bin/cat,/bin/less,/bin/more
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# 切换用户
root@master:~# su - devops

# 执行命令,发现每次都需要输入密码
root@master:~# sudo cat /etc/passwd
[sudo] password for devops:

授权devops所有权限不需要输入密码

root@master:~# cat /etc/sudoers
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# User privilege specification
root    ALL=(ALL:ALL) ALL
# 新增授权
devops  ALL=(ALL:ALL) NOPASSWD: ALL
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL


# 切换用户
root@master:~# su - devops

# 执行命令,发现不需要输入密码
root@master:~# sudo cat /etc/passwd

用户组管理

在 Linux 系统中,用户组是一组用户的集合,用于简化权限管理。通过将用户分配到特定的组,可以对整个组应用统一的权限设置,而不是单独为每个用户设置。这使得系统管理更加高效和有序。

基本概念

用户组的用途:

  • 权限管理:通过组来管理文件和目录的访问权限,简化权限设置。
  • 资源共享:允许组内用户共享资源,如文件、目录等。
  • 系统管理:通过组来分配系统资源和设置用户权限。

主要的用户组:

  • root:超级用户组,拥有系统的所有权限。
  • bin、sys、mail 等:系统预定义的用户组,用于系统进程和服务。
  • 用户自定义组:根据需要创建的组,如 developers、admins 等。

用户组信息存储的文件

/etc/group存放用户组信息

root@master:~# cat /etc/group
root:x:0:
#...省略万字内容
unscd:x:114:
docker:x:998:
devops:x:1000:

文件格式:

  • 组名:用户组的名称,如 root、wheel、users 等。
  • 密码占位符:通常是一个 x 或星号(*),表示组密码被存储在 /etc/gshadow 文件中,或者不使用组密码。
  • GID(组标识符):一个唯一的整数,用于标识用户组。GID 在系统中必须是唯一的。

查看用户组

# 查看所有的组
root@master:~# cat /etc/group

# 查看用户所属组
# group命令
root@master:~# groups devops
devops : devops
# id命令
root@master:~# id devops
uid=1000(devops) gid=1000(devops) groups=1000(devops)

创建用户组 groupadd

语法:

groupadd [选项] 组名

常用选项说明:

  • -g GID:指定新组的 GID。如果不指定,系统会自动分配下一个可用的 GID。
groupadd -g 1001 newgroup
  • -M:指定成员列表,用于直接将用户添加到新创建的组中。
groupadd -M user1,user2 newgroup

删除用户组 groupdel

语法:

groupdel 组名

注意事项:

  • 确保组内没有用户:在删除用户组之前,确保该组内没有用户。如果有用户属于该组,你可能需要先将这些用户移动到其他组。
  • 检查系统服务和进程:有些系统服务和进程可能依赖于特定的用户组。删除这些组可能会影响系统的正常运行。
  • 备份:在执行删除操作之前,建议备份 /etc/group 文件,以防万一需要恢复。
  • 权限:只有具有适当权限的用户(通常是 root 用户)才能执行 groupdel 命令。

移动用户到其他组 usermod

usermod -aG 新组名 用户名

修改用户组

语法:

groupmod [选项] 组名

常用选项说明:

  • -n:修改组名
# 将组名从 group_old 更改为 group_new
roupmod -n group_new group_old
  • -g:修改组的GID
groupmod -g GID groupname
posted @ 2025-04-17 15:12  huangSir-devops  阅读(29)  评论(0)    收藏  举报
作者:你的名字
出处:你的博客链接
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。