#!/bin/bash
# VsFTPD Virtual User Configuration
# This script is written by jerry
# Create Date: 2013-06-28
# #################################################
YUM_INSTALL_LIST="vsftpd db4 db4-tcl db4-utils"
APT_INSTALL_LIST="vsftpd db4.6-util"

# 通常只需要编辑以下两个变量
FTP_USER=www
FTP_HOME=/www

VSFTPD_BASE_DIR=/etc/vsftpd


#################################################
#
# 检查系统环境,并安装所需软件包
#
#################################################
# 检查是否以ROOT用户执行本脚本
[ `id -u` -ne '0' ] && echo 'Must be root!' && exit

# 检查发行版是否为本脚本所支持
[ `uname -i` = 'x86_64' ] && PLATFORM='x86_64' || PLATFORM='i386'
if cat /etc/issue|grep '4.' ;then
        OS=4
elif cat /etc/issue|grep '5.';then
        OS=5
else
        echo 'Do not support this system ' && exit
fi

DISTRIBUTION=`lsb_release -i | awk '{print $3}'`
case "$DISTRIBUTION" in
*CentOS*|*"Red Hat"*|*Fedora*)
    yum -y install $YUM_INSTALL_LIST
    ;;
*Debian*|*Ubuntu*)
    apt-get -y install $APT_INSTALL_LIST
    ;;
*)
    echo 'Do not support this distribution !' && exit 0
    ;;
esac



#################################################
#
# 创建FTP用的系统用户
#
#################################################
# 检查ftp要使用的用户是否存在
EXISTS_USER=`grep -E "^\<$FTP_USER\>" /etc/passwd |awk -F: '{print $1}'` 
if [ "$EXISTS_USER" != "$FTP_USER" ]
then
        useradd -u 78 $FTP_USER -d $FTP_HOME -s /sbin/nologin
fi 

# 检查ftp用户的家目录是否正确
if [ "$EXISTS_USER" = "$FTP_USER" ]
then
       usermod -d $FTP_HOME $FTP_USER
fi



#################################################
#
# 创建FTP的目录和文件
#
#################################################
# 创建安装目录
if [ ! -d $VSFTPD_BASE_DIR ]
then
        mkdir -p $VSFTPD_BASE_DIR
fi

# 把FTP的系统用户写入
echo "$FTP_USER" >> $VSFTPD_BASE_DIR/vsftpd.chroot_list

# 创建日志文件
touch /var/log/vsftpd.log

# 创建虚拟用户的配置文件路径目录
mkdir -p $VSFTPD_BASE_DIR/user_config

# 创建密码文件, 单行为用户名, 双行为密码
touch $VSFTPD_BASE_DIR/passwd.txt



#################################################
#
# 修改配置文件
#
#################################################
# 写入测试用户和密码
echo ftpuser1 >> $VSFTPD_BASE_DIR/passwd.txt
echo `< /dev/urandom tr -dc A-Za-z0-9 | head -c 20` >> $VSFTPD_BASE_DIR/passwd.txt

# 修改PAM认证文件
echo "    auth       required     pam_userdb.so db=$VSFTPD_BASE_DIR/user_passwd" > /etc/pam.d/vsftpd
echo "    account       required     pam_userdb.so db=$VSFTPD_BASE_DIR/user_passwd" >> /etc/pam.d/vsftpd


# 编辑vsftpd的配置文件
> $VSFTPD_BASE_DIR/vsftpd.conf && echo "已删除默认配置"
echo "\
listen=YES
background=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
chown_uploads=NO
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
async_abor_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ftpd_banner=Welcome to Ismole FTP servers
pam_service_name=vsftpd
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
guest_enable=YES
guest_username=$FTP_USER
user_config_dir=$VSFTPD_BASE_DIR/user_config\
" >> $VSFTPD_BASE_DIR/vsftpd.conf

# 为虚拟用户创建家目录和配置文件
if [ ! -d $FTP_HOME/wwwroot/ftpuser1 ]
then
        mkdir -p $FTP_HOME/wwwroot/ftpuser1
        chown -R $FTP_USER $FTP_HOME
fi

echo "\
local_root=$FTP_HOME/wwwroot/ftpuser1
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES\
" >> $VSFTPD_BASE_DIR/user_config/ftpuser1




#################################################
#
# 创建虚拟用户密码认证数据库文件,并写成脚本
#
#################################################
case "$DISTRIBUTION" in
*CentOS*|*"Red Hat"*|*Fedora*)
    echo "\
if [ -e $VSFTPD_BASE_DIR/user_passwd.db ]
then
        rm -f $VSFTPD_BASE_DIR/user_passwd.db
fi
db_load -T -t hash -f $VSFTPD_BASE_DIR/passwd.txt $VSFTPD_BASE_DIR/user_passwd.db\
" >> $VSFTPD_BASE_DIR/db_load.sh
    ;;
*Debian*|*Ubuntu*)
    echo "\
if [ -e $VSFTPD_BASE_DIR/user_passwd.db ]
then
        rm -f $VSFTPD_BASE_DIR/user_passwd.db
fi
db4.6_load -T -t hash -f $VSFTPD_BASE_DIR/passwd.txt $VSFTPD_BASE_DIR/user_passwd.db\
" >> $VSFTPD_BASE_DIR/db_load.sh
    ;;
*)
    echo 'Do not support this distribution !!' && exit
    ;;
esac

chmod 500 $VSFTPD_BASE_DIR/db_load.sh
$VSFTPD_BASE_DIR/db_load.sh



#################################################
#
# 启动并测试
#
#################################################
/etc/init.d/vsftpd start

# 验证登录
echo "测试用户名是: ftpuser1"
# 显示出匹配行的下一行,也就是密码
echo "测试用户密码是: `sed -n '/ftpuser1/{n;p;}' $VSFTPD_BASE_DIR/passwd.txt`"
echo "测试无误的话别忘了删除测试用户,Good luck ! "
#----------------------------引用文字-结束----------------------------