批量添加或删除用户脚本

wen 实用脚本 2

本文目录导读:

批量添加或删除用户脚本

  1. Linux/Unix 版本 (bash)
  2. Windows 版本 (PowerShell)
  3. 用户文件格式示例
  4. 使用方法
  5. 安全特性

我来帮你创建一个批量添加或删除用户的脚本,这里提供两个版本:Linux/Unix 版本和 Windows 版本。

Linux/Unix 版本 (bash)

#!/bin/bash
# 批量用户管理脚本
# 支持批量添加和删除用户
# 日志文件
LOG_FILE="/var/log/user_management.log"
# 临时文件
TEMP_FILE="/tmp/user_management_$$.tmp"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 显示帮助信息
show_help() {
    echo "批量用户管理脚本"
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  -a, --add FILE         从文件批量添加用户"
    echo "  -d, --delete FILE      从文件批量删除用户"
    echo "  -g, --generate N       生成包含 N 个用户的模板文件"
    echo "  -p, --password PASS    设置默认密码(不指定则随机生成)"
    echo "  -s, --shell SHELL      设置默认shell(默认/bin/bash)"
    echo "  -h, --help             显示此帮助信息"
    echo ""
    echo "用户文件格式(每行一个用户):"
    echo "  用户名:用户组:全名:备注"
    echo "   user1:users:张三:普通用户"
}
# 记录日志
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
# 生成随机密码
generate_password() {
    openssl rand -base64 12 2>/dev/null || date +%s | sha256sum | base64 | head -c 16
}
# 生成模板文件
generate_template() {
    local count=$1
    local file="users_template_$(date +%Y%m%d).txt"
    echo "# 用户模板文件" > "$file"
    echo "# 格式: 用户名:用户组:全名:备注" >> "$file"
    echo "# 生成时间: $(date)" >> "$file"
    echo "" >> "$file"
    for ((i=1; i<=count; i++)); do
        echo "user${i}:users:用户${i}:自动生成用户" >> "$file"
    done
    echo -e "${GREEN}模板文件已生成: ${file}${NC}"
    echo "请编辑文件后使用 -a 选项批量添加用户"
}
# 批量添加用户
add_users() {
    local file=$1
    local default_password=$2
    local default_shell=$3
    local success_count=0
    local fail_count=0
    if [[ ! -f "$file" ]]; then
        echo -e "${RED}错误: 文件 $file 不存在${NC}"
        exit 1
    fi
    echo "开始批量添加用户..."
    log_message "开始批量添加用户,文件: $file"
    while IFS=: read -r username group fullname desc; do
        # 跳过空行和注释行
        [[ -z "$username" || "$username" =~ ^# ]] && continue
        # 检查用户是否已存在
        if id "$username" &>/dev/null; then
            echo -e "${YELLOW}用户 $username 已存在,跳过${NC}"
            log_message "用户 $username 已存在,跳过"
            ((fail_count++))
            continue
        fi
        # 检查用户组是否存在,不存在则创建
        if [[ -n "$group" ]] && ! getent group "$group" &>/dev/null; then
            groupadd "$group"
            echo "创建用户组: $group"
        fi
        # 设置全名和备注的默认值
        [[ -z "$fullname" ]] && fullname="$username"
        [[ -z "$desc" ]] && desc="批量创建用户"
        # 生成或使用指定密码
        if [[ -z "$default_password" ]]; then
            password=$(generate_password)
        else
            password="$default_password"
        fi
        # 创建用户
        if useradd -m -s "${default_shell:-/bin/bash}" -g "${group:-users}" \
                  -c "$fullname,$desc" "$username" 2>/dev/null; then
            # 设置密码
            echo "$username:$password" | chpasswd
            # 强制首次登录修改密码
            chage -d 0 "$username"
            # 设置密码过期策略(可选)
            chage -M 90 -W 7 "$username"
            echo -e "${GREEN}成功添加用户: $username${NC}"
            log_message "成功添加用户: $username, 组: ${group:-users}, 密码: $password"
            # 保存用户和密码信息
            echo "$username:$password" >> "/tmp/user_passwords_$(date +%Y%m%d).txt"
            ((success_count++))
        else
            echo -e "${RED}失败添加用户: $username${NC}"
            log_message "失败添加用户: $username"
            ((fail_count++))
        fi
    done < "$file"
    echo ""
    echo "========== 添加完成 =========="
    echo -e "${GREEN}成功: $success_count 个用户${NC}"
    echo -e "${RED}失败/跳过: $fail_count 个用户${NC}"
    echo "密码文件: /tmp/user_passwords_$(date +%Y%m%d).txt"
    echo "日志文件: $LOG_FILE"
}
# 批量删除用户
delete_users() {
    local file=$1
    local success_count=0
    local fail_count=0
    if [[ ! -f "$file" ]]; then
        echo -e "${RED}错误: 文件 $file 不存在${NC}"
        exit 1
    fi
    # 确认操作
    echo -e "${YELLOW}警告: 此操作将永久删除用户及其主目录!${NC}"
    read -p "确定要继续吗? (y/N): " confirm
    if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
        echo "操作取消"
        exit 0
    fi
    echo "开始批量删除用户..."
    log_message "开始批量删除用户,文件: $file"
    while IFS=: read -r username rest; do
        # 跳过空行和注释行
        [[ -z "$username" || "$username" =~ ^# ]] && continue
        # 检查用户是否存在
        if ! id "$username" &>/dev/null; then
            echo -e "${YELLOW}用户 $username 不存在,跳过${NC}"
            ((fail_count++))
            continue
        fi
        # 保护系统用户
        if [[ "$username" =~ ^(root|bin|daemon|sys|sync|games|man|lp|mail|news|uucp|proxy|www-data|backup|list|irc|gnats|nobody)$ ]]; then
            echo -e "${RED}拒绝删除系统用户: $username${NC}"
            ((fail_count++))
            continue
        fi
        # 获取用户主目录
        user_home=$(getent passwd "$username" | cut -d: -f6)
        # 删除用户
        if userdel -r "$username" 2>/dev/null; then
            echo -e "${GREEN}成功删除用户: $username${NC}"
            echo "  主目录: $user_home 已删除"
            log_message "成功删除用户: $username, 主目录: $user_home"
            ((success_count++))
        else
            echo -e "${RED}失败删除用户: $username${NC}"
            log_message "失败删除用户: $username"
            ((fail_count++))
        fi
    done < "$file"
    echo ""
    echo "========== 删除完成 =========="
    echo -e "${GREEN}成功: $success_count 个用户${NC}"
    echo -e "${RED}失败/跳过: $fail_count 个用户${NC}"
    echo "日志文件: $LOG_FILE"
}
# 主程序
main() {
    # 检查是否root用户
    if [[ $EUID -ne 0 ]]; then
        echo -e "${RED}错误: 此脚本需要root权限运行${NC}"
        exit 1
    fi
    # 确保日志目录存在
    mkdir -p "$(dirname "$LOG_FILE")"
    # 解析参数
    if [[ $# -eq 0 ]]; then
        show_help
        exit 0
    fi
    while [[ $# -gt 0 ]]; do
        case $1 in
            -a|--add)
                ADD_FILE="$2"
                shift 2
                ;;
            -d|--delete)
                DELETE_FILE="$2"
                shift 2
                ;;
            -g|--generate)
                GENERATE_COUNT="$2"
                shift 2
                ;;
            -p|--password)
                DEFAULT_PASSWORD="$2"
                shift 2
                ;;
            -s|--shell)
                DEFAULT_SHELL="$2"
                shift 2
                ;;
            -h|--help)
                show_help
                exit 0
                ;;
            *)
                echo -e "${RED}未知选项: $1${NC}"
                show_help
                exit 1
                ;;
        esac
    done
    # 执行相应的操作
    if [[ -n "$GENERATE_COUNT" ]]; then
        generate_template "$GENERATE_COUNT"
    fi
    if [[ -n "$ADD_FILE" ]]; then
        add_users "$ADD_FILE" "$DEFAULT_PASSWORD" "$DEFAULT_SHELL"
    fi
    if [[ -n "$DELETE_FILE" ]]; then
        delete_users "$DELETE_FILE"
    fi
    # 清理临时文件
    rm -f "$TEMP_FILE"
}
# 运行主程序
main "$@"

Windows 版本 (PowerShell)

# 批量用户管理脚本 (Windows)
# 需要以管理员权限运行
param(
    [Parameter(Mandatory=$false)]
    [string]$Action,
    [Parameter(Mandatory=$false)]
    [string]$File,
    [Parameter(Mandatory=$false)]
    [string]$Password,
    [Parameter(Mandatory=$false)]
    [int]$Generate = 0
)
# 颜色设置
$Host.UI.RawUI.ForegroundColor = 'Green'
# 日志函数
function Write-Log {
    param([string]$Message)
    $logDate = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
    "$logDate - $Message" | Out-File -FilePath "C:\Temp\user_management.log" -Append
}
# 生成随机密码
function Generate-Password {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*"
    return -join ((1..12) | ForEach { Get-Random -Maximum $chars.Length | ForEach { $chars[$_] } })
}
# 生成模板文件
function Generate-Template {
    param([int]$Count)
    $templateFile = "users_template_$(Get-Date -Format 'yyyyMMdd').txt"
    $content = @"
# 用户模板文件
# 格式: 用户名|用户组|全名|备注
# 生成时间: $(Get-Date)
"@
    for ($i = 1; $i -le $Count; $i++) {
        $content += "user$i|Users|用户$i|自动生成用户`n"
    }
    $content | Out-File -FilePath $templateFile -Encoding UTF8
    Write-Host "模板文件已生成: $templateFile" -ForegroundColor Green
}
# 添加用户
function Add-UsersFromFile {
    param([string]$FilePath, [string]$DefaultPassword)
    $successCount = 0
    $failCount = 0
    $passwordFile = "C:\Temp\user_passwords_$(Get-Date -Format 'yyyyMMdd').txt"
    if (-not (Test-Path $FilePath)) {
        Write-Host "错误: 文件 $FilePath 不存在" -ForegroundColor Red
        return
    }
    Write-Host "开始批量添加用户..." -ForegroundColor Yellow
    Get-Content $FilePath | ForEach-Object {
        $line = $_.Trim()
        # 跳过空行和注释
        if ($line -eq "" -or $line.StartsWith("#")) { return }
        $parts = $line -split '\|'
        $username = $parts[0]
        $group = $parts[1]
        $fullname = if ($parts[2]) { $parts[2] } else { $username }
        $description = if ($parts[3]) { $parts[3] } else { "批量创建用户" }
        # 检查用户是否已存在
        if (Get-LocalUser -Name $username -ErrorAction SilentlyContinue) {
            Write-Host "用户 $username 已存在,跳过" -ForegroundColor Yellow
            $failCount++
            return
        }
        # 设置密码
        if ($DefaultPassword) {
            $password = $DefaultPassword
        } else {
            $password = Generate-Password
        }
        $securePassword = ConvertTo-SecureString $password -AsPlainText -Force
        try {
            # 创建用户
            New-LocalUser -Name $username -Password $securePassword -FullName $fullname -Description $description
            # 添加到用户组
            if ($group) {
                $groupExist = Get-LocalGroup -Name $group -ErrorAction SilentlyContinue
                if (-not $groupExist) {
                    New-LocalGroup -Name $group
                    Write-Host "创建用户组: $group" -ForegroundColor Green
                }
                Add-LocalGroupMember -Group $group -Member $username
            }
            Write-Host "成功添加用户: $username" -ForegroundColor Green
            Write-Log "成功添加用户: $username, 组: $group"
            # 保存密码信息
            "$username|$password" | Out-File -FilePath $passwordFile -Append
            $successCount++
        }
        catch {
            Write-Host "失败添加用户: $username - $($_.Exception.Message)" -ForegroundColor Red
            Write-Log "失败添加用户: $username - $($_.Exception.Message)"
            $failCount++
        }
    }
    Write-Host "`n========== 添加完成 ==========" -ForegroundColor Cyan
    Write-Host "成功: $successCount 个用户" -ForegroundColor Green
    Write-Host "失败/跳过: $failCount 个用户" -ForegroundColor Red
    Write-Host "密码文件: $passwordFile"
}
# 删除用户
function Remove-UsersFromFile {
    param([string]$FilePath)
    $successCount = 0
    $failCount = 0
    if (-not (Test-Path $FilePath)) {
        Write-Host "错误: 文件 $FilePath 不存在" -ForegroundColor Red
        return
    }
    # 确认操作
    Write-Host "警告: 此操作将永久删除用户!" -ForegroundColor Yellow
    $confirm = Read-Host "确定要继续吗? (y/N)"
    if ($confirm -ne "y" -and $confirm -ne "Y") {
        Write-Host "操作取消"
        return
    }
    Write-Host "开始批量删除用户..." -ForegroundColor Yellow
    Get-Content $FilePath | ForEach-Object {
        $line = $_.Trim()
        if ($line -eq "" -or $line.StartsWith("#")) { return }
        $username = ($line -split '\|')[0]
        # 保护系统用户
        if ($username -in @("Administrator", "Guest", "DefaultAccount")) {
            Write-Host "拒绝删除系统用户: $username" -ForegroundColor Red
            $failCount++
            return
        }
        # 检查用户是否存在
        if (-not (Get-LocalUser -Name $username -ErrorAction SilentlyContinue)) {
            Write-Host "用户 $username 不存在,跳过" -ForegroundColor Yellow
            $failCount++
            return
        }
        try {
            Remove-LocalUser -Name $username
            Write-Host "成功删除用户: $username" -ForegroundColor Green
            Write-Log "成功删除用户: $username"
            $successCount++
        }
        catch {
            Write-Host "失败删除用户: $username" -ForegroundColor Red
            Write-Log "失败删除用户: $username - $($_.Exception.Message)"
            $failCount++
        }
    }
    Write-Host "`n========== 删除完成 ==========" -ForegroundColor Cyan
    Write-Host "成功: $successCount 个用户" -ForegroundColor Green
    Write-Host "失败/跳过: $failCount 个用户" -ForegroundColor Red
}
# 显示帮助
function Show-Help {
    Write-Host "批量用户管理脚本" -ForegroundColor Cyan
    Write-Host "用法: .\user_manager.ps1 [选项]" -ForegroundColor Cyan
    Write-Host ""
    Write-Host "选项:"
    Write-Host "  -Action add     批量添加用户"
    Write-Host "  -Action delete  批量删除用户"
    Write-Host "  -File FILE      用户文件路径"
    Write-Host "  -Password PASS  默认密码(不指定则随机生成)"
    Write-Host "  -Generate N     生成包含 N 个用户的模板文件"
    Write-Host ""
    Write-Host "用户文件格式(每行一个用户):"
    Write-Host "  用户名|用户组|全名|备注"
}
# 主程序
# 检查管理员权限
if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Host "错误: 此脚本需要管理员权限运行" -ForegroundColor Red
    exit 1
}
# 确保日志目录存在
New-Item -ItemType Directory -Force -Path "C:\Temp" | Out-Null
# 执行操作
if ($Generate -gt 0) {
    Generate-Template -Count $Generate
}
if ($Action -eq "add") {
    Add-UsersFromFile -FilePath $File -DefaultPassword $Password
}
elseif ($Action -eq "delete") {
    Remove-UsersFromFile -FilePath $File
}
else {
    Show-Help
}

