# 用户

用户分类:

  • 管理员用户:UID 为 0 ,名为 root 。
  • 系统用户:UID 为 1~999 。
  • 普通用户:UID 从 1000 开始。

# 用户组

:可包含多个用户,便于统一管理。

  • 每个用户有且仅有一个基本用户组,可以添加多个扩展用户组。
  • 系统基于 UID、GID 来识别用户、用户组。多个用户可以使用相同的 UID ,多个用户组可以使用相同的 GID 。

# 家目录

  • 一般的用户都会被分配一个独立的主目录(又称为家目录),默认为 /home/<user>/
    • 例如 leo 的家目录是 /home/leo 。
    • 特别地,root 用户的家目录是 /root 。
  • 在终端中可以用 ~ 指代家目录,例如执行 cd ~ 即可进入家目录(执行 cd 也行)。

# 相关文件

  • /etc/passwd 文件允许被所有用户读取,用于保存所有用户的简介信息。如下:

    root:x:0:0:Superuser:/:
    daemon:x:1:1:System daemons:/etc:
    bin:x:2:2:Owner of system commands:/bin:
    sys:x:3:3:Owner of system files:/usr/sys:
    
    • 每行的格式为 "用户名:密码(不显示):用户 ID:组 ID:描述信息:主目录: login shell" 。
    • 伪用户:有些用户没有 login shell ,系统创建它们是为了方便管理。
    • /etc/passwd 文件可以被所有用户读取。
  • /etc/shadow 文件只允许被 root 用户读取,用于保存加密后的用户密码。如下:

    root:$6$4jYHVJzl2zLgCJSrRJjyigxoP:18223:0:99999:7:::
    nobody:*:17834:0:99999:7:::
    sshd:!!:18178::::::
    nginx:!!:18224::::::
    
    • 每行的第一个字段是用户名,第二个字段是用户加密后的密码。其中,* 表示该用户被锁定,!! 表示密码已过期。
  • /etc/group 文件允许被所有用户读取,用于保存所有用户组的信息。如下:

    root::0:root
    bin::2:root,bin
    sys::3:root,uucp
    
    • 每行的格式为 "组名:密码:组 ID:组内用户列表" 。

# PAM

:PAM(Pluggable Authentication Modules ,插入式认证模块)。是一组共享库,用于验证 Linux 用户身份。

  • 例如执行 login 命令时就是调用 PAM 验证用户密码。
  • /etc/pam.d/ 目录下保存各个程序的配置文件。
  • 包含四个处理不同任务的模块:
    • account :用于检查账号的属性,比如是否允许登录、是否过期。
    • auth :用于验证用户的身份,比如提示输入密码、账号是否为 root 。
    • password :用于修改密码。
    • session :用于在开始会话、结束会话时执行任务,比如打开用户信息、挂载文件系统。
      • 用户通过身份认证之后才会开始会话。

# 管理用户

# useradd

$ useradd <user>          # 创建一个用户
          -u <uid>        # 指定 uid ,默认会自动分配一个数字
          -g <group>      # 指定基本用户组(默认会自动创建并分配一个与该用户同名的基本用户组)
          -G <group>,...  # 指定扩展用户组
          -d /home/leo    # 指定家目录
          -m              # 如果家目录不存在,则自动创建。默认会自动创建
          -s /bin/bash    # 指定 shell 解释器(默认为 /bin/bash )
          -c <comment>    # 加上描述信息
          -e 2019-08-01   # 设置该用户的过期时间
  • 管理用户的命令都需要 root 权限才能执行。
  • 用 useradd 刚创建的用户,其初始密码是过期的,需要用 passwd 命令修改密码。
  • login shell 为 /sbin/nologin 表示禁止该用户登录。

# usermod

$ usermod <user>              # 修改用户的配置
          -s /sbin/nologin    # 修改 login shell
          -dm /home/leo       # 修改家目录,并将旧的家目录的文件移动过去
          -aG <group>,...     # 添加扩展用户组
  • usermod 命令支持 useradd 命令的选项。

# userdel

$ userdel <user>  # 删除一个用户,并删除其主目录
          -r      # 同时删除其主目录和 mail 文件
          -f      # 强制删除

# passwd

$ passwd [user]   # 修改用户的密码(默认是当前用户)
         -d       # 删除用户的密码,使其登录时不再需要密码
         -l       # 锁定用户,使其不能登录
         -u       # 解锁用户
         -S       # 显示用户的密码状态(是否设置了密码、是否锁定)
  • 普通用户使用 passwd 命令时只能修改自己的密码,并且要输入旧密码进行验证。而 root 用户可以直接修改任意用户的密码。

# 切换用户

# su

$ su [user]             # 切换到指定用户(默认是 root )
    -                   # 创建一个 login shell (默认是创建一个 non-login shell )
    -c <command>        # 不切换用户,只是以指定用户的身份执行一条命令
  • 切换用户时并不会切换 tty 。
  • 切换用户时, logname、tty 命令的结果不会变,而 whoami 命令的结果会改变。

# sudo

$ sudo <command>           # 以 root 用户的身份执行命令
       -u <user> <command> # 以指定用户的身份运行命令(可以用用户名或用户 ID 指定)
       -l                  # 显示当前用户可通过 sudo 执行的命令
       -S                  # 从 stdin 读取密码(从而可以通过 echo PASSWORD | sudo -l 的格式输入密码)
       -v                  # 要求立即验证密码(每次验证密码后,默认 5 分钟内可免认证多次使用 sudo )
       -k                  # 要求用户在下一次使用 sudo 时验证密码
  • 普通用户执行 sudo 时需要输入自己的密码,而执行 su - 时需要输入 root 的密码。因此,执行 sudo su - 即可使用自己的密码切换到 root 用户。
  • /etc/sudoers 文件中记录了哪些用户有权限使用 sudo 命令,如下:
    root   ALL=(ALL)  ALL    # 允许 root 用户在任何目录下以任何用户的身份执行任何命令
    %sudo  ALL=(ALL)  ALL    # 允许 sudo 用户组
    leo    ALL=(ALL)  NOPASSWD: /usr/bin/docker,/root/run.sh  # 允许 leo 用户不需要输入密码就执行规定的命令
    
    • 只有 root 用户有权限编辑该文件。建议通过 visudo 命令编辑,以检查语法正确。

# 管理用户组

# id

$ id                 # 显示当前用户的 uid、gid、扩展用户组 id
    <user>           # 显示指定用户的
    -u               # 只显示 uid
    -g               # 只显示 gid
    -G               # 只显示扩展用户组 id

# groups

$ groups             # 显示当前用户所属的用户组(用 su 切换用户之后会改变)
        <user>...    # 显示指定用户所属的用户组

# groupadd

$ groupadd <组名>    # 增加一个用户组

# groupmod

$ groupmod
           <旧组名> <新组名>  # 修改用户组的名字
           -g <ID> <组名>    # 修改用户组的 ID

# groupdel

$ groupdel <组名>    # 删除一个用户组