剩余锁定时间需通过 faillock --user username 输出中的 lockout time 与 last failure 时间戳手动计算:剩余时间 = lockout time − (当前时间 − last failure),仅当用户已被锁(failures total ≥ deny)时有效;若无 lockout time 行则未被锁,chage -l 无法查看该状态。

faillock --user 输出里怎么看剩余锁定时间
Linux 用 pam_faillock.so 锁定用户后,剩余锁定时长不会直接显示为“还剩 X 分钟”,而是通过 faillock --user username 的输出中两个关键字段推算出来:一是 Lockout time(全局设定的自动解锁秒数),二是 Last failure(最后一次失败的时间戳)。剩余时间 = Lockout time − (当前时间 − Last failure),但前提是该用户已被锁(即失败次数 ≥ deny 值且未超 unlock_time)。
- 如果输出含
Failures total: 5且Lockout time: 900,说明触发了锁定;再看Last failure: Thu Oct 2 19:45:22 2026,当前是20:36,差值约 51 分钟 → 剩余约900 − 3060 = 负数?—— 实际上此时已自动解锁,faillock不会显示“剩余”,只在锁定中才有效 - 若输出没有
Lockout time行,说明该用户尚未被锁(失败次数不够,或fail_interval窗口已过期) -
faillock不提供实时倒计时,它只记录“最后失败时间”和“策略设定的解锁时长”,中间计算靠人手或脚本补全
为什么 chage -l 看不到 pam_faillock 的锁定状态
chage -l 查的是密码生命周期(如 Last password change、Password expires),跟 pam_faillock.so 的登录失败计数完全无关。两者存储位置、触发机制、管理命令都不同:chage 操作 /etc/shadow 的第 3–8 字段,而 faillock 状态存在 /var/run/faillock/ 或 /run/faillock/ 下的独立文件中。
- 误用
chage -l查锁定状态,永远得不到答案 - 想确认某用户是否“当前被锁”,唯一可靠方式是
faillock --user username并检查是否有Failures total≥deny且无reset记录 - 部分老文档提到
pam_tally2 --user,但该工具在 RHEL 8+/Ubuntu 20.04+ 已废弃,调用会报错或返回空
用脚本算出剩余秒数的最小可行方案
手动算太麻烦,可以写一行 shell 快速估算(假设锁定策略为 deny=5 unlock_time=900 fail_interval=60):
faillock --user alice 2>/dev/null | awk '/Failures total:/ && $4 >= 5 {f=1} /Last failure:/ {t=$0} /Lockout time:/ {l=$3} f && t && l {cmd="date -d \"" $0 "\" +%s 2>/dev/null"; cmd | getline ts; close(cmd); now=systime(); if (ts > 0) print int(l - (now - ts)) " seconds remaining"}'
这段逻辑只在用户确已被锁时输出剩余秒数;若输出为空,代表未锁、已解或时间解析失败。
- 注意
faillock输出格式依赖 locale,中文系统可能需先LANG=C faillock --user username - 脚本不能替代
faillock --user --reset这种运维动作,它只是读状态 - 生产环境不建议依赖实时剩余时间做自动化决策,应以“是否被锁”为布尔判断依据
容易被忽略的路径与权限细节
faillock 状态文件默认存于 /var/run/faillock/(旧版)或 /run/faillock/(systemd 系统),但普通用户无法直接读取这些文件 —— 所有交互必须走 faillock 命令,且该命令本身要求调用者有读取对应用户状态的权限(通常只有 root 或该用户自己能查自身)。
- 非 root 用户执行
faillock --user otheruser会报 Permission denied -
/run/faillock/是 tmpfs,重启清空,但策略配置(PAM 文件)不受影响 - 如果
faillock --user username返回空或 no such user,先确认用户是否存在(id username),再确认 PAM 规则是否已加载(grep faillock /etc/pam.d/common-auth)











