linux shell

关注公众号 jb51net

关闭
首页 > 脚本专栏 > linux shell > Linux Shell脚本创建用户与设置密码

Linux Shell脚本批量创建用户与设置密码的方法

作者:Jinkxs

在现代 Linux 系统管理中,批量创建用户并设置初始密码是一项基础而高频的任务,本文将深入探讨如何通过 Shell 脚本实现这一目标,并结合 Java 示例代码展示跨语言集成的可能性,最后提供完整的生产环境部署建议,需要的朋友可以参考下

在现代 Linux 系统管理中,批量创建用户并设置初始密码是一项基础而高频的任务。无论是学校机房、企业服务器群、云计算平台还是 DevOps 流水线,都离不开高效、安全、可审计的用户批量管理机制。本文将深入探讨如何通过 Shell 脚本实现这一目标,并结合 Java 示例代码展示跨语言集成的可能性,最后提供完整的生产环境部署建议。

为什么需要批量创建用户?

在传统手动操作中,管理员使用 useraddpasswd 命令逐个添加用户,不仅效率低下,而且容易出错。想象一下:你需要为 200 名新生创建 Linux 实验账号,每个账号都要设置独立密码、分配主目录、指定 shell、加入特定组……手动操作可能耗费数小时,还可能因疲劳导致拼写错误或权限配置失误。

动操作的风险包括:

  • 密码设置错误或遗漏
  • 用户名拼写不一致
  • 权限配置不当引发安全漏洞
  • 缺乏操作日志,事后难以追溯

通过脚本自动化,我们可以在几秒钟内完成全部工作,并确保一致性、可重复性和安全性。

基础 Shell 脚本实现

让我们从最简单的脚本开始,逐步完善功能。

#!/bin/bash
# batch_user_create.sh - 最基础版本

echo "正在创建用户..."

useradd alice
echo "alice:MyPass123" | chpasswd

useradd bob
echo "bob:MyPass123" | chpasswd

useradd charlie
echo "charlie:MyPass123" | chpasswd

echo "✅ 用户创建完成!"

这个脚本虽然能工作,但存在明显问题:

我们需要一个更健壮、灵活、安全的版本。

进阶版:读取配置文件 + 自动生成密码

改进思路:

  1. 从外部文件读取用户名列表
  2. 为每个用户生成随机密码
  3. 记录用户名和密码到加密日志
  4. 添加错误检查和日志输出
#!/bin/bash
# advanced_batch_user.sh

CONFIG_FILE="users.txt"
LOG_FILE="user_creation.log"
PASSWORD_FILE="passwords.csv"

# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
    echo "❌ 配置文件 $CONFIG_FILE 不存在!"
    exit 1
fi

# 清空或创建日志文件
> "$LOG_FILE"
> "$PASSWORD_FILE"

echo "用户名,初始密码" > "$PASSWORD_FILE"

echo "🚀 开始批量创建用户..." | tee -a "$LOG_FILE"

# 逐行读取用户名
while IFS= read -r username; do
    # 跳过空行和注释行
    [[ -z "$username" || "$username" =~ ^[[:space:]]*# ]] && continue
    
    # 生成随机密码(8位字母+数字)
    password=$(openssl rand -base64 6 | tr -d '+/=' | cut -c1-8)
    
    # 创建用户
    if useradd -m -s /bin/bash "$username" 2>/dev/null; then
        # 设置密码
        echo "$username:$password" | chpasswd 2>/dev/null
        
        if [ $? -eq 0 ]; then
            echo "✅ 成功创建用户: $username" | tee -a "$LOG_FILE"
            echo "$username,$password" >> "$PASSWORD_FILE"
        else
            echo "❌ 无法为用户 $username 设置密码" | tee -a "$LOG_FILE"
        fi
    else
        echo "❌ 无法创建用户: $username" | tee -a "$LOG_FILE"
    fi
    
done < "$CONFIG_FILE"

echo "🎉 批量用户创建完成!" | tee -a "$LOG_FILE"
echo "🔑 密码已保存至 $PASSWORD_FILE,请妥善保管并尽快分发给用户。"

对应的 users.txt 内容示例:

# 学生用户名列表
student001
student002
student003
teacher_zhang
admin_wang

安全加固版本

上述脚本仍有安全隐患:密码以明文形式存储在 CSV 文件中。我们可以进一步改进:

#!/bin/bash
# secure_batch_user.sh

set -e  # 遇错即停

CONFIG_FILE=${1:-"users.txt"}
LOG_DIR="./logs"
OUTPUT_DIR="./output"
DATE_SUFFIX=$(date +%Y%m%d_%H%M%S)

mkdir -p "$LOG_DIR" "$OUTPUT_DIR"

LOG_FILE="$LOG_DIR/user_creation_$DATE_SUFFIX.log"
PASSWORD_FILE="$OUTPUT_DIR/passwords_$DATE_SUFFIX.enc"
REPORT_FILE="$OUTPUT_DIR/report_$DATE_SUFFIX.txt"

ENCRYPTION_KEY="your-secret-key-here"  # 生产环境应从安全位置读取

log_info() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] $1" | tee -a "$LOG_FILE"
}

