怎样用脚本批量删除SSH账号?

wen 实用脚本 1

本文目录导读:

怎样用脚本批量删除SSH账号?

  1. 方法1:使用Shell脚本批量删除(推荐)
  2. 方法2:Python脚本(更灵活)
  3. 方法3:一条命令批量删除
  4. 使用前的准备工作
  5. 重要注意事项

我来介绍几种批量删除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

使用前的准备工作

  1. 备份重要数据

    # 备份passwd文件
    cp /etc/passwd /etc/passwd.bak
    cp /etc/shadow /etc/shadow.bak
    cp /etc/group /etc/group.bak
  2. 创建用户列表文件

    cat > /tmp/users_to_delete.txt << 'EOF'
    # 每行一个用户名
    testuser1
    testuser2
    testuser3
    EOF
  3. 设置脚本权限并执行

    chmod +x delete_ssh_users.sh
    sudo ./delete_ssh_users.sh -f /tmp/users_to_delete.txt

重要注意事项

  1. 必须使用root权限执行这些脚本
  2. 谨慎操作,删除用户无法恢复
  3. 建议先备份 /etc/passwd, /etc/shadow, /etc/group 文件
  4. 确保要删除的用户没有重要数据-r参数会删除家目录和邮件
  5. 可以先测试,使用-y参数自动确认,或者先列出用户确认无误再执行

建议先在测试环境验证脚本,确认无误后再在生产环境使用。

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