本文目录导读:

我来介绍几种批量删除SSH账号的脚本方法:
方法1:使用Shell脚本批量删除(推荐)
1 从文件读取用户列表删除
#!/bin/bash
# 创建用户列表文件 userlist.txt
# 每行一个用户名
# user1
# user2
# user3
USER_FILE="userlist.txt"
if [ ! -f "$USER_FILE" ]; then
echo "错误:用户列表文件 $USER_FILE 不存在"
exit 1
fi
echo "开始批量删除SSH用户..."
while IFS= read -r username; do
# 跳过空行和注释行
[[ -z "$username" || "$username" =~ ^# ]] && continue
# 检查用户是否存在
if id "$username" &>/dev/null; then
echo "正在删除用户: $username"
# 结束用户所有进程
pkill -u "$username" 2>/dev/null
# 删除用户及其家目录
userdel -r "$username" 2>/dev/null
if [ $? -eq 0 ]; then
echo "✓ 用户 $username 已成功删除"
else
echo "✗ 用户 $username 删除失败"
fi
else
echo "⚠ 用户 $username 不存在,跳过"
fi
done < "$USER_FILE"
echo "批量删除操作完成!"
2 删除指定前缀的所有用户
#!/bin/bash
# 删除以特定前缀开头的所有用户
PREFIX="sshuser_"
echo "将删除所有以 '$PREFIX' 开头的用户"
echo "正在扫描用户..."
# 获取所有匹配的用户
users=$(awk -F: -v prefix="$PREFIX" '$1 ~ "^"prefix {print $1}' /etc/passwd)
if [ -z "$users" ]; then
echo "未找到匹配的用户"
exit 0
fi
for username in $users; do
echo "正在删除: $username"
pkill -u "$username" 2>/dev/null
userdel -r "$username"
if [ $? -eq 0 ]; then
echo "✓ $username 已删除"
else
echo "✗ $username 删除失败"
fi
done
3 带确认和批量删除脚本
#!/bin/bash
# 批量删除SSH用户 - 带确认功能
show_help() {
echo "用法: $0 [选项]"
echo "选项:"
echo " -f FILE 从文件读取用户列表"
echo " -p PREFIX 删除指定前缀的用户"
echo " -l 列出所有SSH用户"
echo " -y 自动确认(跳过确认提示)"
echo " -h 显示帮助信息"
exit 0
}
# 列出所有能够登录SSH的用户
list_ssh_users() {
echo "当前SSH可登录用户:"
awk -F: '($7 == "/bin/bash" || $7 == "/bin/sh" || $7 == "/usr/bin/bash") {print $1}' /etc/passwd
exit 0
}
AUTO_CONFIRM=false
USER_FILE=""
PREFIX=""
while getopts "f:p:lyh" opt; do
case $opt in
f) USER_FILE="$OPTARG" ;;
p) PREFIX="$OPTARG" ;;
l) list_ssh_users ;;
y) AUTO_CONFIRM=true ;;
h) show_help ;;
*) show_help ;;
esac
done
# 准备要删除的用户列表
delete_users=()
if [ -n "$USER_FILE" ]; then
while IFS= read -r username; do
[[ -z "$username" || "$username" =~ ^# ]] && continue
delete_users+=("$username")
done < "$USER_FILE"
elif [ -n "$PREFIX" ]; then
delete_users=($(awk -F: -v prefix="$PREFIX" '$1 ~ "^"prefix {print $1}' /etc/passwd))
else
echo "请指定用户列表文件(-f)或前缀(-p)"
show_help
fi
if [ ${#delete_users[@]} -eq 0 ]; then
echo "没有找到要删除的用户"
exit 0
fi
# 显示要删除的用户
echo "以下用户将被删除:"
printf '%s\n' "${delete_users[@]}"
# 确认删除
if [ "$AUTO_CONFIRM" = false ]; then
read -p "确定要删除这些用户吗?(y/n): " confirm
if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
echo "操作已取消"
exit 0
fi
fi
# 执行删除
echo "开始删除用户..."
for username in "${delete_users[@]}"; do
if id "$username" &>/dev/null; then
echo "删除用户: $username"
pkill -u "$username" 2>/dev/null
userdel -rf "$username" 2>/dev/null
if [ $? -eq 0 ]; then
echo "✓ $username 删除成功"
else
echo "✗ $username 删除失败"
fi
else
echo "⚠ $username 不存在"
fi
done
echo "批量删除完成!"
方法2:Python脚本(更灵活)
#!/usr/bin/env python3
import subprocess
import sys
import os
import pwd
def delete_user(username):
"""
删除指定用户
"""
try:
# 结束用户进程
subprocess.run(['pkill', '-u', username],
capture_output=True,
check=False)
# 删除用户
result = subprocess.run(['userdel', '-rf', username],
capture_output=True,
text=True)
if result.returncode == 0:
return True, f"用户 {username} 删除成功"
else:
return False, f"用户 {username} 删除失败: {result.stderr.strip()}"
except Exception as e:
return False, f"用户 {username} 删除异常: {str(e)}"
def batch_delete(file_path=None, prefix=None):
"""
批量删除用户
"""
users_to_delete = []
# 从文件读取
if file_path:
if not os.path.exists(file_path):
print(f"文件 {file_path} 不存在")
return False
with open(file_path, 'r') as f:
for line in f:
username = line.strip()
if username and not username.startswith('#'):
users_to_delete.append(username)
# 按前缀匹配
if prefix:
try:
for user in pwd.getpwall():
if user.pw_name.startswith(prefix):
users_to_delete.append(user.pw_name)
except:
print("读取用户列表失败")
return False
if not users_to_delete:
print("没有找到要删除的用户")
return False
# 显示要删除的用户
print(f"将删除以下 {len(users_to_delete)} 个用户:")
for user in users_to_delete:
print(f" - {user}")
# 确认
confirm = input("确认删除?(y/n): ").lower()
if confirm != 'y':
print("操作取消")
return False
# 执行删除
success_count = 0
fail_count = 0
for username in users_to_delete:
success, message = delete_user(username)
print(message)
if success:
success_count += 1
else:
fail_count += 1
print(f"\n操作完成: 成功 {success_count}, 失败 {fail_count}")
return True
if __name__ == "__main__":
if len(sys.argv) < 2:
print("用法:")
print(" python delete_users.py -f userlist.txt # 从文件读取")
print(" python delete_users.py -p prefix_ # 按前缀匹配")
print(" python delete_users.py -l # 列出所有用户")
sys.exit(1)
if sys.argv[1] == "-f" and len(sys.argv) > 2:
batch_delete(file_path=sys.argv[2])
elif sys.argv[1] == "-p" and len(sys.argv) > 2:
batch_delete(prefix=sys.argv[2])
elif sys.argv[1] == "-l":
for user in pwd.getpwall():
if user.pw_shell in ['/bin/bash', '/bin/sh', '/usr/bin/bash']:
print(user.pw_name)
else:
print("无效参数")
sys.exit(1)
方法3:一条命令批量删除
# 从文件删除
for user in $(cat userlist.txt); do userdel -rf "$user" 2>/dev/null; done
# 删除特定前缀的用户
for user in $(grep "^prefix_" /etc/passwd | cut -d: -f1); do userdel -rf "$user"; done
# 删除所有UID大于1000的普通用户(谨慎使用)
for user in $(awk -F: '$3>=1000 && $3!=65534 {print $1}' /etc/passwd); do
userdel -rf "$user"
done
使用前的准备工作
-
备份重要数据:
# 备份passwd文件 cp /etc/passwd /etc/passwd.bak cp /etc/shadow /etc/shadow.bak cp /etc/group /etc/group.bak
-
创建用户列表文件:
cat > /tmp/users_to_delete.txt << 'EOF' # 每行一个用户名 testuser1 testuser2 testuser3 EOF
-
设置脚本权限并执行:
chmod +x delete_ssh_users.sh sudo ./delete_ssh_users.sh -f /tmp/users_to_delete.txt
重要注意事项
- 必须使用root权限执行这些脚本
- 谨慎操作,删除用户无法恢复
- 建议先备份 /etc/passwd, /etc/shadow, /etc/group 文件
- 确保要删除的用户没有重要数据,
-r参数会删除家目录和邮件 - 可以先测试,使用
-y参数自动确认,或者先列出用户确认无误再执行
建议先在测试环境验证脚本,确认无误后再在生产环境使用。