log_error() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] $1" | tee -a "$LOG_FILE"
}

generate_secure_password() {
    # 生成包含大小写字母、数字、特殊字符的12位密码
    openssl rand -base64 15 | tr -dc 'A-Za-z0-9!@#$%^&*()' | fold -w 12 | head -n 1
}

encrypt_data() {
    echo "$1" | openssl enc -aes-256-cbc -salt -pbkdf2 -pass pass:"$ENCRYPTION_KEY" -base64
}

create_user_with_validation() {
    local username="$1"
    
    # 验证用户名格式
    if [[ ! "$username" =~ ^[a-z_][a-z0-9_-]{0,31}$ ]]; then
        log_error "用户名 '$username' 格式无效"
        return 1
    fi
    
    # 检查用户是否已存在
    if id "$username" &>/dev/null; then
        log_error "用户 '$username' 已存在,跳过创建"
        return 1
    fi
    
    # 生成密码
    local password=$(generate_secure_password)
    
    # 创建用户
    if useradd -m -s /bin/bash -c "Batch created user" "$username"; then
        echo "$username:$password" | chpasswd
        
        if [ $? -eq 0 ]; then
            # 加密存储密码
            local encrypted_pass=$(encrypt_data "$password")
            echo "$username,$encrypted_pass" >> "$PASSWORD_FILE"
            
            # 生成人类可读报告(不包含密码)
            echo "用户: $username, 状态: 创建成功, 创建时间: $(date)" >> "$REPORT_FILE"
            
            log_info "用户 $username 创建成功"
            return 0
        else
            log_error "无法为用户 $username 设置密码"
            return 1
        fi
    else
        log_error "无法创建用户: $username"
        return 1
    fi
}

