要求:
1、可以添加、删除单个或多个虚拟用户
2、可以导入虚拟用户列表
3、在添加及导入时,如发现未安装配置vsftpd虚拟用户,则先安装配置并执行添加导入操作
4、添加、删除时严格控制输入是否正确
5、导入文件时,检查文件内容是否符合用户密码一 一对应
脚本内容:
#!/bin/bash
#auth by toyix
#2020年7月25日 10:57:44
#auto add delete import vsftpd_vname
####################################
LOCAL_ROOT="/data/ftp"
mkdir -p /data/ftp >/dev/null 2>&1
#定义函数 - 检查是否安装vsftpd及虚拟用户,没有装安装
INSTALL_CONFIG_VSFTPD_VNAME () {
#check vsftpd installd
rpm -qa|grep vsftpd >/dev/null 2>&1
if [ $? -ne 0 ];then
echo -e '\033[32m--------------------------------------------------\033[0m'
echo -e '\033[32m----vsftpd is not installd, now install vsftpd----\033[0m'
echo -e '\033[32m--------------------------------------------------\033[0m'
yum install -y pam* libdb-utils vsftpd* --skip-broken
cat >/etc/vsftpd/vsftpd.conf <<-EOF
#关闭匿名
anonymous_enable=NO
#用户不可出根目录
chroot_local_user=YES
#出根目录白名单
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
pasv_enable=YES
#使用被动模式4000至5000端口
pasv_min_port=4000
pasv_max_port=5000
local_enable=YES
write_enable=YES
local_umask=022
#使用本地时间
use_localtime=YES
dirmessage_enable=YES
#日志文件配置,并开启xferlog与vsftp.log双日志,xferlog记录上传与下载信息,vsftpd.log记录登录、上传、下载、删除等详细信息
dual_log_enable=YES
xferlog_enable=YES
log_ftp_protocol=YES
xferlog_std_format=YES
reverse_lookup_enable=NO
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
userlist_enable=YES
tcp_wrappers=YES
#虚拟用户配置-----------
#开启pam模块登录认证
pam_service_name=vsftpd
guest_enable=YES
#映射虚拟用户至系统用户(指定系统用户)
guest_username=ftpuser
#虚拟用户配置目录
user_config_dir=/etc/vsftpd/vsftpd_user_conf
#禁锢虚拟用户的主目录,同时禁止访问除主目录之外的目录
virtual_use_local_privs=YES
EOF
mkdir -p /etc/vsftpd/chroot_list
mkdir -p /etc/vsftpd/vsftpd_user_conf
cat >/etc/pam.d/vsftpd<<-EOF
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
EOF
fi
rpm -qa|grep pam >/dev/null 2>&1
if [ $? -ne 0 ];then
yum install -y pam*
fi
rpm -qa|grep libdb-utils >/dev/null 2>&1
if [ $? -ne 0 ];then
yum install -y libdb-utils
fi
VFTPUSER=`cat /etc/vsftpd/vsftpd.conf |grep -w 'guest_username'|awk -F"=" '{print $2}'`
#检查是否配置了虚拟用户,没有则创建虚拟用户
cat /etc/vsftpd/vsftpd.conf |grep -w '^guest_username'
if [ $? -ne 0 ];then
\cp /etc/vsftpd/vsftpd.conf{,.bak}
cat >>/etc/vsftpd/vsftpd.conf<<-EOF
#虚拟用户配置-----------
#开启pam模块登录认证
pam_service_name=vsftpd
guest_enable=YES
#映射虚拟用户至系统用户(指定系统用户)
guest_username=ftpuser
#虚拟用户配置目录
user_config_dir=/etc/vsftpd/vsftpd_user_conf
#禁锢虚拟用户的主目录,同时禁止访问除主目录之外的目录
virtual_use_local_privs=YES
EOF
useradd -s /sbin/nologin ftpuser
cat >/etc/pam.d/vsftpd<<-EOF
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
EOF
#新建虚拟用户配置文件目录
mkdir -p /etc/vsftpd/vsftpd_user_conf
fi
VFTPUSER=`cat /etc/vsftpd/vsftpd.conf |grep -w 'guest_username'|awk -F"=" '{print $2}'`
USER_CONFIG_DIR=`cat /etc/vsftpd/vsftpd.conf |grep -w 'user_config_dir='|awk -F"=" '{print $2}'`
VSFTPD_LOGIN_DB="`cat /etc/pam.d/vsftpd|grep -w 'vsftpd'|sed '1p' -n|awk -F"=" '{print $2}'`.db"
}
if [ $UID -ne 0 ];then
echo -e '\033[33m Permission no enough,please use root!!! \033[0m'
fi
if [ "$1" == "-a" ];then
shift 1
ADD_NR=`expr $# % 2`
if [ $ADD_NR -ne 0 ];then
echo -e '\033[33m mUsage:{/bin/sh $0= add: "-a vname1 passwd vname2 passwd" |help} \033[0m'
exit 1
fi
#调用函数 - 检查是否安装vsftpd及虚拟用户,没有装安装
INSTALL_CONFIG_VSFTPD_VNAME
VSFTPD_ADD_VFUSERS_PWDS="$*"
VSFTPD_ADD_VFUSERS=`echo ${VSFTPD_ADD_VFUSERS_PWDS}|awk '{print $1" " $3 " " $5" "$7" "$9" " $11}'`
a=`expr $# % 2`
if [ $a -ne 0 ];then
echo -e '\033[33m --------------------------------------------------------------------------------- \033[0m'
echo -e '\033[33m mUsage:{/bin/sh $0= add: "-a vname1 passwd vname2 passwd" |help} \033[0m'
echo -e '\033[33m --------------------------------------------------------------------------------- \033[0m'
fi
#把用户密码逐行追加至临时文件
for VSFTPD_ADD_VFUSERS_PWD in ${VSFTPD_ADD_VFUSERS_PWDS}
do
echo ${VSFTPD_ADD_VFUSERS_PWD}>>/etc/vsftpd/vfuser.txt
done
db_load -T -t hash -f /etc/vsftpd/vfuser.txt ${VSFTPD_LOGIN_DB}
chmod 700 /etc/vsftpd/vsftpd_login.db
for VSFTPD_ADD_VFUSER in ${VSFTPD_ADD_VFUSERS}
do
mkdir -p ${LOCAL_ROOT}/${VSFTPD_ADD_VFUSER}
echo "${LOCAL_ROOT}/${VSFTPD_ADD_VFUSER}"
chown -R ${VFTPUSER}:${VFTPUSER} ${LOCAL_ROOT}/${VSFTPD_ADD_VFUSER}
cat>${USER_CONFIG_DIR}/${VSFTPD_ADD_VFUSER}<<-EOF
#${VSFTPD_ADD_VFUSER}虚拟用户配置文件目录,即家目录
local_root=${LOCAL_ROOT}/${VSFTPD_ADD_VFUSER}
#允许登录用户有可写权限
write_enable=YES
#允许匿名用户下载,然后读取文件
anon_world_readable_only=YES
#允许匿名用户上传文件权限,只在write_enable=YES时生效
anon_upload_enable=YES
#允许匿名用户创建目录,只有在write_enable=YES时生效
anon_mkdir_write_enable=YES
#允许匿名用户其他权限,例如删除、重命名等
anon_other_write_enable=YES
EOF
done
/etc/init.d/vsftpd restart >/dev/null
echo ""
echo -e '\033[32m -------------------------------------------------------\033[0m'
echo -e '\033[32m -----------add finish! select db file---------------\033[0m'
echo -e '\033[32m -------------------------------------------------------\033[0m'
/usr/bin/db_dump -d a ${VSFTPD_LOGIN_DB}|grep -w 'data:'|awk '{print $6}'
elif [ "$1" == '-d' ];then
shift 1
#检测$*是否正确
VSFTPD_DEL_VFUSERS="$*"
echo $VSFTPD_LOGIN_DB
if [ -z "${VSFTPD_DEL_VFUSERS}" ];then
echo -e '\033[33m mUsage:{/bin/sh $0 delete: -d vnames filename |help} \033[0m'
exit 1
fi
#检查是否配置了虚拟用户
cat /etc/vsftpd/vsftpd.conf |grep -w '^pam_service_name' >/dev/null 2>&1
if [ $? -ne 0 ];then
echo -e '\033[33m 虚拟用户未配置,请重新执行此脚本 -a vnames \033[0m'
exit 1
else
VFTPUSER=`cat /etc/vsftpd/vsftpd.conf |grep -w 'guest_username'|awk -F"=" '{print $2}'`
USER_CONFIG_DIR=`cat /etc/vsftpd/vsftpd.conf |grep -w 'user_config_dir='|awk -F"=" '{print $2}'`
VSFTPD_LOGIN_DB="`cat /etc/pam.d/vsftpd|grep -w 'vsftpd'|sed '1p' -n|awk -F"=" '{print $2}'`.db"
echo -e "\033[32m VFTPUSER=${VFTPUSER} \033[0m"
echo -e "\033[32m USER_CONFIG_DIR=${USER_CONFIG_DIR} \033[0m"
echo -e "\033[32m VSFTPD_LOGIN_DB=${VSFTPD_LOGIN_DB} \033[0m"
fi
/usr/bin/db_dump -d a ${VSFTPD_LOGIN_DB}|grep -w 'data:'|awk '{print $6}'>/etc/vsftpd/vfuser.txt
for VSFTPD_DEL_VFUSER in ${VSFTPD_DEL_VFUSERS}
do
#删除密码行
sed -i -E "/^${VSFTPD_DEL_VFUSER}$/{n;d}" /etc/vsftpd/vfuser.txt
#删除用户行
sed -i -E "/^${VSFTPD_DEL_VFUSER}$/d" /etc/vsftpd/vfuser.txt
done
rm -rf ${VSFTPD_LOGIN_DB}
db_load -T -t hash -f /etc/vsftpd/vfuser.txt ${VSFTPD_LOGIN_DB}
chmod 700 ${VSFTPD_LOGIN_DB}
/etc/init.d/vsftpd restart >/dev/null
echo ""
echo -e '\033[32m -------------------------------------------------------\033[0m'
echo -e '\033[32m -----------delete finish! select db file---------------\033[0m'
echo -e '\033[32m -------------------------------------------------------\033[0m'
/usr/bin/db_dump -d a ${VSFTPD_LOGIN_DB}|grep -w 'data:'|awk '{print $6}'
elif [ "$1" == '-i' ];then
shift 1
if [ ! -f $1 ];then
echo -e '\033[33m ----文件不存在---- \033[0m'
echo -e '\033[33m mUsage:{/bin/sh $0= add:-a vname1 passwd vname2 passwd | delete: -d vnames | Import: -i filename |help} \033[0m'
exit 1
fi
NR_LIST=`cat "$1" |awk '{print NR}'|sed '$p' -n`
NR_LIST_YU=`expr ${NR_LIST} % 2`
if [ ${NR_LIST_YU} -ne 0 ];then
echo -e '\033[33m --------------please check the NR-------------- \033[0m'
echo -e '\033[33m mUsage:{/bin/sh -i
name1
passwd
name2
passwd
\033[0m'
echo -e '\033[33m ------------------------------------------------- \033[0m'
exit 1
fi
#调用函数,检查是否安装配置了vsftpd虚拟用户,没有则安装配置
INSTALL_CONFIG_VSFTPD_VNAME
I_ADDVFUSERS=`cat $1|awk 'NR%2==0 {next}{print $0}'`
for I_ADDVFUSER in ${I_ADDVFUSERS}
do
mkdir -p ${LOCAL_ROOT}/${I_ADDVFUSER}
echo "${LOCAL_ROOT}/${I_ADDVFUSER}"
chown -R ${VFTPUSER}:${VFTPUSER} ${LOCAL_ROOT}/${I_ADDVFUSER}
cat>${USER_CONFIG_DIR}/${I_ADDVFUSER}<<-EOF
#${I_ADDVFUSER}虚拟用户配置文件目录,即家目录
local_root=${LOCAL_ROOT}/${I_ADDVFUSER}
#允许登录用户有可写权限
write_enable=YES
#允许匿名用户下载,然后读取文件
anon_world_readable_only=YES
#允许匿名用户上传文件权限,只在write_enable=YES时生效
anon_upload_enable=YES
#允许匿名用户创建目录,只有在write_enable=YES时生效
anon_mkdir_write_enable=YES
#允许匿名用户其他权限,例如删除、重命名等
anon_other_write_enable=YES
EOF
done
db_load -T -t hash -f $1 ${VSFTPD_LOGIN_DB}
chmod 700 ${VSFTPD_LOGIN_DB}
/etc/init.d/vsftpd restart >/dev/null
echo ""
echo -e '\033[32m -------------------------------------------------------\033[0m'
echo -e '\033[32m -----------Import finish! select db file---------------\033[0m'
echo -e '\033[32m -------------------------------------------------------\033[0m'
/usr/bin/db_dump -d a ${VSFTPD_LOGIN_DB}|grep -w 'data:'|awk '{print $6}'
else
echo -e '\033[33m -------------------------------------------------------------------------------------------------------- \033[0m'
echo -e '\033[33m mUsage:{/bin/sh $0= add:-a vname1 passwd vname2 passwd | delete: -d vnames | Import: -i filename |help} \033[0m'
echo -e '\033[33m -------------------------------------------------------------------------------------------------------- \033[0m'
exit 1
fi
执行结果 - 添加虚拟用户
[root@localhost /]# sh autoA_D_I_vfuser.sh -a aaaa 123456 bbbb 123456 cccc 123456
guest_username=ftpuser
/data/ftp/aaaa
/data/ftp/bbbb
/data/ftp/cccc
-------------------------------------------------------
-----------add finish! select db file---------------
-------------------------------------------------------
aaaa
123456
bbbb
123456
cccc
123456
[root@localhost /]#
连接测试
执行结果 - 删除用户
[root@localhost /]# sh autoA_D_I_vfuser.sh -d cccc bbbb
VFTPUSER=ftpuser
USER_CONFIG_DIR=/etc/vsftpd/vsftpd_user_conf
VSFTPD_LOGIN_DB=/etc/vsftpd/vsftpd_login.db
-------------------------------------------------------
-----------delete finish! select db file---------------
-------------------------------------------------------
aaaa
123456
[root@localhost /]
执行结果 - 文件列表导入
[root@localhost /]# sh autoA_D_I_vfuser.sh -i txt
guest_username=ftpuser
/data/ftp/xiaolu
/data/ftp/xiaoxi
/data/ftp/xiaoliu
/data/ftp/xiaowang
/data/ftp/xiaohuang
/data/ftp/ibbi
-------------------------------------------------------
-----------Import finish! select db file---------------
-------------------------------------------------------
aaaa
123456
ibbi
123456
xiaohuang
123456
xiaolu
12345622222
xiaowang
123456
xiaoxi
123456
xiaoliu
123456
[root@localhost /]#
连接测试
注:如发现连接不通,需要关闭selinux及开启防火墙端口
[root@localhost /]# setenforce 0
[root@localhost /]# sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config
[root@localhost /]# firewall-cmd --zone=public --add-port=4000-5000/tcp --permanent
[root@localhost /]# firewall-cmd --zone=public --add-port=21/tcp --permanent
[root@localhost /]# firewall-cmd --reload
--------------------------end