# 用户和用户组管理

# 一、相关概念

# 1. 多用户操作系统

  • Windwos 也是多用户操作系统,但是一般都是个人使用
  • 多用户的目的是实现隔离
    • 用户权限隔离
    • 系统资源隔离
    • root 用户与普通用户的区分

# 二、用户管理

# 1. 常用命令

  • 需要用户权限,注意先切换为 root 用户

  • 用户管理

    • 新建用户

      useradd 用户名

    useradd zhangsan
    id zhangsan
    • 新建用户操作的背后

      • 为用户在 /home 目录下新建同名目录做为用户的家目录。并在该目录下创建和用户相关的配置文件,这些配置文件为隐藏文件
      • 将新用户记录到 /etc/passwd 文件中
      • 将新用户密码信息记录到 /etc/shadow 文件中
      • 系统为新用户创建用户 id - uid
      • 如果没有为新用户指定组,系统为新用户创建一个同名的组
    • 修改用户密码

      passwd 用户名

      passwd zhangsan
    • 删除用户

      userdel 用户名

      -r 删除用户同时删除用户 home 目录,以及同名组

      userdel -r zhangsan
    • 修改用户属性

      usermod 用户名

      -d 修改用户 home 目录

      -g 修改用户组

      useradd lisi
      usermod -d /home/w1 lisi
    • 修改用户密码属性

      chage 用户名

      
      
  • 组管理

    • 新建用户组

      groupadd 组名

      groupadd group1
      usermod -g group1 lisi
      id lisi
      # 创建用户同时也可以指定组
      useradd -g group1 wangwu
      id wangwu
    • 删除用户组

      groupdel 组名

      如果还有用户以要删除的组作为主要组,无法删除!

      groupdel group1

# 2. 用户切换

  • 切换用户

    • 当前用户权限不合适,需要临时切换到其他用户身份执行命令
    # 切换用户
    su
    # 使用 login shell 方式切换用户
    su - USERNAME
  • 以其他用户身份执行命令

    • 当前用户权限不合适,不切换用户身份,临时使用其他用户身份(root)执行命令
    • su 需要知道 root 用户密码,sudo 无需密码
    • sudo - 以其他用户身份执行命令
    • visudo - 设置需要使用 sudo 的用户
      • 配置格式分为两段,例如 %group1 ALL=(ALL) NOPASSWD:ALL
      • 第一段 命令授予哪个用户或组 用户直接使用用户名;如果是组,需要在前面加 %
      • 第二段 授权的命令
        • 基本格式为 主机=(可切换用户) 命令
        • 主机指定用户可以从哪里执行命令,只允许本地执行用 localhost,允许本地和远程用 ALL
        • 可切换用户通常可以省略
        • 多个命令用逗号分隔,命令使用绝对路径
        • 默认需要输入当前用户密码才能执行 sudo。 NOPASSWD 表示不需要密码,但是不安全,添加在命令前,用 : 分隔
    # 实验场景 root, lisi
    # root 用户设置了 30 分钟后关机
    # lisi 用户工作尚未完成,需要取消关机操作
    (root) shutdown -h 30
    (lisi) su - lisi
    (lisi) shutdown -c 
    # 但是 lisi 当前并无执行 shutdown 命令的权限
    (root) visudo
    # 在文件最下方添加如下配置
    lisi ALL=/sbin/shutdown, /sbin/useradd
    # 如果不需要输入密码,使用下面配置
    lisi ALL=NOPASSWD: /sbin/shutdown, /sbin/useradd
    # 保存退出
    # 现在 lisi 可以通过 sudo 执行 shutdown 命令
    (lisi) sudo /sbin/shutdown -c

# 3. 用户配置文件

  • /etc/passwd 用户配置文件
    • 例如 root:x:0:0:root:/root:/bin/bash
    • 第一字段 用户名
    • 第二字段 是否需要密码验证
    • 第三字段 UID
    • 第四字段 GID
    • 第五字段 用户描述信息
    • 第六字段 用户 home 目录
    • 第七字段 login shell
  • /etc/shadow 用户密码相关配置文件
    • 只需要了解前两个字段
    • 第一字段 对应用户名
    • 第二字段 加密后的密码
  • /etc/group 用户组配置文件
    • 例如 root:x:0:
    • 第一字段 组名
    • 第二字段 是否需要密码验证
    • 第三字段 GID
    • 第四字段 其他组设置,说明组内某用户的主要组是隶属于其他组的

