Linux终端“弹窗警告”实为登录时强制显示的高亮提示,需通过chage设置密码警告期、PAM pam_exec.so执行检查脚本、Shell启动时二次横幅三步实现,确保SSH与TTY均生效且不可跳过。

Linux 没有原生“弹窗”机制,终端环境下所谓“弹窗警告”实际是指在每次成功登录后、Shell 启动前,强制输出一行或多行高亮、不可跳过、语义明确的提醒信息。这种提示必须在用户看到命令行之前就出现,且对 SSH 和本地 TTY 登录均生效。
以下配置可实现:密码到期前 7 天内,每次交互式登录(SSH 或 console)都显示醒目警告,并附带操作指引。
✅ 确保密码警告期已正确设置
这是所有提醒的前提。系统只会在 chage -W 设置的天数内触发原生提示逻辑。
- 对指定用户设置提前 7 天警告:
sudo chage -W 7 username
- 验证是否生效:
sudo chage -l username | grep -E "(Password expires|Password warning period)"
输出应类似:
Password expires : Oct 12, 2026 Password warning period : 7 days
⚠️ 若为新用户,还需检查
/etc/login.defs中PASS_WARN_AGE 7是否已设,否则新建账户默认无警告。
✅ 用 PAM pam_exec.so 插入强提醒脚本(推荐,通用性强)
pam_echo.so 虽简洁,但部分发行版(如较新 Ubuntu/Debian)未预装 libpam-echo;而 pam_exec.so 是标准模块,兼容性更好。
-
编辑登录服务的 PAM 配置:
linux-sysadmin下载Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- SSH 登录:
sudo nano /etc/pam.d/sshd - 本地终端(Ctrl+Alt+F1~F6):
sudo nano /etc/pam.d/login
- SSH 登录:
-
在文件末尾添加一行(注意是
session optional,非auth或password):session optional pam_exec.so stdout /usr/local/bin/passwd-expiry-notice.sh
-
创建脚本
/usr/local/bin/passwd-expiry-notice.sh:#!/bin/bash # 获取当前用户密码到期剩余天数 expiry_line=$(chage -l "$PAM_USER" 2>/dev/null | grep "Password expires") if [[ -z "$expiry_line" ]] || echo "$expiry_line" | grep -q "never\|never"; then exit 0 fi # 提取数字天数(如 "in 3 days" → 3) remaining=$(echo "$expiry_line" | sed -n 's/.*in \([0-9]\+\) days.*/\1/p') if [[ "$remaining" =~ ^[0-9]+$ ]] && [ "$remaining" -le 7 ] && [ "$remaining" -gt 0 ]; then echo "" echo -e "\033[1;33m⚠️ WARNING: Your password expires in ${remaining} day(s)!\033[0m" echo -e "\033[1;32m→ Please run \033[1;37m'passwd'\033[1;32m now to update it.\033[0m" echo "" fi -
赋予执行权限:
sudo chmod +x /usr/local/bin/passwd-expiry-notice.sh
✅ 效果:每次登录成功后立即显示黄底黑字警告,含 emoji 和颜色,视觉突出;不依赖用户 Shell,无法被
.bashrc跳过。
✅ 补充:Shell 启动时二次强化(可选,增强感知)
对已登录但尚未改密的用户,在首次执行命令前再刷一次横幅:
- 编辑全局 Bash 启动文件(影响所有用户):
sudo nano /etc/bash.bashrc
- 在末尾追加:
# 密码临期横幅(仅对未过期但 ≤7 天的用户) if [ -z "$PASSWD_NOTICE_SHOWN" ]; then if chage -l "$USER" 2>/dev/null | awk -F': ' '/Password expires/ {gsub(/^[ \t]+|[ \t]+$/, "", $2); if ($2 ~ /^[0-9]+ days$/) print "yes"}' >/dev/null; then remaining=$(chage -l "$USER" 2>/dev/null | awk -F': ' '/Password expires/ {print $2}' | awk '{print $1}') if [[ "$remaining" =~ ^[0-9]+$ ]] && [ "$remaining" -le 7 ] && [ "$remaining" -gt 0 ]; then echo -e "\033[1;41;97m ? PASSWORD EXPIRES IN ${remaining} DAY(S) — RUN 'passwd' NOW! \033[0m" export PASSWD_NOTICE_SHOWN=1 fi fi fi
✅ 此处使用红色背景白字横幅,比普通提示更抓眼球,且仅在首次 Shell 启动时显示一次。
❌ 不推荐的方式
- 仅靠
chage -W+ 默认 PAM 提示:文字太弱,常被启动日志淹没; - 依赖
.bashrc单独判断:若用户用zsh、fish或ssh cmd绕过 Shell,即失效; - 使用图形弹窗(如
zenity):SSH 登录无 DISPLAY,本地 TTY 也无 X server,必然失败。
以上三步组合(基础策略 + PAM 脚本 + Shell 横幅),能在纯终端环境达成真正“强提醒”效果:稳定触发、视觉突出、操作明确、难以忽略。

















