用户登录记录

查看历史登录记录
$ last [选项] [用户名] [终端设备]
        -a          # 在最后一列中显示主机名
        -d          # 将IP解析为主机名
        -f          # + 文件, 使用特定的文件, 而不是 /var/log/wtmp
        -F          # 打印完整的登录和注销时间和日期
        -i          # 以点分十进制表示法显示IP
        -n          # + 行数, 设置要显示多少行
        -[n]        # 同 -n [n]
        -R          # 不显示主机名字段
        -s          # + 时间, 显示自<指定时间>以来的记录
        -t          # + 时间, 显示行直到<指定时间>的记录
        -p          # + 时间, 显示在<指定时间>在线用户
        -w          # 显示完整的用户名和域名
        -x          # 显示系统关闭条目和运行级别更改

# 查看最近 10 条root登录记录
$ last -10 -i -R -w root pts/0

# 查看指定日期之后的部分记录
$ last -n 10 -s "2024-02-10"  root
查看所有用户最后一次登录时间
$ lastlog [选项] [...]
           -b       # + 天数, 仅打印早于 DAYS 的最后日志记录
           -C       # 清除用户的最后日志记录 (仅可与 -u 同时使用)
           -S       # 将 lastlog 记录设置为当前时间 (仅可与 -u 同时使用)
           -t       # + 天数, 仅打印最近超过 DAYS 的最后日志记录
           -u       # + 用户, 打印指定用户的最后一条日志记录

# 只查看 root 最后登录记录
$ lastlog -u root

# 清除 root 最后登录记录 (Last: **Never logged in**)
$ lastlog -u root -C
登陆失败的记录
$ lastb [选项] [用户] [终端]
        -a          # 在最后一列中显示主机名
        -d          # 将IP解析为主机名
        -f          # + 文件, 使用特定的文件, 而不是 /var/log/btmp
        -F          # 打印完整的登录和注销时间和日期
        -i          # 以点分十进制表示法显示IP
        -n          # + 行数, 设置要显示多少行
        -[n]        # 同 -n [n]
        -R          # 不显示主机名字段
        -s          # + 时间, 显示自<指定时间>以来的记录
        -t          # + 时间, 显示行直到<指定时间>的记录
        -p          # + 时间, 显示在<指定时间>在线用户
        -w          # 显示完整的用户名和域名
        -x          # 显示系统关闭条目和运行级别更改

# 查看 10 跳最后的失败登录记录
lastb -10 -i -w

# 查看以 admin 为用户名, 直到 02/20 的失败记录
$ lastb -d -F -t "2024-02-20" admin

创建用户

$ useradd [选项] [用户名]
           -p                     # 指定用户登录密码
           -D                     # 查看创建用户时的默认配置
           -m                     # 创建用户主目录
           -M                     # 不创建主目录
           -d                     # 指定用户主目录
           -u                     # 指定用户的UID
           -o                     # 允许使用重复的UID创建用户
           -g                     # 指定用户的主组
           -G                     # 指定用户附加组
           -U                     # 创建与用户名相同的组
           -N                     # 不创建同名组(系统会自动创建一个和用户名同名的组并且设为主组)
           -r                     # 创建一个系统用户
           -e                     # 指定用户过期日期
           -s                     # 指定用户登录时使用的shell
           -c                     # 用户说明

# 例如
$ useradd xiaoming                # 将会使用默认配置
$ useradd -u 1666 -g dev -G fun -s /bin/bash -e 2030-03-30 -r -m minecraft

# 默认配置存放于 /etc/default/useradd
# GROUP=100                       # 默认组...
# HOME=/home                      # 家目录
# INACTIVE=-1                     # 密码过期宽限期 /etc/shadow 第七字段, -1表示永不过期
# EXPIRE=                         # 密码失效期 /etc/shadow 第八字段
# SHELL=/bin/bash                 # 登录shell
# SKEL=/etc/skel                  # 模板
# CREATE_MAIL_SPOOL=yes           # 是否建立邮箱

删除用户

$ userdel [参数] [用户名]
           -f                     # 删除仍登录的用户或文件,即使不属于用户
           -r                     # 删除用户家目录和邮件池

更新/修改用户配置

$ usermod [参数] [用户名]
           -d                     # 更新主目录所在位置
           -m                     # 将主目录移动到新的位置 (仅和-d同时使用)
           -e                     # 更新用户的过期日期
           -g                     # 强制更新主组
           -G                     # 添加附加组
           -a                     # 添加附加组时不从其他组中删除用户
           -s                     # 更新登录 shell
           -u                     # 更新UID
           -L                     # 锁定账户
           -U                     # 解锁账户

用户密码

$ passwd [选项] [用户名]
           -S       # 查看用户的密码状态, 用户密码一般加密存储在 /etc/shadow 文件中
           -k       # 保持密码不过期
           -l       # 锁定密码
           -u       # 解锁密码
           -d       # 删除密码 (删除密码同时会解锁密码)
           -e       # 终止密码 (强制用户登陆时更新密码)
           -x=days  # 设置密码最长有效时限 (保持旧密码不更新的最大期限, 超过后密码过期)
           -n=days  # 设置密码最短有效时限 (在指定时长内无法再次更新密码)
           -w=days  # 在过期前 days 天提醒用户 (发出警告: 密码即将过期, 请及时更新)
           -i=days  # 过期 days 天后禁用账户 (宽恕过期的期限, 超过则无法登录)
           --stdin  # 一般用于脚本中, echo "123" | passwd -stdin shuaige
           <none>   # 不加任何参数直接跟上用户名就是更新用户的密码!
                    # 管理员设置的密码可以是任意的,但普通用户修改自己的密码必须符合复杂度