main() {
    log_info "=== 批量用户创建系统启动 ==="
    log_info "配置文件: $CONFIG_FILE"
    
    if [ ! -f "$CONFIG_FILE" ]; then
        log_error "配置文件不存在: $CONFIG_FILE"
        exit 1
    fi
    
    local success_count=0
    local total_count=0
    
    while IFS= read -r line; do
        # 跳过空行和注释
        [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
        
        total_count=$((total_count + 1))
        username=$(echo "$line" | xargs)  # 去除首尾空白
        
        if create_user_with_validation "$username"; then
            success_count=$((success_count + 1))
        fi
        
    done < "$CONFIG_FILE"
    
    log_info "=== 执行统计 ==="
    log_info "总用户数: $total_count"
    log_info "成功创建: $success_count"
    log_info "失败数量: $((total_count - success_count))"
    
    if [ $success_count -gt 0 ]; then
        log_info "加密密码文件: $PASSWORD_FILE"
        log_info "执行报告: $REPORT_FILE"
        log_info "✅ 批量创建任务完成!"
    else
        log_error "❌ 所有用户创建均失败!"
        exit 1
    fi
}

# 执行主函数
main "$@"

与 Java 应用集成

在企业环境中,用户管理系统往往基于 Java 构建。我们可以通过 Java 调用 Shell 脚本来实现集成。

Java 调用 Shell 脚本示例

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class BatchUserManager {
    private static final String SCRIPT_PATH = "/opt/scripts/secure_batch_user.sh";
    private static final String USERS_FILE_PATH = "/tmp/users_";
    public static class UserCreationResult {
        public boolean success;
        public String message;
        public String reportPath;
        public String encryptedPasswordPath;
        public UserCreationResult(boolean success, String message) {
            this.success = success;
            this.message = message;
        }
    }
    /**
     * 批量创建用户
     * @param usernames 用户名列表
     * @return 创建结果
     */
    public static UserCreationResult batchCreateUsers(List<String> usernames) {
        if (usernames == null || usernames.isEmpty()) {
            return new UserCreationResult(false, "用户名列表为空");
        }
        // 生成临时用户文件
        String tempUsersFile = USERS_FILE_PATH + UUID.randomUUID().toString() + ".txt";
        try {
            // 写入用户名到临时文件
            StringBuilder content = new StringBuilder();
            for (String username : usernames) {
                content.append(username).append("\n");
            }
            Files.write(Paths.get(tempUsersFile), content.toString().getBytes());
            // 构建执行命令
            ProcessBuilder pb = new ProcessBuilder(SCRIPT_PATH, tempUsersFile);
            pb.redirectErrorStream(true); // 合并错误流和输出流
            Process process = pb.start();
            // 读取输出
            BufferedReader reader = new BufferedReader(
                new InputStreamReader(process.getInputStream())
            );
            List<String> outputLines = new ArrayList<>();
            String line;
            while ((line = reader.readLine()) != null) {
                outputLines.add(line);
                System.out.println(line); // 实时输出
            }
            int exitCode = process.waitFor();
            // 清理临时文件
            Files.deleteIfExists(Paths.get(tempUsersFile));
            if (exitCode == 0) {
                // 解析输出查找生成的文件路径
                UserCreationResult result = new UserCreationResult(true, "用户创建成功");
                for (String outLine : outputLines) {
                    if (outLine.contains("加密密码文件:")) {
                        result.encryptedPasswordPath = outLine.split("加密密码文件:")[1].trim();
                    } else if (outLine.contains("执行报告:")) {
                        result.reportPath = outLine.split("执行报告:")[1].trim();
                    }
                }
                return result;
            } else {
                return new UserCreationResult(false, "脚本执行失败,退出码: " + exitCode);
            }
        } catch (Exception e) {
            return new UserCreationResult(false, "执行异常: " + e.getMessage());
        }
    }
    /**
     * 解密用户密码(仅供授权人员使用)
     * @param encryptedPassword 加密后的密码
     * @param encryptionKey 加密密钥
     * @return 解密后的密码
     */
    public static String decryptPassword(String encryptedPassword, String encryptionKey) {
        try {
            ProcessBuilder pb = new ProcessBuilder(
                "openssl", "enc", "-d", "-aes-256-cbc", 
                "-pbkdf2", "-base64", "-pass", "pass:" + encryptionKey
            );
            Process process = pb.start();
            // 写入加密数据
            OutputStream stdin = process.getOutputStream();
            stdin.write(encryptedPassword.getBytes());
            stdin.close();
            // 读取解密结果
            BufferedReader reader = new BufferedReader(
                new InputStreamReader(process.getInputStream())
            );
            StringBuilder decrypted = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                decrypted.append(line);
            }
            int exitCode = process.waitFor();
            if (exitCode == 0) {
                return decrypted.toString();
            } else {
                throw new RuntimeException("解密失败,退出码: " + exitCode);
            }
        } catch (Exception e) {
            throw new RuntimeException("解密异常: " + e.getMessage(), e);
        }
    }
    // 测试方法
    public static void main(String[] args) {
        List<String> users = List.of(
            "dev_john",
            "dev_mary",
            "qa_team",
            "ops_admin"
        );
        System.out.println("🚀 开始批量创建用户...");
        UserCreationResult result = batchCreateUsers(users);
        if (result.success) {
            System.out.println("✅ 用户创建成功!");
            System.out.println("📄 报告文件: " + result.reportPath);
            System.out.println("🔐 加密密码文件: " + result.encryptedPasswordPath);
            // 示例:如何解密第一个用户的密码
            // 注意:实际应用中应通过安全渠道获取加密密钥
            // String decryptedPass = decryptPassword(encryptedData, "your-secret-key");
            // System.out.println("🔓 解密后的密码: " + decryptedPass);
        } else {
            System.out.println("❌ 用户创建失败: " + result.message);
        }
    }
}

