如何用脚本批量创建SSH账号?

wen 实用脚本 2

本文目录导读:

如何用脚本批量创建SSH账号?

  1. 确保在root权限下运行
  2. 或使用Python版本

我来介绍几种批量创建SSH账号的脚本方法:

方法1:使用Shell脚本

基本批量创建脚本

#!/bin/bash
# 批量创建SSH用户脚本
# 使用方法: ./create_ssh_users.sh users.txt
USER_FILE="users.txt"
# 检查用户文件是否存在
if [ ! -f "$USER_FILE" ]; then
    echo "错误: 用户文件 $USER_FILE 不存在"
    echo "请创建包含用户名列表的文件,每行一个用户名"
    exit 1
fi
# 设置默认密码
DEFAULT_PASSWORD="TempPass123!"
# 逐行读取用户文件
while read -r username; do
    # 跳过空行和注释
    if [[ -z "$username" ]] || [[ "$username" == \#* ]]; then
        continue
    fi
    # 检查用户是否已存在
    if id "$username" &>/dev/null; then
        echo "用户 $username 已存在,跳过"
        continue
    fi
    # 创建用户
    useradd -m -s /bin/bash "$username"
    # 设置密码
    echo "$username:$DEFAULT_PASSWORD" | chpasswd
    # 强制用户首次登录时修改密码
    passwd -e "$username"
    # 添加到SSH允许组(可选)
    usermod -aG sshusers "$username" 2>/dev/null
    echo "成功创建用户: $username"
done < "$USER_FILE"
echo "批量用户创建完成"

高级版本(带密码生成)

#!/bin/bash
# 生成随机密码
generate_password() {
    local length=${1:-12}
    openssl rand -base64 $((length * 3/4)) | tr -d '/+=' | head -c $length
}
# 创建用户和SSH密钥
create_user_with_ssh() {
    local username="$1"
    local ssh_dir="/home/$username/.ssh"
    # 创建用户
    useradd -m -s /bin/bash "$username"
    # 生成随机密码
    password=$(generate_password 16)
    echo "$username:$password" | chpasswd
    # 创建SSH目录
    mkdir -p "$ssh_dir"
    # 生成SSH密钥对
    ssh-keygen -t rsa -b 2048 -f "$ssh_dir/id_rsa" -N "" -C "$username@$(hostname)"
    # 设置公钥认证
    cp "$ssh_dir/id_rsa.pub" "$ssh_dir/authorized_keys"
    # 设置权限
    chmod 700 "$ssh_dir"
    chmod 600 "$ssh_dir/authorized_keys"
    chmod 600 "$ssh_dir/id_rsa"
    # 修改所有者
    chown -R "$username:$username" "$ssh_dir"
    # 输出用户信息
    echo "=============================="
    echo "用户名: $username"
    echo "密码: $password"
    echo "私钥位置: $ssh_dir/id_rsa"
    echo "=============================="
    # 保存用户信息到文件
    echo "$username:$password" >> users_credentials.txt
}
# 主程序
cat > users.txt << 'EOF'
# 每行一个用户名
user001
user002
user003
EOF
while read -r username; do
    if [[ -z "$username" ]] || [[ "$username" == \#* ]]; then
        continue
    fi
    create_user_with_ssh "$username"
done < users.txt

方法2:Python批量创建脚本

#!/usr/bin/env python3
import os
import subprocess
import string
import random
import json
from pathlib import Path
class SSHUserManager:
    def __init__(self):
        self.created_users = []
    def generate_password(self, length=16):
        """生成随机密码"""
        chars = string.ascii_letters + string.digits + '!@#$%^&*'
        return ''.join(random.choice(chars) for _ in range(length))
    def generate_ssh_key(self, username, key_dir):
        """生成SSH密钥对"""
        private_key = Path(key_dir) / "id_rsa"
        public_key = Path(key_dir) / "id_rsa.pub"
        cmd = [
            "ssh-keygen", "-t", "rsa", "-b", "2048",
            "-f", str(private_key),
            "-N", "",
            "-C", f"{username}@batch-creation"
        ]
        subprocess.run(cmd, check=True, capture_output=True)
        return private_key, public_key
    def create_user(self, username, user_dir="/home"):
        """创建单个SSH用户"""
        if os.path.exists(f"/home/{username}"):
            print(f"用户 {username} 已存在,跳过")
            return None
        # 创建系统用户
        password = self.generate_password()
        subprocess.run(["useradd", "-m", "-s", "/bin/bash", username], check=True)
        # 设置密码
        passwd_process = subprocess.Popen(
            ["chpasswd"],
            stdin=subprocess.PIPE,
            text=True
        )
        passwd_process.communicate(f"{username}:{password}")
        # 设置SSH目录
        home_dir = Path(f"/home/{username}")
        ssh_dir = home_dir / ".ssh"
        ssh_dir.mkdir(mode=0o700, exist_ok=True)
        # 生成SSH密钥
        try:
            private_key, public_key = self.generate_ssh_key(username, ssh_dir)
            # 设置authorized_keys
            authorized_keys = ssh_dir / "authorized_keys"
            authorized_keys.write_text(public_key.read_text())
            authorized_keys.chmod(0o600)
            # 设置权限
            for item in [ssh_dir, private_key, public_key]:
                item.chown(int(uid))
        except subprocess.CalledProcessError as e:
            print(f"SSH密钥生成失败: {e}")
        user_info = {
            "username": username,
            "password": password,
            "home_dir": str(home_dir),
            "ssh_key": str(private_key if 'private_key' in locals() else "N/A")
        }
        self.created_users.append(user_info)
        return user_info
    def batch_create_users(self, user_list_file):
        """批量创建用户"""
        users = []
        # 读取用户列表
        with open(user_list_file, 'r') as f:
            users = [line.strip() for line in f 
                    if line.strip() and not line.startswith('#')]
        print(f"准备创建 {len(users)} 个用户")
        for username in users:
            try:
                user_info = self.create_user(username)
                if user_info:
                    print(f"✓ 创建用户 {username} 成功")
            except Exception as e:
                print(f"✗ 创建用户 {username} 失败: {e}")
        # 保存用户信息
        if self.created_users:
            with open("created_users.json", "w") as f:
                json.dump(self.created_users, f, indent=2)
            print(f"\n已保存 {len(self.created_users)} 个用户信息到 created_users.json")
def main():
    manager = SSHUserManager()
    # 创建用户列表文件
    users = [f"ssh_user_{i:03d}" for i in range(1, 11)]
    with open("users_to_create.txt", "w") as f:
        f.write("# 批量创建SSH用户列表\n")
        f.write("# 格式: 每行一个用户名\n\n")
        for user in users:
            f.write(f"{user}\n")
    # 批量创建用户
    manager.batch_create_users("users_to_create.txt")
if __name__ == "__main__":
    main()

方法3:使用Ansible批量管理

inventory.yml

all:
  hosts:
    localhost:
      ansible_connection: local
  vars:
    users:
      - { name: "user1", uid: 1001 }
      - { name: "user2", uid: 1002 }
      - { name: "user3", uid: 1003 }

create_users.yml

---
- name: 批量创建SSH用户
  hosts: all
  become: yes
  vars_files:
    - password_vars.yml
  tasks:
    - name: 创建系统用户
      user:
        name: "{{ item.name }}"
        uid: "{{ item.uid }}"
        shell: /bin/bash
        create_home: yes
        password: "{{ default_password | password_hash('sha512') }}"
        update_password: always
      loop: "{{ users }}"
    - name: 设置SSH目录
      file:
        path: "/home/{{ item.name }}/.ssh"
        state: directory
        mode: '0700'
        owner: "{{ item.name }}"
        group: "{{ item.name }}"
      loop: "{{ users }}"
    - name: 添加公钥
      authorized_key:
        user: "{{ item.name }}"
        key: "{{ lookup('file', 'keys/' + item.name + '.pub') }}"
      loop: "{{ users }}"

使用说明

  1. 基本使用
    # 给脚本执行权限
    chmod +x create_ssh_users.sh

确保在root权限下运行

sudo ./create_ssh_users.sh

或使用Python版本

python3 create_ssh_users.py


2. **用户列表文件格式**(users.txt):
```text
# 注释行以#开头
# 每行一个用户名
admin1
devops1
developer1
tester1

安全建议

  1. 密码管理

    • 使用强密码生成
    • 立即更改默认密码
    • 考虑使用SSH密钥认证
  2. 权限控制

    • 限制SSH登录的组
    • 配置/etc/ssh/sshd_config
    • 使用sudo控制权限
  3. 日志记录

    # 记录所有用户操作
    echo "$(date) - 创建用户 $username" >> /var/log/user_creation.log

根据需要选择合适的脚本方法,建议在生产环境中使用Python或Ansible版本,因为它们有更好的错误处理和日志管理功能。

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