本文目录导读:

我来帮你写一个自动删除临时用户的脚本,这里提供几个不同场景的脚本方案:
方案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
使用说明
-
保存脚本:
sudo vi /usr/local/bin/cleanup_temp_users.sh
-
添加执行权限:
sudo chmod +x /usr/local/bin/cleanup_temp_users.sh
-
测试运行:
# 预览模式 sudo ./cleanup_temp_users.sh temp_ 24 true # 实际运行 sudo ./cleanup_temp_users.sh
注意事项
- 备份重要数据:测试前建议先备份
- 使用预览模式:先用
dry-run模式检查会删除哪些用户 - 确保权限:需要使用 root 权限运行
- 日志记录:建议使用方案3的日志版本
- 定义明确规则:确保临时用户的命名规则一致
根据需要选择合适的版本使用,建议先用方案4的预览模式测试效果。