Spring Boot 集成示例

如果你使用 Spring Boot,可以创建一个 REST API 来管理用户创建:

import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;
import java.util.List;
@RestController
@RequestMapping("/api/users")
public class UserController {
    @PostMapping("/batch-create")
    public ResponseEntity<?> batchCreateUsers(@RequestBody List<String> usernames) {
        try {
            BatchUserManager.UserCreationResult result = 
                BatchUserManager.batchCreateUsers(usernames);
            if (result.success) {
                return ResponseEntity.ok()
                    .body(Map.of(
                        "success", true,
                        "message", "用户创建成功",
                        "reportPath", result.reportPath,
                        "encryptedPasswordPath", result.encryptedPasswordPath
                    ));
            } else {
                return ResponseEntity.badRequest()
                    .body(Map.of("success", false, "message", result.message));
            }
        } catch (Exception e) {
            return ResponseEntity.internalServerError()
                .body(Map.of("success", false, "message", "系统错误: " + e.getMessage()));
        }
    }
    @GetMapping("/decrypt-password")
    public ResponseEntity<?> decryptPassword(
            @RequestParam String encryptedData,
            @RequestParam String key) {
        // 在实际应用中,这里应该有严格的权限验证
        // 且不应通过API参数传递密钥
        try {
            String decrypted = BatchUserManager.decryptPassword(encryptedData, key);
            return ResponseEntity.ok()
                .body(Map.of("success", true, "decryptedPassword", decrypted));
        } catch (Exception e) {
            return ResponseEntity.badRequest()
                .body(Map.of("success", false, "message", "解密失败: " + e.getMessage()));
        }
    }
}

高级功能扩展

1. 用户组管理

# 在创建用户时分配到特定组
GROUP_NAME="students"

# 创建组(如果不存在)
getent group "$GROUP_NAME" >/dev/null || groupadd "$GROUP_NAME"

# 创建用户并加入组
useradd -m -s /bin/bash -G "$GROUP_NAME" "$username"

2. 配额限制

# 为用户设置磁盘配额
QUOTA_LIMIT="1G"

# 创建用户后设置配额
setquota -u "$username" "$QUOTA_LIMIT" "$QUOTA_LIMIT" 0 0 /home

3. SSH 密钥自动部署

# 为用户生成SSH密钥对
ssh-keygen -t rsa -b 4096 -f "/home/$username/.ssh/id_rsa" -N "" -C "$username@$(hostname)"

# 设置正确权限
chown -R "$username:$username" "/home/$username/.ssh"
chmod 700 "/home/$username/.ssh"
chmod 600 "/home/$username/.ssh/id_rsa"
chmod 644 "/home/$username/.ssh/id_rsa.pub"

4. 自动发送欢迎邮件

send_welcome_email() {
    local username="$1"
    local password="$2"
    local email="$3"
    
    cat << EOF | mail -s "您的Linux账户已创建" "$email"
亲爱的用户,

您的Linux系统账户已成功创建:

用户名: $username
初始密码: $password

请登录后立即修改密码:passwd

系统地址: $(hostname -f)
SSH端口: 22

如有问题,请联系系统管理员。

祝您使用愉快!

系统管理员团队
$(date)
EOF
}

测试与验证

单元测试脚本

#!/bin/bash
# test_batch_user.sh

TEST_DIR="/tmp/batch_user_test_$(date +%s)"
mkdir -p "$TEST_DIR"

cleanup() {
    echo "🧹 清理测试环境..."
    cd /tmp
    rm -rf "$TEST_DIR"
    # 删除测试用户
    for i in {1..5}; do
        userdel -r "testuser$i" 2>/dev/null || true
    done
}

trap cleanup EXIT

echo "🧪 开始测试批量用户创建脚本..."

