本文目录导读:

我来介绍几种批量创建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 }}"
使用说明
- 基本使用:
# 给脚本执行权限 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
安全建议
-
密码管理:
- 使用强密码生成
- 立即更改默认密码
- 考虑使用SSH密钥认证
-
权限控制:
- 限制SSH登录的组
- 配置/etc/ssh/sshd_config
- 使用sudo控制权限
-
日志记录:
# 记录所有用户操作 echo "$(date) - 创建用户 $username" >> /var/log/user_creation.log
根据需要选择合适的脚本方法,建议在生产环境中使用Python或Ansible版本,因为它们有更好的错误处理和日志管理功能。