# 三、文件权限

# 1. 文件权限的表示方法

drwx------ 17  root  root   544B  4  8 15:20  Downloads
类型  权限      所属用户和组                      文件名
  • 文件类型

    • - 普通文件
    • d 目录文件
    • b 块特殊文件 - 块设备
    • c 字符特殊文件 - 字符终端
    • l 符号链接 - 类似 windows 的快捷方式
    • f 命名管道
    • s 套接字文件
  • 字符权限表示法

    • r 读 w 写 x 执行
  • 数字权限表示法

    • r=4 w=2 x=1
  • 文件权限的表示方法

    例如: -rw-r-xr-- 1 lisi group1 mtime filename

    • rw- 文件属主的权限

    • r-x 文件属组的权限

    • r-- 其他用户的权限

    • 创建新⽂件有默认权限,根据 umask 值计算,属主和属组根据当前进程的⽤户来设定

  • 目录权限的表示方法

    • x 进入目录
    • rx 显示目录内的文件名
    • wx 修改目录内的文件名

# 2. 文件权限管理常用命令

  • 修改文件、目录权限 - chmod

    • 用户
      • u 属主自己 g 同组用户 o 其他用户 a 所有
    chmod u+x /tmp/testfile
    chmod a+x /tmp/testfile
    chmod o-r /tmp/testfile
    chmod g=rw- /tmp/testfile
    chmod u=rwx,g-w /tmp/testfile
    chmod 755 /tmp/testfile
    • 同时更改子目录和文件的权限

      使用选项 -R ,例如

      chmod -R u+x /tmp/
  • 更改属主、属组 - chown

    chown 用户名 /tmp/testfile
    chown :组名 /tmp/testfile
    chown 用户名:组名 /tmp/testfile

# 3. 针对特定用户或组进行授权

实际是通过设置文件访问控制列表实现的,主要利用两个选项 -m-x 进行设置和取消权限。

  • 设置权限
# 指定 zhangsan 用户对 test.txt 有读写权限
setfacl -m u:zhangsan:rx test.txt
# 指定 music 组对 test.txt 有读权限
setfacl -m g:music:r test.txt

其中 acl 格式要特别注意,具体为 类型:具体值:权限

其中:

类型:u 代表用户,g 代表组;

具体值:根据类型填写存在的用户或者组;

权限:采用权限字符表示法或者数字表示法。

  • 取消权限

    取消的是 setfacl -m 命令设置到文件 ACL 的权限,用户或组恢复到默认权限。

# 取消 zhangsan 用户对 test.txt 的 ACL 权限
setfacl -x u:zhangsan test.txt
# 取消 music 组对 test.txt 的 ACL 权限
setfacl -x g:music test.txt

注意取消权限时,acl 格式不需要第三部分

  • 查看具体权限(包括 ACL 权限)
getfacl test.txt

# 4. 案例演示

案例 1 - 文件权限管理

mkdir /test
ls -ld /test
# 观察默认权限
# 创建三个测试用户
groupadd groupone
useradd -g groupone user1 
useradd -g groupone user2
useradd user3
chown user1 /test
ls -ld /test
# 观察权限变化
chown :groupone /test
ls -ld /test
# 观察权限变化
cd /test
touch afile
ls -l afile
chmod u+x afile
# 观察权限变化
chmod g-r afile
# 观察权限变化
chmod o=w afile
# 观察权限变化
chmod  afile
# 观察权限变化
chmod 644 afile
# 观察权限变化
# 默认权限 666 - umask
umask
touch bfile
# 观察权限

案例 2 - 文件权限实际意义

chown user1:groupone afile
chmod 400 afile
echo 123 > afile # 输出重定向
# 切换到 user1
su - user1
cat /test/afile
echo 456 > /test/afile # 有无权限,如何解决?
(user1) touch /test/bfile
(user1) chmod 020 /test/bfile # 用户和属组权限冲突,权限如何?
(user1) echo 123 > /test/bfile
(user1) su - user2
(user2) echo 456 > /test/bfile
chmod 000 /test
su - user1
ls -l # 有无权限?
cd /test # 有无权限?
chmod u=x /test
su - user1
cd /test 
# 说明什么?
chmod 000 /test
chmod u=rx /test
su - user1
cd /test 
ls -l 
# 说明什么?
chmod 000 /test
chmod u=wx /test
su - user1
cd /test
rm afile 
ls -l
# 说明什么?