用户文件格式示例

创建 users.txt 文件:

# 批量用户管理文件
# 格式: 用户名:用户组:全名:备注 (Linux)
# 或 用户名|用户组|全名|备注 (Windows)
john:users:John Smith:技术支持
mary:developers:Mary Johnson:开发部门
tom:testers:Tom Wilson:测试部门
alice:designers:Alice Brown:设计部门
bob:developers:Bob Davis:开发部门

使用方法

Linux 版本:

# 赋予执行权限
chmod +x user_manager.sh
# 生成 10 个用户的模板
sudo ./user_manager.sh -g 10
# 批量添加用户(随机密码)
sudo ./user_manager.sh -a users.txt
# 批量添加用户(指定密码)
sudo ./user_manager.sh -a users.txt -p "MyPassword123!"
# 批量删除用户
sudo ./user_manager.sh -d users.txt
# 显示帮助
./user_manager.sh -h

Windows 版本:

# 以管理员身份运行 PowerShell
# 生成模板文件
.\user_manager.ps1 -Generate 10
# 批量添加用户
.\user_manager.ps1 -Action add -File users.txt
# 批量添加用户(指定密码)
.\user_manager.ps1 -Action add -File users.txt -Password "MyPassword123!"
# 批量删除用户
.\user_manager.ps1 -Action delete -File users.txt
# 显示帮助
.\user_manager.ps1

安全特性

  1. 密码保护:自动生成强密码并保存到单独文件
  2. 强制改密:首次登录强制修改密码
  3. 日志记录:所有操作都记录到日志文件
  4. 系统用户保护:拒绝删除系统关键用户
  5. 操作确认:删除操作需要确认
  6. 权限检查:需要管理员权限才能运行

有任何字段名或其他需求需要调整,请告诉我!

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