如何写一个脚本自动删除临时用户

wen 实用脚本 3

本文目录导读:

如何写一个脚本自动删除临时用户

  1. 方案1:基础版 - 删除特定前缀的临时用户
  2. 方案2:高级版 - 根据创建时间清理
  3. 方案3:定时任务版 - 配合 cron 使用
  4. 方案4:带参数配置的灵活版本
  5. 配置定时任务 (cron)
  6. 使用说明
  7. 注意事项

我来帮你写一个自动删除临时用户的脚本,这里提供几个不同场景的脚本方案:

方案1:基础版 - 删除特定前缀的临时用户

#!/bin/bash
# 自动删除临时用户脚本
# 功能:删除所有以 temp_ 开头的用户
# 定义临时用户前缀
TEMP_USER_PREFIX="temp_"
echo "开始清理临时用户..."
# 获取所有以 temp_ 开头的用户
temp_users=$(getent passwd | grep "^${TEMP_USER_PREFIX}" | cut -d: -f1)
if [ -z "$temp_users" ]; then
    echo "没有找到临时用户"
    exit 0
fi
# 删除每个临时用户
for user in $temp_users; do
    echo "正在删除用户: $user"
    # 终止用户的所有进程
    pkill -u "$user" 2>/dev/null
    # 删除用户及其家目录
    userdel -rf "$user" 2>/dev/null
    if [ $? -eq 0 ]; then
        echo "✓ 已删除用户: $user"
    else
        echo "✗ 删除用户失败: $user"
    fi
done
echo "清理完成"

方案2:高级版 - 根据创建时间清理

#!/bin/bash
# 自动删除创建超过指定时间的临时用户
# 配置项
TEMP_USER_PREFIX="temp_"
MAX_AGE_HOURS=24  # 用户最大存在时间(小时)
echo "开始清理过期临时用户(超过${MAX_AGE_HOURS}小时)..."
# 获取当前时间戳
current_time=$(date +%s)
max_age_seconds=$((MAX_AGE_HOURS * 3600))
# 遍历所有临时用户
for user in $(getent passwd | grep "^${TEMP_USER_PREFIX}" | cut -d: -f1); do
    # 获取用户的创建时间
    user_home=$(getent passwd "$user" | cut -d: -f6)
    if [ -d "$user_home" ]; then
        # 使用家目录的创建时间作为参考
        create_time=$(stat -c %Y "$user_home" 2>/dev/null)
        age=$((current_time - create_time))
        if [ $age -gt $max_age_seconds ]; then
            echo "删除过期用户: $user (存在时间: $((age / 3600))小时)"
            # 终止进程并删除用户
            pkill -u "$user" 2>/dev/null
            userdel -rf "$user" 2>/dev/null
            if [ $? -eq 0 ]; then
                echo "✓ 已删除"
            else
                echo "✗ 删除失败"
            fi
        fi
    fi
done
echo "清理完成"

方案3:定时任务版 - 配合 cron 使用

#!/bin/bash
# 配置
TEMP_USER_PREFIX="temp_"
MAX_AGE_HOURS=24
LOG_FILE="/var/log/cleanup_temp_users.log"
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
cleanup_temp_users() {
    local current_time=$(date +%s)
    local max_age_seconds=$((MAX_AGE_HOURS * 3600))
    local deleted_count=0
    local failed_count=0
    log_message "开始清理临时用户..."
    for user in $(getent passwd | grep "^${TEMP_USER_PREFIX}" | cut -d: -f1); do
        local user_home=$(getent passwd "$user" | cut -d: -f6)
        if [ -d "$user_home" ]; then
            local create_time=$(stat -c %Y "$user_home" 2>/dev/null)
            local age=$((current_time - create_time))
            if [ $age -gt $max_age_seconds ]; then
                # 尝试终止用户进程
                pkill -u "$user" 2>/dev/null
                # 删除用户
                if userdel -rf "$user" 2>/dev/null; then
                    log_message "已删除用户: $user"
                    ((deleted_count++))
                else
                    log_message "删除失败: $user"
                    ((failed_count++))
                fi
            fi
        fi
    done
    log_message "清理完成: 删除 ${deleted_count} 个用户, 失败 ${failed_count} 个"
}
# 运行清理
cleanup_temp_users

方案4:带参数配置的灵活版本

#!/bin/bash
# 配置参数
PREFIX="${1:-temp_}"           # 用户前缀,默认 temp_
AGE_LIMIT="${2:-24}"           # 时间限制,默认24小时
DRY_RUN="${3:-false}"         # 是否只预览不执行
usage() {
    echo "用法: $0 [前缀] [小时数] [dry-run]"
    echo "示例:"
    echo "  $0                    # 删除所有以 temp_ 开头、超过24小时的用户"
    echo "  $0 guest_ 48          # 删除所有以 guest_ 开头、超过48小时的用户"
    echo "  $0 temp_ 24 true      # 预览模式,不实际删除"
    exit 1
}
# 检查参数
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
    usage
fi
echo "=== 临时用户清理工具 ==="
echo "用户前缀: $PREFIX"
echo "最大小时数: $AGE_LIMIT"
echo "预览模式: $DRY_RUN"
echo ""
current_time=$(date +%s)
max_age_seconds=$((AGE_LIMIT * 3600))
# 查找并处理临时用户
for user in $(getent passwd | grep "^${PREFIX}" | cut -d: -f1); do
    user_home=$(getent passwd "$user" | cut -d: -f6)
    if [ -d "$user_home" ]; then
        create_time=$(stat -c %Y "$user_home" 2>/dev/null)
        age=$((current_time - create_time))
        age_hours=$((age / 3600))
        if [ $age -gt $max_age_seconds ]; then
            echo "用户: $user"
            echo "  家目录: $user_home"
            echo "  活跃时间: ${age_hours}小时"
            if [ "$DRY_RUN" = "true" ]; then
                echo "  [预览模式] 将删除此用户"
            else
                echo "  正在删除..."
                pkill -u "$user" 2>/dev/null
                if userdel -rf "$user" 2>/dev/null; then
                    echo "  删除成功"
                else
                    echo "  删除失败"
                fi
            fi
            echo ""
        fi
    fi
done
echo "操作完成"

配置定时任务 (cron)

将脚本添加到 crontab 定期执行:

# 编辑 crontab
crontab -e
# 添加以下内容(每天凌晨2点执行)
0 2 * * * /usr/local/bin/cleanup_temp_users.sh
# 或每6小时执行一次
0 */6 * * * /usr/local/bin/cleanup_temp_users.sh

使用说明

  1. 保存脚本

    sudo vi /usr/local/bin/cleanup_temp_users.sh
  2. 添加执行权限

    sudo chmod +x /usr/local/bin/cleanup_temp_users.sh
  3. 测试运行

    # 预览模式
    sudo ./cleanup_temp_users.sh temp_ 24 true
    # 实际运行
    sudo ./cleanup_temp_users.sh

注意事项

  1. 备份重要数据:测试前建议先备份
  2. 使用预览模式:先用 dry-run 模式检查会删除哪些用户
  3. 确保权限:需要使用 root 权限运行
  4. 日志记录:建议使用方案3的日志版本
  5. 定义明确规则:确保临时用户的命名规则一致

根据需要选择合适的版本使用,建议先用方案4的预览模式测试效果。

抱歉,评论功能暂时关闭!