1.配置密码策略,2.编写告警脚本,3.配置定时任务。实现linux用户密码过期提前告警的核心步骤包括:首先使用chage命令设置密码最长有效期和警告天数,例如sudo chage -m 90 -w 14 testuser;其次编写脚本遍历系统用户,解析chage输出获取过期信息,计算剩余天数并在警告期内发送邮件通知;最后通过crontab配置定时任务,如每天早上9点执行脚本,确保自动化运行。
在Linux系统里,确保用户密码不会突然过期导致无法登录,提前进行告警至关重要。这通常通过结合系统自带的密码策略工具 chage 和一个自定义的自动化脚本来实现,脚本会定期检查用户密码有效期,并在临近过期时发送通知。
实现Linux用户密码过期提前告警,核心在于三个步骤:配置密码策略,编写一个能识别过期风险并发送通知的脚本,然后利用 cron 定时执行这个脚本。
配置用户密码过期策略chage 命令是Linux系统管理用户密码过期策略的利器。我们可以用它来设定密码的最大有效期、最小有效期以及提前多少天开始警告。
例如,给用户 testuser 设置密码最长有效期为90天,并在过期前14天开始警告: sudo chage -M 90 -W 14 testuser
这里:
你可以通过 chage -l testuser 查看当前用户的密码策略信息,比如上次修改时间、过期日期、警告天数等。这些信息是后续脚本判断的基础。
编写密码过期告警脚本 这个脚本需要遍历系统中的所有用户(或者你希望监控的用户),获取他们的密码过期信息,计算剩余天数,然后判断是否在警告期内,如果是,就发送邮件通知。
一个基本的思路是:
配置定时任务(Cron) 为了让脚本自动运行,我们需要把它添加到 cron 定时任务中。通常,每天执行一次是比较合理的频率。
比如,你可以编辑root用户的 crontab: sudo crontab -e
然后添加一行: 0 9 * * * /path/to/your_password_check_script.sh > /dev/null 2>&1
这表示每天早上9点执行你的脚本。> /dev/null 2>&1 是为了避免脚本输出信息污染日志或发送不必要的邮件。
说实话,谁没遇到过因为密码过期被系统锁在门外的情况?那种感觉,就像钥匙突然失效了,手足无措。提前告警,不仅仅是避免这种尴尬。从安全角度看,它强制用户定期更换密码,降低了密码被破解的风险,这符合很多合规性要求。如果一个长期不换密码的账户被攻破,那影响可就大了。
再者,对用户体验来说,收到一个“你的密码即将过期,请及时修改”的通知,总比在需要紧急登录时发现密码已失效要好得多。这给了用户充足的准备时间,避免了因密码问题导致的工作中断。想象一下,半夜生产环境出了问题,你急着登录,结果密码过期了,那真是要命。所以,这不只是个技术活,更是个关乎效率和安全的人性化考量。
写一个能跑起来的脚本,核心在于解析 chage 的输出,然后用 mail 命令发出去。这里提供一个基础的Shell脚本框架,你可以根据实际需求调整。
#!/bin/bash # 邮件配置 MAIL_TO="your_email@example.com" # 收件人邮箱,可以添加多个,用逗号分隔 MAIL_SUBJECT="Linux用户密码过期告警" MAIL_FROM="root@$(hostname)" # 发件人,通常是root用户 # 获取所有系统用户,排除系统账户和shell为/sbin/nologin的用户 # 注意:这里可能需要根据你的实际情况调整,例如排除nobody, ntp等服务账户 USERS=$(cat /etc/passwd | awk -F: '$3 >= 1000 && $7 != "/sbin/nologin" && $7 != "/bin/false" {print $1}') echo "正在检查Linux用户密码过期情况..." for USER in $USERS; do # 获取用户密码信息 # 尝试将chage输出语言设置为C,以统一日期格式解析 CHAGE_INFO=$(LC_ALL=C chage -l "$USER" 2>/dev/null) # 检查chage命令是否成功执行,以及用户是否有密码过期策略 if [ $? -ne 0 ] || ! echo "$CHAGE_INFO" | grep -q "Password expires"; then # 可能是系统账户或者没有设置密码过期策略,跳过 continue fi # 解析密码过期日期 # 注意:这里的日期格式是英文环境下的"Password expires"后的日期,例如"Oct 26, 2024" EXPIRE_DATE_STR=$(echo "$CHAGE_INFO" | grep "Password expires" | awk -F': ' '{print $2}' | xargs) # 如果没有过期日期(例如密码永不过期),则跳过 if [ -z "$EXPIRE_DATE_STR" ] || [ "$EXPIRE_DATE_STR" == "never" ]; then continue fi # 解析警告天数 WARN_DAYS_STR=$(echo "$CHAGE_INFO" | grep "Password warning" | awk -F': ' '{print $2}' | awk '{print $1}' | xargs) if [ -z "$WARN_DAYS_STR" ]; then WARN_DAYS=0 # 默认没有设置警告天数则为0 else WARN_DAYS=$WARN_DAYS_STR fi # 将过期日期字符串转换为Unix时间戳,并计算剩余天数 # 确保date命令能识别"Oct 26, 2024"这种格式 EXPIRE_TIMESTAMP=$(date -d "$EXPIRE_DATE_STR" +%s 2>/dev/null) if [ $? -ne 0 ]; then echo "警告:无法解析用户 $USER 的过期日期 '$EXPIRE_DATE_STR',请检查系统语言设置或脚本日期解析逻辑。" continue fi CURRENT_TIMESTAMP=$(date +%s) # 计算剩余秒数,然后转换为天数 REMAINING_SECONDS=$((EXPIRE_TIMESTAMP - CURRENT_TIMESTAMP)) REMAINING_DAYS=$((REMAINING_SECONDS / 86400)) # 86400秒 = 1天 # 判断是否在警告期内 if [ "$REMAINING_DAYS" -le "$WARN_DAYS" ] && [ "$REMAINING_DAYS" -ge 0 ]; then MAIL_BODY="用户 $USER 的密码将在 $REMAINING_DAYS 天内过期 (过期日期: $EXPIRE_DATE_STR)。请及时修改密码,避免影响正常使用。" echo "$MAIL_BODY" | mail -s "$MAIL_SUBJECT" -r "$MAIL_FROM" "$MAIL_TO" echo "已发送告警邮件给 $MAIL_TO 关于用户 $USER。" elif [ "$REMAINING_DAYS" -lt 0 ]; then # 密码已经过期 MAIL_BODY="用户 $USER 的密码已过期!请立即处理。过期日期: $EXPIRE_DATE_STR。" echo "$MAIL_BODY" | mail -s "$MAIL_SUBJECT - 紧急!密码已过期" -r "$MAIL_FROM" "$MAIL_TO" echo "已发送紧急告警邮件给 $MAIL_TO 关于用户 $USER (密码已过期)。" fi done echo "密码过期检查完成。"
这段脚本需要 mail 命令的支持,通常这需要安装 mailutils 或 postfix/sendmail 等邮件传输代理(MTA)。如果你没有配置MTA,邮件可能无法发送出去。脚本里通过 LC_ALL=C 尝试统一 chage 的输出语言,以简化日期解析,但在某些特定环境下,仍需根据实际输出格式调整 awk 或 sed 匹配规则。
脚本写好了,总不能每次都手动运行吧?那太不“自动化”了。这时候 cron 就派上用场了。cron 是Linux系统里一个非常强大的定时任务工具,它能让你的脚本在指定的时间点自动执行。
配置 cron 任务通常是通过编辑 crontab 文件来实现的
以上就是如何实现Linux用户密码过期通知 提前告警设置方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号