用户登录记录
查看历史登录记录
$ 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 模板, 每次新建用户时把该目录下的文件拷贝到新用户的家目录下