本文目录导读:

我来介绍几种批量创建系统用户的Shell脚本方法:
方法1:使用用户列表文件
准备用户文件
首先创建用户列表文件 users.txt:
user1,123456 user2,abcdef user3,pass123 user4,888888
批量创建脚本
#!/bin/bash
# 批量创建用户脚本
# 使用方法: ./create_users.sh [用户列表文件]
USER_FILE="${1:-users.txt}"
LOG_FILE="/var/log/user_creation.log"
# 检查root权限
if [ "$(id -u)" -ne 0 ]; then
echo "错误:请以root用户运行此脚本"
exit 1
fi
# 检查用户文件是否存在
if [ ! -f "$USER_FILE" ]; then
echo "错误:用户文件 $USER_FILE 不存在"
exit 1
fi
# 创建日志目录
mkdir -p "$(dirname "$LOG_FILE")"
echo "开始批量创建用户... $(date)" | tee -a "$LOG_FILE"
# 逐行读取并创建用户
while IFS=',' read -r username password; do
# 跳过空行和注释行
[ -z "$username" ] && continue
[[ "$username" == \#* ]] && continue
# 删除可能存在的空格
username=$(echo "$username" | tr -d ' ')
password=$(echo "$password" | tr -d ' ')
# 检查用户是否已存在
if id "$username" &>/dev/null; then
echo "用户 $username 已存在,跳过创建" | tee -a "$LOG_FILE"
continue
fi
# 创建用户
useradd -m -s /bin/bash "$username" 2>> "$LOG_FILE"
if [ $? -eq 0 ]; then
# 设置密码
echo "$username:$password" | chpasswd 2>> "$LOG_FILE"
if [ $? -eq 0 ]; then
echo "成功创建用户: $username" | tee -a "$LOG_FILE"
else
echo "警告:用户 $username 创建成功,但密码设置失败" | tee -a "$LOG_FILE"
fi
else
echo "错误:用户 $username 创建失败" | tee -a "$LOG_FILE"
fi
done < "$USER_FILE"
echo "批量创建用户完成!$(date)" | tee -a "$LOG_FILE"
方法2:使用数组批量创建
#!/bin/bash
# 使用数组批量创建用户
declare -A USERS=(
["alice"]="pass1"
["bob"]="pass2"
["charlie"]="pass3"
["david"]="pass4"
["eve"]="pass5"
)
SUFFIX="" # 可以设置后缀,如 _2024
for username in "${!USERS[@]}"; do
password="${USERS[$username]}"
full_username="${username}${SUFFIX}"
if id "$full_username" &>/dev/null; then
echo "用户 $full_username 已存在"
continue
fi
useradd -m -s /bin/bash "$full_username"
echo "$full_username:$password" | chpasswd
if [ $? -eq 0 ]; then
echo "创建用户 $full_username 成功"
fi
done
方法3:批量创建带额外属性的用户
#!/bin/bash
# 创建带额外属性的用户
USER_FILE="users_advanced.txt"
# 检查权限
if [ $EUID -ne 0 ]; then
echo "请以root身份运行"
exit 1
fi
# 创建用户函数
create_user_with_attrs() {
local username=$1
local password=$2
local group=$3
local uid=$4
local home_dir=$5
# 创建组(如果不存在)
if [ -n "$group" ] && ! getent group "$group" &>/dev/null; then
groupadd "$group"
fi
# 构建useradd命令
local cmd="useradd"
[ -n "$uid" ] && cmd="$cmd -u $uid"
[ -n "$group" ] && cmd="$cmd -g $group"
[ -n "$home_dir" ] && cmd="$cmd -d $home_dir -m"
cmd="$cmd -s /bin/bash $username"
# 执行创建
eval $cmd
if [ $? -eq 0 ]; then
echo "$username:$password" | chpasswd
echo "创建用户 $username 成功"
# 设置密码过期策略
chage -M 90 "$username" # 90天后密码过期
chage -d 0 "$username" # 强制首次登录改密码
fi
}
# 从CSV文件读取用户信息
while IFS=',' read -r username password group uid home_dir; do
[ -z "$username" ] && continue
create_user_with_attrs "$username" "$password" "$group" "$uid" "$home_dir"
done < "$USER_FILE"
方法4:交互式批量创建
#!/bin/bash
# 交互式批量创建用户
# 获取用户数量
read -p "请输入要创建的用户数量: " count
# 验证输入
if ! [[ "$count" =~ ^[0-9]+$ ]] || [ "$count" -le 0 ]; then
echo "请输入有效的正整数"
exit 1
fi
# 用户名前缀
read -p "请输入用户前缀(默认: user): " prefix
prefix=${prefix:-user}
# 初始密码
read -s -p "请输入初始密码: " password
echo
if [ -z "$password" ]; then
password="Default123!" # 默认密码
fi
echo "开始创建 $count 个用户..."
for i in $(seq 1 $count); do
username="${prefix}${i}"
# 创建用户
useradd -m -s /bin/bash "$username" 2>/dev/null
if [ $? -eq 0 ]; then
echo "$username:$password" | chpasswd
echo "创建用户 $username 成功"
else
if id "$username" &>/dev/null; then
echo "用户 $username 已存在"
else
echo "创建用户 $username 失败"
fi
fi
done
echo "创建完成!"
方法5:扩展功能脚本
#!/bin/bash
# 功能完善的批量创建用户脚本
CONFIG_FILE="/etc/user_batch_config"
LOG_FILE="/var/log/user_batch_$(date +%Y%m%d).log"
BACKUP_DIR="/root/user_backups"
# 日志函数
log() {
local level=$1
local message=$2
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $message" | tee -a "$LOG_FILE"
}
# 备份系统用户文件
backup_user_files() {
mkdir -p "$BACKUP_DIR"
local backup_file="$BACKUP_DIR/users_$(date +%Y%m%d_%H%M%S).tar.gz"
tar -czf "$backup_file" /etc/passwd /etc/shadow /etc/group /etc/gshadow 2>/dev/null
if [ $? -eq 0 ]; then
log "INFO" "系统用户文件备份到: $backup_file"
else
log "WARN" "备份失败"
fi
}
# 验证用户名
validate_username() {
local username=$1
# 只允许小写字母、数字、下划线、连字符
if [[ ! "$username" =~ ^[a-z_][a-z0-9_-]*$ ]]; then
return 1
fi
return 0
}
# 创建用户主函数
create_users_batch() {
local user_file=$1
# 检查root权限
if [ $EUID -ne 0 ]; then
log "ERROR" "需要root权限"
exit 1
fi
# 备份
backup_user_files
# 创建用户
while IFS=':' read -r username password extra; do
# 跳过注释和空行
[[ "$username" =~ ^#.*$ ]] && continue
[ -z "$username" ] && continue
# 验证用户名
if ! validate_username "$username"; then
log "WARN" "无效的用户名: $username"
continue
fi
# 检查用户是否存在
if id "$username" &>/dev/null; then
log "INFO" "用户 $username 已存在,跳过"
continue
fi
# 创建用户和主目录
useradd -m -s /bin/bash -c "Batch created user $username" "$username"
if [ $? -eq 0 ]; then
# 设置密码
if [ -z "$password" ]; then
password=$(openssl rand -base64 12)
fi
echo "$username:$password" | chpasswd
log "INFO" "用户 $username 创建成功"
echo "用户: $username, 密码: $password" >> "$BACKUP_DIR/credentials_$(date +%Y%m%d).txt"
else
log "ERROR" "用户 $username 创建失败"
fi
done < "$user_file"
}
# 生成随机密码
generate_random_password() {
openssl rand -base64 12 | tr -d '/+=' | cut -c1-12
}
# 主程序
main() {
# 创建备份目录
mkdir -p "$BACKUP_DIR"
if [ $# -eq 0 ]; then
echo "用法: $0 <用户文件>"
echo "用户文件格式: username:password 或 username:"
echo "如果密码为空,将自动生成"
exit 1
fi
if [ ! -f "$1" ]; then
echo "文件 $1 不存在"
exit 1
fi
create_users_batch "$1"
log "INFO" "批量创建完成!密码已保存到: $BACKUP_DIR/credentials_$(date +%Y%m%d).txt"
}
main "$@"
使用方法
-
基本使用:
# 创建用户列表文件 echo "user1,password1" > users.txt # 运行脚本 sudo ./create_users.sh users.txt
-
常用选项:
# 备份用户文件 sudo ./advanced_create.sh users.txt # 交互式创建 sudo ./interactive_create.sh
-
用户管理命令:
# 查看创建的用户 grep -E '^(user[0-9]+)' /etc/passwd # 删除所有创建的用户 for user in $(awk -F: '{print $1}' created_users.txt); do userdel -r "$user" done
安全建议
-
密码策略:
- 首次登录强制修改密码:
chage -d 0 username - 设置密码过期时间:
chage -M 90 username
- 首次登录强制修改密码:
-
权限控制:
- 仅root用户可执行
- 日志文件权限:
chmod 640 /var/log/user_*.log - 密码文件权限:
chmod 600 /root/*.txt
-
审计:
- 记录所有操作日志
- 定期检查用户状态
- 备份重要配置文件
这些脚本可以根据实际需求进行调整和扩展。