信息发布→ 登录 注册 退出

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

发布时间:2025-07-13

点击量:

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

这里:

  • -M 90:表示密码最长有效期为90天。
  • -W 14:表示在密码过期前14天开始警告用户。

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

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

一个基本的思路是:

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

配置定时任务(Cron) 为了让脚本自动运行,我们需要把它添加到 cron 定时任务中。通常,每天执行一次是比较合理的频率。

比如,你可以编辑root用户的 crontabsudo 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, 2025"
    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, 2025"这种格式
    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 命令的支持,通常这需要安装 mailutilspostfix/sendmail 等邮件传输代理(MTA)。如果你没有配置MTA,邮件可能无法发送出去。脚本里通过 LC_ALL=C 尝试统一 chage 的输出语言,以简化日期解析,但在某些特定环境下,仍需根据实际输出格式调整 awksed 匹配规则。

如何配置自动化任务(Cron)?

脚本写好了,总不能每次都手动运行吧?那太不“自动化”了。这时候 cron 就派上用场了。cron 是Linux系统里一个非常强大的定时任务工具,它能让你的脚本在指定的时间点自动执行。

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

标签:# 你可以  # 跳过  # 转换为  # 来实现  # 请及时  # 遍历  # 发送邮件  # 是个  # 期内  # 并在  # linux  # 自动化  # 并发  # mail  # NULL  # 为什么  # shell脚本  # 邮箱  # ai  # 工具  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!