修改密码状态

$ chage [选项] [用户名]
         -l         # 列出密码状态
         -d         # 修改密码最后一次更新日期
         -m         # 修改密码最短更新间隔
         -M         # 修改密码最大有效期
         -W         # 修改密码过期前警告期
         -I         # 修改密码过期后宽限期
         -E         # 修改账户失效日期

$ chage  -d 0 shuaige
# 系统认为 shuaige 从未修改密码, 那么下次登陆时必须修改密码, 相当于 passwd -e

用户可以正常登录的条件

  • 密码非空
  • 密码没有过期 (或者没有过宽恕期)
  • 密码没有被锁定
  • 用户存在
  • 用户没有被锁定
  • 用户具有正常使用的 shell 终端
  • ...

/etc/login.defs保存创建用户时默认的密码设置

MAIL_DIR                /var/spool/mail
PASS_MAX_DAYS           99999
PASS_MIN_DAYS           0
PASS_MIN_LEN            5
PASS_WARN_AGE           7
UID_MIN                 1000
UID_MAX                 60000
SYS_UID_MIN             201
SYS_UID_MAX             999
GID_MIN                 1000
GID_MAX                 60000
SYS_GID_MIN             201
SYS_GID_MAX             999
CREATE_HOME             yes
UMASK                   077
USERGROUPS_ENAB         yes
ENCRYPT_METHOD          SHA512

查看当前登录的用户

$ who
  root     tty1         2021-02-12 08:12
  root     pts/0        2021-02-12 08:14 (192.168.0.13)
# 用户名    登录终端      登录日期     时间   登录IP

# tty表示本地终端
# pts表示远程终端

$ w
  10:05:12 up  1:49,  2 users,  load average: 0.00, 0.00, 0.00
  USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
  root     tty1     -                08:12    1:01m  1.01s  1.01s -bash
  root     pts/0    192.168.0.13     08:14    0.00s  0.13s  0.04s w

# 第一行输出和命令 uptime 一致
# 分别表示系统时间, 累计运行时间, 登录用户数, 单核CPU负载 (过去5分钟, 10分钟, 15分钟)
说明
IDLE用户登陆后空闲时长
JCPU用户累计占用CPU时间
PCPU用户当前执行操作占用CPU的时间
WHAT用户当前所执行的操作

添加组

$ groupadd [选项] [组名]
            -g             # 指定GID
            -p             # 设定组密码
            -r             # 创建一个系统账户
$ groupadd  -g 250 shuaige

删除组

$ groupdel [组名]            # 删除组,若该组为任意一个用户的主组,则不能删除

管理组

$ groupmod [选项] [组名]
            -g             # 修改GID
            -n             # 重命名组, 先新名字, 再旧名
            -p             # 修改密码

$ gpasswd [选项] [用户名] [组名]
            -a             # 将用户添加进组
            -d             # 将用户从组中删除
            -r             # 删除组的密码
            -M             # 设为组员
            -A             # 设置组管理员

切换用户

$ su [选项] [用户名]
                           # 切换用户需要目标用户的密码
      -	                   # 切换用户时切换环境变量
      -c                   # "借用"目标用户执行一次命令

$ sudo su - root                     # 用sudo密码而不是root密码切换到root用户
$ su - root -c "useradd -m meinv"    # 使用 root 的环境变量临时执行一次指定命令

环境变量

$ env                      # 输出用户环境变量
$ env -u [VAR]             # 移除环境变量中的变量
$ env -i [command]         # 以一个干净的环境变量运行一个 command 命令

查看当前用户信息

$ id [username]            # 查看用户UID, GID等
$ whoami                   # 查看当前登录者的用户名

用户/组的配置文件

文件作用
/etc/passwd存放用户配置
/etc/shadow存放用户密码相关信息
/etc/group存放组配置
/etc/gshadow存放组密码等相关信息

/etc/passwd

wubin:x:888:250::/home/wubin:/usr/bin/zsh

字段编号说明
第一字段用户名
第二字段密码标识, x表示有密码
第三字段UID, 0是管理员
第四字段GID, 这里指主组, 每个用户有且只能有一个主组
第五字段备注
第六字段家目录
第七字段登录shell, 默认为/bin/bash

/etc/shadow

wubin:$6$xzSAg.Md$vWaotkoeOQsF9YLiJ5yyb2wEPQrjB/6wgJy0./mJ2w4pxQtDIr.bGXCU7J6EyLsYcEA417O5WFXoswwqEXGwi.:18672:3:30:5:7:18683:

字段编号说明
第一字段用户名
第二字段SHA-512散列加密算法加密后的密码, (!!或者*)表示无密码
第三字段密码最后一次修改日期 (从1970-01-01按天累加)
第四字段密码最小有效期, 即修改间隔
第五字段密码最大有效期
第六字段过期前警告期
第七字段过期后宽恕期
第八字段账户失效日期 (计算方法同第三字段)
第九字段(保留)

时间戳换算

# 时间戳->年月日
$ date -d "1970-01-01 18670 days"

# 年月日->时间戳
$ echo$(($(date --date="2021/02/19" +%s)/86400+1))

/etc/group

shuaige:x:250:

字段说明
第一字段组名, 默认和用户名一致
第二字段组密码标识
第三字段GID
第四字段附加成员

/etc/gshadow

shuaige:!::

字段说明
第一字段组名
第二字段组密码
第三字段组管理员
第四字段附加成员

其他文件/目录

/home/               家目录
/var/spool/mail/     邮件
/etc/skel            模板, 每次新建用户时把该目录下的文件拷贝到新用户的家目录下