本文目录导读:

我来帮你创建一个批量添加或删除用户的脚本,这里提供两个版本: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
安全特性
- 密码保护:自动生成强密码并保存到单独文件
- 强制改密:首次登录强制修改密码
- 日志记录:所有操作都记录到日志文件
- 系统用户保护:拒绝删除系统关键用户
- 操作确认:删除操作需要确认
- 权限检查:需要管理员权限才能运行
有任何字段名或其他需求需要调整,请告诉我!