# 创建测试用户文件
cat > "$TEST_DIR/test_users.txt" << EOF
testuser1
testuser2
testuser3
testuser4
testuser5
EOF

# 执行脚本
echo "🚀 执行批量创建..."
./secure_batch_user.sh "$TEST_DIR/test_users.txt"

# 验证用户是否创建成功
echo "🔍 验证创建结果..."
SUCCESS_COUNT=0
for i in {1..5}; do
    if id "testuser$i" >/dev/null 2>&1; then
        echo "✅ 用户 testuser$i 存在"
        SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
        
        # 验证主目录
        if [ -d "/home/testuser$i" ]; then
            echo "   📁 主目录存在"
        else
            echo "   ❌ 主目录不存在"
        fi
        
        # 验证shell
        SHELL=$(getent passwd "testuser$i" | cut -d: -f7)
        if [ "$SHELL" = "/bin/bash" ]; then
            echo "   🐚 Shell设置正确"
        else
            echo "   ❌ Shell设置错误: $SHELL"
        fi
    else
        echo "❌ 用户 testuser$i 不存在"
    fi
done

echo "📊 测试统计: 成功 $SUCCESS_COUNT/5"

if [ $SUCCESS_COUNT -eq 5 ]; then
    echo "🎉 所有测试通过!"
    exit 0
else
    echo "❌ 测试失败!"
    exit 1
fi

生产环境部署建议

1. 权限控制

# 设置脚本权限
chmod 700 secure_batch_user.sh
chown root:root secure_batch_user.sh

# 使用sudoers配置,限制特定用户执行
# 在 /etc/sudoers 中添加:
# adminuser ALL=(root) NOPASSWD: /opt/scripts/secure_batch_user.sh

2. 日志轮转

创建 /etc/logrotate.d/batch_user

/opt/scripts/logs/user_creation_*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 644 root root
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

3. 监控与告警

# 添加到cron定时检查
# 每天检查是否有失败的用户创建
0 8 * * * /opt/scripts/check_failed_creations.sh

# check_failed_creations.sh 内容
#!/bin/bash
LOG_DIR="/opt/scripts/logs"
TODAY_LOG="$LOG_DIR/user_creation_$(date +%Y%m%d)*.log"

if [ -f "$TODAY_LOG" ]; then
    ERROR_COUNT=$(grep -c "\[ERROR\]" "$TODAY_LOG")
    if [ $ERROR_COUNT -gt 0 ]; then
        echo "⚠️ 今日有 $ERROR_COUNT 个用户创建错误" | mail -s "用户创建告警" admin@company.com
    fi
fi

故障排查指南

常见错误及解决方案

错误1:useradd: cannot open /etc/passwd

# 原因:/etc/passwd 文件被锁定或权限问题
# 解决:
ls -l /etc/passwd
# 应该是 -rw-r--r-- 1 root root
# 如果被锁定:
lsof /etc/passwd  # 查看哪个进程在使用
# 重启相关服务或等待锁释放

错误2:chpasswd: (user) pam_chauthtok() failed

# 原因:密码策略限制(如长度、复杂度)
# 解决:
# 1. 检查密码策略
cat /etc/security/pwquality.conf
# 2. 临时放宽策略或生成符合要求的密码
# 3. 修改脚本中的密码生成逻辑

错误3:Permission denied

# 原因:脚本没有足够权限
# 解决:
# 使用sudo执行
sudo ./secure_batch_user.sh users.txt

# 或者配置sudoers免密码执行
visudo
# 添加:username ALL=(ALL) NOPASSWD: /full/path/to/script.sh

性能优化技巧

对于大规模用户创建(1000+),考虑以下优化:

1. 并行处理

#!/bin/bash
# parallel_batch_user.sh

MAX_JOBS=10  # 最大并发数

create_single_user() {
    local username="$1"
    local password_file="$2"
    
    password=$(openssl rand -base64 8 | tr -d '+/=')
    
    if useradd -m -s /bin/bash "$username" 2>/dev/null && \
       echo "$username:$password" | chpasswd 2>/dev/null; then
        echo "$username,$password" >> "$password_file"
        return 0
    else
        return 1
    fi
}

export -f create_single_user

