如何用脚本批量创建FTP账号?完整指南与实战代码
📚 目录导读
为什么需要批量创建FTP账号?
在企业运维场景中,当需要为几十甚至上百名用户、合作伙伴或项目成员开通FTP访问权限时,手动逐条创建账号不仅效率低下,还容易因人为疏忽导致配置错误(如权限设置不一致、目录路径错乱等)。脚本批量创建能实现:

- 自动化:一次编写,多次执行。
- 标准化:确保所有账号遵循相同的目录结构、权限策略和密码规则。
- 可审计:生成操作日志,便于后续排查。
- 节省时间:手动创建100个账号约需2-3小时,脚本只需3秒。
准备工作:环境与依赖
1 操作系统与FTP服务
本文以 CentOS 7/8 + vsftpd 为例(Ubuntu系统逻辑类似,仅包名略有差异),需已安装vsftpd:
sudo yum install vsftpd -y # CentOS sudo apt-get install vsftpd -y # Ubuntu
2 准备用户列表文件
创建一个 user_list.txt 文件,每行格式为:用户名 密码 家目录路径(以空格或Tab分隔),示例:
ftpuser1 Pass@123 /data/ftp/users/ftpuser1
ftpuser2 Pass@456 /data/ftp/users/ftpuser2
ftpuser3 Pass@789 /data/ftp/users/ftpuser3
注意:密码建议用
mkpasswd或openssl预加密,避免明文传输。
方法一:Shell脚本批量创建(推荐)
1 脚本核心逻辑
- 读取
user_list.txt。 - 调用
useradd创建系统用户(vsftpd可基于系统用户或虚拟用户)。 - 设置密码并使用
chpasswd加密写入。 - 创建家目录并设置权限(750,属主为对应用户)。
- 限制用户只能通过FTP访问(
usermod -s /sbin/nologin)。
2 完整脚本源码
#!/bin/bash
# batch_create_ftp_users.sh
FTP_BASE_DIR="/data/ftp/users"
USER_LIST="user_list.txt"
# 检查依赖
if ! command -v mkpasswd &> /dev/null; then
echo "正在安装mkpasswd..." ; yum install -y expect
fi
while IFS=' ' read -r username passwd homedir; do
# 跳过空行和注释
[[ -z "$username" || "$username" == \#* ]] && continue
# 检查用户是否存在
if id "$username" &>/dev/null; then
echo "警告:用户 $username 已存在,跳过创建"
continue
fi
# 创建系统用户
useradd -d "$FTP_BASE_DIR/$username" -s /sbin/nologin -m "$username"
# 设置密码(使用chpasswd加密)
echo "$username:$passwd" | chpasswd
# 创建家目录(如果useradd未自动创建)
mkdir -p "$FTP_BASE_DIR/$username"
chown -R "$username:$username" "$FTP_BASE_DIR/$username"
chmod 750 "$FTP_BASE_DIR/$username"
echo "成功创建FTP账号:$username"
done < "$USER_LIST"
echo "所有账号创建完成!共处理 $(wc -l < "$USER_LIST") 个条目。"
3 如何运行?
chmod +x batch_create_ftp_users.sh sudo ./batch_create_ftp_users.sh
方法二:Python脚本实现跨平台管理
如果FTP服务运行在Windows Server(如FileZilla Server)或需要更复杂的逻辑(如随机密码生成、数据库存储),推荐使用Python。
1 脚本特点
- 自动生成12位随机密码(包含大小写字母+数字+特殊字符)。
- 支持Windows/Linux双平台。
- 通过
subprocess调用系统命令或直接操作FTP服务配置文件。
2 示例代码(Linux + vsftpd)
#!/usr/bin/env python3
# batch_create_ftp.py
import os, subprocess, string, random
def generate_password(length=12):
chars = string.ascii_letters + string.digits + "@#$!"
return ''.join(random.choice(chars) for _ in range(length))
def create_ftp_user(username, base_dir="/data/ftp/users"):
password = generate_password()
home_dir = f"{base_dir}/{username}"
# 创建系统用户
subprocess.run(["useradd", "-d", home_dir, "-s", "/sbin/nologin", username], check=True)
# 设置密码
proc = subprocess.Popen(["chpasswd"], stdin=subprocess.PIPE)
proc.communicate(input=f"{username}:{password}".encode())
# 创建目录
os.makedirs(home_dir, exist_ok=True)
os.chown(home_dir, uid := pwd.getpwnam(username).pw_uid, gid := pwd.getpwnam(username).pw_gid)
os.chmod(home_dir, 0o750)
return username, password
# 批量创建:读取CSV或循环生成
users = ["dev01", "dev02", "market01"]
for user in users:
u, p = create_ftp_user(user)
print(f"用户:{u} | 密码:{p} | 保存此记录!")
补充:Windows环境下可用
wmi模块或直接调用net user命令创建本地账号。
常见问题与解答(FAQ)
Q1:创建的FTP账号无法登录,提示“530 Login incorrect”怎么办?
A:依次排查:
- 密码是否加密格式错误?用
chpasswd替代直接passwd传参。 - 检查vsfatpd配置:
/etc/vsftpd/vsftpd.conf,确保local_enable=YES,write_enable=YES。 - 重启服务:
systemctl restart vsftpd。
Q2:如何限制用户只能访问自己的家目录(chroot)?
A:在/etc/vsftpd/vsftpd.conf中设置:
chroot_local_user=YES
allow_writeable_chroot=YES
并确保家目录不可被属主以外的人写(即chmod 750)。
Q3:能否批量删除这些账号?
A:可以,编写相反脚本,循环读取用户列表,执行userdel -r $username(需谨慎!)。
Q4:密码如何记录与分发?
A:通过邮件或企业IM自动发送,或生成加密的CSV文件,切勿将明文密码写在脚本中,建议在脚本末尾将用户名密码输出到/root/ftp_accounts.csv并设置600权限。
安全注意事项与最佳实践
1 密码安全策略
- 使用
mkpasswd -l 16 -d 4生成复杂密码。 - 脚本运行后立即删除包含密码的临时文件。
- 强制用户首次登录修改密码(
chage -d 0 $username)。
2 访问控制
- 限制登录IP:在
/etc/hosts.allow和/etc/hosts.deny配置。 - 禁用匿名登录:
anonymous_enable=NO。 - 启用日志审计:
xferlog_enable=YES。
3 资源隔离
- 使用磁盘配额(
quota)限制每个用户的最大空间。 - 单独挂载FTP目录分区,防止系统盘被填满。
4 定期审计
- 每月运行脚本扫描未使用的账号(
userdel -r)。 - 检查
/var/log/vsftpd.log异常登录记录。
通过以上方法,你可以快速从手动操作中解脱出来。建议先在一台测试服务器上验证脚本,确认无误后再批量应用,根据实际需求选择Shell(简单快速)或Python(灵活跨平台)方案,配合规范的密码管理与权限控制,实现安全高效的FTP账号生命周期管理。