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 查看当前用户的密码策略信息,比如上次修改时间、过期日期、警告天数等。这些信息是后续脚本判断的基础。

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

一个基本的思路是:

皮卡智能
皮卡智能

AI驱动高效视觉设计平台

下载
  1. 获取所有用户的列表。
  2. 对每个用户,运行 chage -l <username></username> 获取其密码信息。
  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 文件来实现的

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

254

2023.09.22

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

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

1089

2024.03.01

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

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

1564

2023.06.21

如何安装LINUX
如何安装LINUX

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

716

2023.06.29

linux find
linux find

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

300

2023.06.30

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

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

800

2023.07.05

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

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

587

2023.07.06

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

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

570

2023.07.20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

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

精品课程

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

共48课时 | 10.5万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

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

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