# 使用GNU parallel进行并行处理
cat users.txt | parallel -j $MAX_JOBS create_single_user {} "passwords_$(date +%s).csv"

2. 批量数据库操作

# 对于需要同步到数据库的场景
# 先收集所有要创建的用户,然后批量插入

USERS_TO_CREATE=()
while read -r username; do
    [[ -z "$username" || "$username" =~ ^# ]] && continue
    USERS_TO_CREATE+=("$username")
done < users.txt

# 批量创建SQL
echo "BEGIN TRANSACTION;" > batch_insert.sql
for username in "${USERS_TO_CREATE[@]}"; do
    echo "INSERT INTO users (username, status) VALUES ('$username', 'pending');" >> batch_insert.sql
done
echo "COMMIT;" >> batch_insert.sql

# 执行批量插入
mysql -u user -p database < batch_insert.sql

最佳实践总结

  1. 安全第一:永远不要在脚本中硬编码密码,使用随机生成和加密存储
  2. 原子操作:确保每个用户创建是独立的,一个失败不应影响其他用户
  3. 完整日志:记录所有操作和错误,便于审计和故障排查
  4. 输入验证:严格验证用户名格式,防止注入攻击
  5. 权限最小化:脚本应以最小必要权限运行
  6. 定期清理:设置日志和临时文件的自动清理机制
  7. 备份恢复:在执行前备份关键系统文件(/etc/passwd, /etc/shadow)
  8. 测试先行:在生产环境前充分测试脚本
  9. 文档齐全:为脚本编写详细的使用说明和参数文档
  10. 监控告警:建立完善的监控体系,及时发现和处理异常

未来发展方向

随着技术演进,批量用户管理也在不断发展:

1. 容器化部署

# Dockerfile
FROM ubuntu:20.04

RUN apt-get update && apt-get install -y \
    openssl \
    openssh-server \
    && rm -rf /var/lib/apt/lists/*

COPY secure_batch_user.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/secure_batch_user.sh

VOLUME ["/data"]
WORKDIR /data

ENTRYPOINT ["/usr/local/bin/secure_batch_user.sh"]

2. Kubernetes Job

apiVersion: batch/v1
kind: Job
metadata:
  name: batch-user-creation
spec:
  template:
    spec:
      containers:
      - name: user-creator
        image: your-registry/batch-user-creator:latest
        command: ["./secure_batch_user.sh", "/data/users.txt"]
        volumeMounts:
        - name: user-data
          mountPath: /data
      volumes:
      - name: user-data
        persistentVolumeClaim:
          claimName: user-data-pvc
      restartPolicy: Never
  backoffLimit: 4

3. 云原生集成

// AWS Lambda 版本
public class BatchUserLambda implements RequestHandler<Map<String, Object>, String> {
    @Override
    public String handleRequest(Map<String, Object> event, Context context) {
        List<String> usernames = (List<String>) event.get("usernames");
        // 调用EC2实例上的脚本或直接使用AWS Systems Manager
        AWSSystemsManager ssm = AWSSystemsManagerClientBuilder.defaultClient();
        SendCommandRequest request = new SendCommandRequest()
            .withInstanceIds("i-xxxxxxxxxxxx")
            .withDocumentName("AWS-RunShellScript")
            .withParameters(Collections.singletonMap(
                "commands", Arrays.asList(
                    "cd /opt/scripts",
                    "./secure_batch_user.sh /tmp/dynamic_users.txt"
                )
            ));
        SendCommandResult result = ssm.sendCommand(request);
        return "Command sent: " + result.getCommand().getCommandId();
    }
}

结语

批量创建用户看似简单,实则涉及系统安全、性能优化、错误处理、日志审计等多个方面。通过本文介绍的 Shell 脚本方案和 Java 集成示例,你可以构建一个既强大又安全的自动化用户管理系统。

记住,自动化不是目的,而是手段。真正的价值在于提高效率的同时保证系统的稳定性和安全性。希望本文能为你在 Linux 系统管理的道路上提供有价值的参考和帮助。

以上就是Linux Shell脚本批量创建用户与设置密码的方法的详细内容,更多关于Linux Shell脚本创建用户与设置密码的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文