You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于日期对比的Bash校园学生用户创建与管理脚本开发

解决方案:基于离校日期管理学生用户的Bash脚本

嗨,作为Bash新手能自己动手写初始脚本已经超棒啦!我会帮你修改脚本,完美实现根据离校日期创建、停用、删除用户的需求,每一步都会给你讲清楚,方便你理解。

先明确几个前提

  • 假设你的CSV文件file.csv的字段顺序是:firstname;lastname;Day of Entry;Day of leaving,且日期格式为YYYY-MM-DD(如果你的日期是其他格式,比如DD/MM/YYYY,我后面会加转换方法)
  • 脚本需要以root权限运行(因为useradd/usermod/userdel都是系统管理命令)
  • 我们会先把日期转换成统一的可比较格式,Bash中YYYY-MM-DD格式的字符串可以直接用比较运算符判断先后

完整修改后的脚本

#!/bin/bash

# 保存原始IFS,避免影响其他命令
OLDIFS=$IFS
IFS=";"

# 获取当前日期和4周前的日期(统一为YYYY-MM-DD格式)
current_date=$(date +%Y-%m-%d)
four_weeks_ago=$(date -d "4 weeks ago" +%Y-%m-%d)

# 读取CSV文件,跳过第一行表头(如果你的CSV没有表头,可以去掉| sed 1d)
while read firstname lastname entry_date leave_date
do
    # 跳过空行(防止CSV末尾有空行导致报错)
    [ -z "$firstname" ] && continue

    # 定义用户名(用lastname,和你原来的脚本一致)
    username="$lastname"

    # 1. 离校日期在未来:创建用户(如果用户不存在)
    if [[ "$leave_date" > "$current_date" ]]; then
        if ! id "$username" &>/dev/null; then
            useradd -c "${firstname} ${lastname}" -d "/home/${firstname}" -G group1 -s /bin/bash "$username"
            echo "已创建用户:$username"
        else
            echo "用户$username已存在,无需重复创建"
        fi

    # 2. 离校日期已过期但不足4周:停用用户
    elif [[ "$leave_date" <= "$current_date" && "$leave_date" > "$four_weeks_ago" ]]; then
        if id "$username" &>/dev/null; then
            usermod -L "$username"
            echo "已停用用户:$username"
        else
            echo "用户$username不存在,无需停用"
        fi

    # 3. 离校日期超过4周:删除用户(-r选项同时删除家目录)
    elif [[ "$leave_date" <= "$four_weeks_ago" ]]; then
        if id "$username" &>/dev/null; then
            userdel -r "$username"
            echo "已删除用户:$username"
        else
            echo "用户$username不存在,无需删除"
        fi
    fi

done < <(cat file.csv | sed 1d)  # sed 1d用于跳过第一行表头,不需要就去掉

# 恢复原始IFS
IFS=$OLDIFS

关键部分解释

  1. 日期处理:

    • date +%Y-%m-%d:把当前日期转换成YYYY-MM-DD格式,方便字符串直接比较
    • date -d "4 weeks ago" +%Y-%m-%d:计算出4周前的日期,用来判断是否需要删除用户
  2. 用户存在性检查:

    • id "$username" &>/dev/null:检查用户是否存在,不存在时返回非0值;&>/dev/null是把输出和错误信息都丢弃,避免干扰脚本输出
  3. 用户操作命令:

    • useradd:和你原来的命令一致,添加了存在性检查,避免重复创建报错
    • usermod -L:锁定(停用)用户,用户将无法登录
    • userdel -r:删除用户并同时删除其家目录,如果你不想删家目录可以去掉-r
  4. 跳过表头和空行:

    • sed 1d:跳过CSV的第一行(表头),如果你的CSV没有表头,直接改成< file.csv即可
    • [ -z "$firstname" ] && continue:跳过空行,防止CSV末尾的空行导致变量为空引发错误

如果你CSV的日期格式不是YYYY-MM-DD怎么办?

比如你的日期是DD/MM/YYYY格式,可以用date命令转换成YYYY-MM-DD:

# 把DD/MM/YYYY转换成YYYY-MM-DD
leave_date_converted=$(date -d "${leave_date//\//-}" +%Y-%m-%d)

然后在比较的时候用leave_date_converted代替leave_date即可。

测试建议

在正式运行脚本前,你可以先把useradd、usermod -L、userdel -r换成echo,先看看脚本会执行哪些操作,确认没问题再替换回真实命令:

# 比如把创建用户的行换成:
echo "将要创建用户:$username"

内容的提问来源于stack exchange,提问作者Chloe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:57:59