Shell脚本如何批量创建系统用户账号

wen 实用脚本 2

本文目录导读:

Shell脚本如何批量创建系统用户账号

  1. 方法1:使用用户列表文件
  2. 方法2:使用数组批量创建
  3. 方法3:批量创建带额外属性的用户
  4. 方法4:交互式批量创建
  5. 方法5:扩展功能脚本
  6. 使用方法
  7. 安全建议

我来介绍几种批量创建系统用户的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 "$@"

使用方法

  1. 基本使用

    # 创建用户列表文件
    echo "user1,password1" > users.txt
    # 运行脚本
    sudo ./create_users.sh users.txt
  2. 常用选项

    # 备份用户文件
    sudo ./advanced_create.sh users.txt
    # 交互式创建
    sudo ./interactive_create.sh
  3. 用户管理命令

    # 查看创建的用户
    grep -E '^(user[0-9]+)' /etc/passwd
    # 删除所有创建的用户
    for user in $(awk -F: '{print $1}' created_users.txt); do
        userdel -r "$user"
    done

安全建议

  1. 密码策略

    • 首次登录强制修改密码:chage -d 0 username
    • 设置密码过期时间:chage -M 90 username
  2. 权限控制

    • 仅root用户可执行
    • 日志文件权限:chmod 640 /var/log/user_*.log
    • 密码文件权限:chmod 600 /root/*.txt
  3. 审计

    • 记录所有操作日志
    • 定期检查用户状态
    • 备份重要配置文件

这些脚本可以根据实际需求进行调整和扩展。

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