首页 > 运维 > linux运维 > 正文

如何实现Linux用户密码过期通知 提前告警设置方法

P粉602998670
发布: 2025-07-13 12:01:02
原创
298人浏览过

1.配置密码策略,2.编写告警脚本,3.配置定时任务。实现linux用户密码过期提前告警的核心步骤包括:首先使用chage命令设置密码最长有效期和警告天数,例如sudo chage -m 90 -w 14 testuser;其次编写脚本遍历系统用户,解析chage输出获取过期信息,计算剩余天数并在警告期内发送邮件通知;最后通过crontab配置定时任务,如每天早上9点执行脚本,确保自动化运行。

如何实现Linux用户密码过期通知 提前告警设置方法

在Linux系统里,确保用户密码不会突然过期导致无法登录,提前进行告警至关重要。这通常通过结合系统自带的密码策略工具 chage 和一个自定义的自动化脚本来实现,脚本会定期检查用户密码有效期,并在临近过期时发送通知。

如何实现Linux用户密码过期通知 提前告警设置方法

实现Linux用户密码过期提前告警,核心在于三个步骤:配置密码策略,编写一个能识别过期风险并发送通知的脚本,然后利用 cron 定时执行这个脚本。

配置用户密码过期策略chage 命令是Linux系统管理用户密码过期策略的利器。我们可以用它来设定密码的最大有效期、最小有效期以及提前多少天开始警告。

如何实现Linux用户密码过期通知 提前告警设置方法

例如,给用户 testuser 设置密码最长有效期为90天,并在过期前14天开始警告: sudo chage -M 90 -W 14 testuser

这里:

如何实现Linux用户密码过期通知 提前告警设置方法
  • -M 90:表示密码最长有效期为90天。
  • -W 14:表示在密码过期前14天开始警告用户。

你可以通过 chage -l testuser 查看当前用户的密码策略信息,比如上次修改时间、过期日期、警告天数等。这些信息是后续脚本判断的基础。

编写密码过期告警脚本 这个脚本需要遍历系统中的所有用户(或者你希望监控的用户),获取他们的密码过期信息,计算剩余天数,然后判断是否在警告期内,如果是,就发送邮件通知。

一个基本的思路是:

  1. 获取所有用户的列表。
  2. 对每个用户,运行 chage -l 获取其密码信息。
  3. 解析 chage 的输出,提取“密码过期日期”和“警告天数”。
  4. 计算当前日期到过期日期的剩余天数。
  5. 如果剩余天数小于或等于警告天数,就发送邮件。

配置定时任务(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 就派上用场了。cron 是Linux系统里一个非常强大的定时任务工具,它能让你的脚本在指定的时间点自动执行。

配置 cron 任务通常是通过编辑 crontab 文件来实现的

以上就是如何实现Linux用户密码过期通知 提前告警设置方法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号