一步部署FTP虚拟用户
#!/bin/bash
#vsftpd虚拟用户安装配置脚本
#日期:2025-03-24
#全局变量定义
VUSER_HOME="/data/ftp" VUSER_CONF_DIR="/etc/vsftpd/vsftpd_user_conf" VUSER_DB="/etc/vsftpd/vsftpd_login.db" VUSER_LIST="/etc/vsftpd/vusers.list" SYSTEM_USER="vuser"
#函数定义
log_info() { echo -e "\033[34m[INFO] $1\033[0m"; }
log_error() { echo -e "\033[31m[ERROR] $1\033[0m"; }
check_command() { command -v $1 >/dev/null || { log_error "$1未安装,安装失败!"; exit 1; } }
环境检查
log_info "开始环境检查..." check_command yum check_command db_load
#安装依赖包
log_info "开始安装vsftpd及依赖..."
yum install vsftpd libdb libdb-utils -y >/dev/null
if [ $? -ne 0 ]; then log_error "yum安装失败,请检查网络连接或系统状态!"
exit 1
fi
#关闭防火墙和SELinux
log_info "关闭防火墙..." systemctl stop firewalld >/dev/null systemctl disable firewalld >/dev/null
log_info "关闭SELinux..." setenforce 0 >/dev/null if ! grep -q "SELINUX=disabled" /etc/selinux/config; then sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config fi
#创建虚拟用户
log_info "创建虚拟用户列表..." cat > "$VUSER_LIST" <<EOF
tom
tom123
jack
jack123 EOF
#生成虚拟用户数据库
log_info "生成认证数据库..." db_load -T -t hash -f "$VUSER_LIST" "$VUSER_DB" >/dev/null if [ $? -ne 0 ]; then log_error "数据库生成失败,请检查$VUSER_LIST格式!" exit 1 fi chmod 600 "$VUSER_DB"
#配置PAM认证
log_info "配置PAM认证..."
mv /etc/pam.d/vsftpd{,.bak} >/dev/null 2>&1
cat > /etc/pam.d/vsftpd <<EOF #%PAM-1.0 auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so
db=/etc/vsftpd/vsftpd_login EOF
#创建系统映射用户
log_info "创建虚拟用户主目录..." mkdir -p "$VUSER_HOME"/{tom,jack} chmod 755 "$VUSER_HOME"
log_info "创建系统映射用户..." useradd -d "$VUSER_HOME" -s /sbin/nologin "$SYSTEM_USER" >/dev/null 2>&1 if [ $? -ne 0 ]; then
log_error "用户$SYSTEM_USER创建失败,请检查权限!
" exit 1 fi chown -R "$SYSTEM_USER":"$SYSTEM_USER" "$VUSER_HOME"
#配置vsftpd主文件
log_info "配置vsftpd主文件..."
cat > /etc/vsftpd/vsftpd.conf <<EOF
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES
guest_username=$SYSTEM_USER
allow_writeable_chroot=YES
chroot_local_user=YES
user_config_dir=$VUSER_CONF_DIR
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
EOF
#配置用户独立权限
log_info "创建用户独立配置..." mkdir -p "$VUSER_CONF_DIR"
cat > "$VUSER_CONF_DIR/tom" <<EOF local_root=$VUSER_HOME/tom write_enable=YES virtual_use_local_privs=YES EOF
cat > "$VUSER_CONF_DIR/jack" <<EOF local_root=$VUSER_HOME/jack write_enable=YES virtual_use_local_privs=YES EOF
#启动服务
log_info "启动vsftpd服务..."
systemctl restart vsftpd >/dev/null 2>&1 if [ $? -ne 0 ]; then
log_error "服务启动失败,请检查配置文件!"
exit 1
fi
systemctl enable vsftpd >/dev/null
#验证测试
log_info "开始验证测试..."
FTP_SERVER_IP=$(hostname -I | awk '{print $1}')
echo -e "open $FTP_SERVER_IP\ntom\ntom123\nexit" | ftp -n >/dev/null 2>&1
if [ $? -eq 0 ]; then
log_info "\n安装成功!\n虚拟用户:tom/jack\n密码:tom123/jack123"
log_info "服务器地址:ftp://$FTP_SERVER_IP" log_info "被动模式端口范围:30000-30999"
else
log_error -e "\n安装失败,请检查以下内容:"
log_error "1. 确认SELinux已完全关闭"
log_error "2. 检查$VUSER_DB权限是否为600"
log_error "3. 检查防火墙是否已关闭"
fi
VC()可以直接用,创建用户那一行应替换成自己的,网段应该替换自己的网段。
注:退出时,请按quit回车退出