本文目录导读:

我来介绍几种批量删除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参数自动确认,或者先列出用户确认无误再执行
建议先在测试环境验证脚本,确认无误后再在生产环境使用。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播