Ubuntu 删除用户后的文档化与清理清单
一 文档化目标与范围
二 建议的文档模板
三 清理与验证要点清单
四 自动化脚本与留痕示例
#!/usr/bin/env bash
set -Eeuo pipefail
USERNAME="${1:-}"
[[ -z "$USERNAME" ]] && { echo "Usage: $0 <username>"; exit 1; }
LOGFILE="/var/log/user-decommission-$(date +%F).log"
BACKUP_BASE="/backup"
HOME_BACKUP="$BACKUP_BASE/home_${USERNAME}_$(date +%F).tar.gz"
MAIL_BACKUP="$BACKUP_BASE/mail_${USERNAME}_$(date +%F).tar.gz"
exec > >(tee -a "$LOGFILE") 2>&1
echo "=== 开始用户下线 [$USERNAME] 时间: $(date) 操作者: $SUDO_USER ==="
# 0) 备份
echo "[备份] 家目录 -> $HOME_BACKUP"
[[ -d "/home/$USERNAME" ]] && sudo tar czf "$HOME_BACKUP" -C /home "$USERNAME" || echo "[备份] 家目录不存在,跳过"
echo "[备份] 邮件 spool -> $MAIL_BACKUP"
{ sudo tar czf "$MAIL_BACKUP" -C /var/spool/mail "$USERNAME" 2>/dev/null || true; } && \
echo "[备份] 邮件备份完成" || echo "[备份] 邮件 spool 不存在或无权限,跳过"
# 1) 移除 sudo 权限
if getent group sudo | grep -q "\b$USERNAME\b"; then
echo "[权限] 从 sudo 组移除 $USERNAME"
sudo deluser "$USERNAME" sudo || true
fi
# 2) 删除用户(若未使用 --remove-home)
if id "$USERNAME" &>/dev/null; then
echo "[账户] 删除用户 $USERNAME"
sudo deluser --remove-home "$USERNAME" || sudo userdel -r "$USERNAME" || true
fi
# 3) 删除私有组(仅当组为空时)
if getent group "$USERNAME" >/dev/null; then
echo "[组] 尝试删除私有组 $USERNAME"
sudo delgroup "$USERNAME" 2>/dev/null || echo "[组] $USERNAME 组非空或非私有,跳过"
fi
# 4) 清理计划任务
echo "[任务] 清理 crontab"
sudo crontab -u "$USERNAME" -r 2>/dev/null || true
# 5) 清理 SSH 公钥(各主机 authorized_keys)
echo "[SSH] 清理 authorized_keys 引用"
sudo find /home /root -path "*/.ssh/authorized_keys" -type f -exec grep -l "$USERNAME" {} \; 2>/dev/null | \
while read keyfile; do
echo " - 清理 $keyfile 中的 $USERNAME 引用"
sudo sed -i "/$USERNAME/d" "$keyfile"
done || true
# 6) 清理临时文件
echo "[临时] 清理 /tmp /var/tmp 中 $USERNAME 相关"
sudo find /tmp /var/tmp -mindepth 1 -maxdepth 1 -name "*${USERNAME}*" -print -delete 2>/dev/null || true
# 7) 验证
echo "[验证] 身份查询"
! id "$USERNAME" &>/dev/null && echo " - id $USERNAME: 不存在(通过)" || echo " - id $USERNAME: 仍存在(需人工核查)"
echo "[验证] crontab"
sudo crontab -u "$USERNAME" -l &>/dev/null && echo " - crontab 仍存在(需人工核查)" || echo " - crontab 已清空(通过)"
echo "[验证] 邮件队列"
if command -v mailq &>/dev/null; then
mailq | grep -q "$USERNAME" && echo " - 邮件队列仍存在引用(需人工核查)" || echo " - 邮件队列无引用(通过)"
fi
echo "=== 完成 时间: $(date) 归档: $HOME_BACKUP, $MAIL_BACKUP 日志: $LOGFILE ==="
五 注意事项