0

0

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

P粉602998670

P粉602998670

发布时间:2025-07-13 12:01:02

|

432人浏览过

|

来源于php中文网

原创

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

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

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

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

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

232

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1349

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

704

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

776

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

573

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

546

2023.07.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.5万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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