banner

linux下centos6/7,rhel6/7下部署vsftpd虚拟用户脚本(三)

这是从上2次更新后的第三次更新,原因很简单。今天想发文章,但是,没有存稿。于是乎,故伎重演,将更新过的脚本发粗来,凑合一下!依然还是没有啥进步,如果,您有更好的版本,欢迎@我!当然,也欢迎保留链接和作者转载。

每个人都应该自成一派,去开创你精彩的人生。

1.PNG

代码如下


#!/bin/bash

echo -e "########################################################"
echo "脚本名称:vsftpd管理脚本"
echo "版本    :1.6(beta)"
echo "注意事项"
echo -e "1,所有路径需写绝对路径.例如:/data/test。"
echo -e "2,使用本脚本部署会重新配置vsftpd.conf文件,如果有自定义修改,请备份。"
echo -e "3,由于1.1版本部署时不会判断密码文件中用户名和密码的唯一性,如果使用1.2以后版本操作用户名、密码等会出错,请谨慎使用"
echo -e "4,i386架构未验证pam设置,请谨慎使用"
echo -e "更新记录"
echo -e "1.0:2016-06-17,初始化版本(fushengbao)"
echo -e "1.1:2016-10-18,更新一些判断(fushengbao)"
echo -e "1.2:2017-12-18,更新代码及结构,增加菜单项(fushengbao)"
echo -e "1.3:2017-12-19,更新一些判断(fushengbao)"
echo -e "1.4:2018-01-04,更新vsftpd.vu不能创建的bug(fushengbao)"
echo -e "1.5:2018-01-05,更新一些bug(fushengbao)"
echo -e "1.6:2018-05-30,修复操作系统没有ftp用户组导致新建用户失败(fushengbao)"
echo -e "########################################################"
stty erase '^H'
#公共变量
os=`awk -F '[ .]' '{print $7$8}' /etc/redhat-release`
ar=`arch`
#公共变量结束
#安装前置检查开始
function vsftpdinstall () {
#判断是否安装vsftp服务
if [ `rpm -qa|grep vsftpd` ];then
    echo "FTP已安装"
else
    echo "FTP开始安装"
    yum install -y vsftpd > /dev/null 2>&1 && yum install -y db4* >/dev/null 2>&1
    echo "FTP安装完成"
fi
#判断是否安装vsftpd服务结束
#停止selinux
function stop_seLinux (){
    sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config && setenforce 0 >/dev/null 2>&1
}
#停止selinux结束
}
#安装前置检查结束
#创建vsftpd配置文件
function vsftpconf () {
if [ ! `id ftpd` >/dev/null 2>&1 ];then
    if [ `grep "ftp" /etc/group > /dev/null 2>&1` ];then
        useradd  -g ftp -s /sbin/nologin  -m ftpd
    else
       groupadd ftp
       useradd -g ftp -s /sbin/nologin -m ftpd
    fi
 echo "ftpd用户创建完成"
else
    echo "ftpd用户已存在"
fi
if [ -e /etc/vsftpd/vsftpd.conf ];then
    mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak-`date +%Y%m%d%H%M`
fi
    local conf_file="/etc/vsftpd/vsftpd.conf"
    echo "anonymous_enable=NO" >$conf_file
    echo "local_enable=YES" >>$conf_file
    echo "write_enable=YES" >>$conf_file
    echo "local_umask=022" >>$conf_file
    echo "dirmessage_enable=YES" >>$conf_file
    echo "xferlog_enable=YES" >>$conf_file
    echo "xferlog_std_format=YES" >>$conf_file
    echo "connect_from_port_20=YES" >>$conf_file
    echo "chroot_local_user=YES" >>$conf_file
    echo "listen=YES" >>$conf_file
    echo "listen_ipv6=NO" >>$conf_file
    echo "pam_service_name=vsftpd.vu" >>$conf_file
    echo "guest_enable=yes" >>$conf_file
    echo "guest_username=ftpd" >>$conf_file
    echo "user_config_dir=/etc/vsftpd_user_conf/" >>$conf_file
    echo "virtual_use_local_privs=YES" >>$conf_file
    echo "userlist_enable=NO" >>$conf_file
    echo "tcp_wrappers=YES" >>$conf_file
    echo "nopriv_user=ftpd" >>$conf_file
    echo "chroot_list_enable=NO" >>$conf_file
    #following parameter is only for rhel 7
        if [ "${os:0:1}" == "7" ];then
        echo "allow_writeable_chroot=YES" >>$conf_file
        fi
}
#创建vsftpd配置文件
#创建pam配置文件
function pamconf () {
    case `arch` in
        x86_64)
            if [ "${os:0:1}" == "7" ];then
                local filename="/usr/lib64/security/pam_userdb.so"
  echo "auth required "$filename" db=/etc/vsftpd/vsftpd_login" >/etc/pam.d/vsftpd.vu
                echo "account required "$filename" db=/etc/vsftpd/vsftpd_login" >>/etc/pam.d/vsftpd.vu
            else
                local filename="pam_userdb.so"
  echo "auth required "$filename" db=/etc/vsftpd/vsftpd_login" >/etc/pam.d/vsftpd.vu
                echo "account required "$filename" db=/etc/vsftpd/vsftpd_login" >>/etc/pam.d/vsftpd.vu
            fi
    ;;
        i686)
            local filename="/lib/security/pam_userdb.so"  #in practical work ,there no 7.x with 32bit, so did not consider this sub
 echo "auth required "$filename" db=/etc/vsftpd/vsftpd_login" >/etc/pam.d/vsftpd.vu
           echo "account required "$filename" db=/etc/vsftpd/vsftpd_login" >>/etc/pam.d/vsftpd.vu
    ;;
    esac
}
#输入用户名密码
function readmenu () {
if [ ! -f /etc/vsftpd/logins.txt ];then
    touch /etc/vsftpd/logins.txt
fi
read -p "please input a virtual user name :" var
    if [ -z "$var" ];then
        echo "用户名不能为空"
        sleep 3
        readmenu
    elif [ `grep -w "$var" /etc/vsftpd/logins.txt|wc -l` -gt 1 ];then
        echo "用户名不具有唯一性"
        sleep 3
        readmenu
    fi
read -p "please input a virtual user password:" vaa
    if [ -z "$vaa" ];then
        echo "提示,密码为空"
        sleep 3
        readmenu
    elif [ `grep -w "$vaa" /etc/vsftpd/logins.txt|wc -l` -gt 1 ];then
        echo "密码不具有唯一性"
        sleep 3
        readmenu
    elif [ "$var" == "$vaa" ];then
        echo "用户名密码不能相同"
        sleep 3
        readmenu
    fi
echo "please wait........."
}
function readmenu1 () {
read -p "please input a virtual path :" vae
    if [ -z "$vae" ];then
        echo "目录不能为空"
        sleep 3
        readmenu
    elif [ -d "$vae" ];then
        echo "用户目录已存在"
        sleep 3
        readmenu
    fi
}
#输入用户名密码结束
#虚拟用户及密码
function vir_user (){
    echo -e "$var\n$vaa" >> /etc/vsftpd/logins.txt
    db_load -T -t hash -f /etc/vsftpd/logins.txt /etc/vsftpd/vsftpd_login.db
    chmod 600 /etc/vsftpd/vsftpd_login.db
}
#虚拟用户及密码结束
#虚拟用户配置文件
function vir_users (){
    chown ftpd.ftp /var/ftp/pub
    allow_writeable_chroot=YES
    virtual_use_local_privs=YES
if [ ! -d /etc/vsftpd_user_conf/ ];then
    mkdir /etc/vsftpd_user_conf
fi
if [ ! -f /etc/vsftpd_user_conf/"$var" ];then
    echo -e "local_root=$vae\nanon_world_readable_only=NO\nanon_upload_enable=YES\nanon_mkdir_write_enable=YES\nanon_other_write_enable=YES\nwrite_enable=YES" > /etc/vsftpd_user_conf/"$var"
else
    read -p ""$var"用户配置文件已存在,是否覆盖(y/n):" vary
    case $vary in
    y|Y)
    echo -e "local_root=$vae\nanon_world_readable_only=NO\nanon_upload_enable=YES\nanon_mkdir_write_enable=YES\nanon_other_write_enable=YES\nwrite_enable=YES" > /etc/vsftpd_user_conf/"$var"
    ;;
    n|N)
    read -p "按回车键,返回目录"
    menua
    ;;
    esac
fi
    mkdir -p /$vae
    chown ftpd.ftp /$vae
}
#虚拟用户配置文件结束
#重启服务
function rebootconf () {
    if [ "${os:0:1}" == "7" ];then
        systemctl restart vsftpd
    else
        service vsftpd restart
    fi
}
#重启服务结束
#添加开机启动
function chkconfigconf () {
    if [ "${os:0:1}" == "7" ];then
        systemc enable vsftpd
    else
        chkconfig vsftpd on
    fi
}
#关闭开机启动
function chkconfigconfoff () {
    if [ "${os:0:1}" == "7" ];then
        systemc disable vsftpd
    else
        chkconfig vsftpd off
    fi
}
function vsftpscan () {
echo "账号密码"
grep -w "$var"  -A 1 /etc/vsftpd/logins.txt
if [ $? == 1 ];then
echo "查无此人"
read
menua
fi
echo "配置文件"
echo "/etc/vsftpd_user_conf/"$var""
echo "用户目录"
head -n 1 /etc/vsftpd_user_conf/"$var"
}
#添加开机启动结束
#vsftpd目录
function menua () {
echo "--------vsftpd管理脚本--------"
echo "1,安装vsftpd"
echo "2,添加虚拟用户"
echo "3,删除虚拟用户"
echo "4,修改虚拟用户密码"
echo "5,用户信息查询"
echo "6,卸载vsftpd"
echo "Q,退出"
read -p "请输入需要的功能:" menua
case $menua in
    1)
        clear
        echo "开始安装vsftpd"
        vsftpdinstall
        vsftpconf
        pamconf
        readmenu
        readmenu1
        vir_user
        vir_users
        rebootconf
        chkconfigconf
        vsftpscan
        echo "安装vsftpd已完成,按回车键返回目录"
        read
        menua
    ;;
    2)
        echo "添加虚拟用户"
        echo "提醒:用户名,密码要保证唯一性。"
        readmenu
        readmenu1
        vir_user
        vir_users
        vsftpscan
        echo "添加虚拟用户完成,按回车键返回目录"
        read
        menua
    ;;
    3)
        echo "删除虚拟用户"
        echo "删除的用户必须觉有唯一性,如果不能确定请参考/etc/vsftpd/logins.txt文件。"
        readmenu
        pwlog=`grep -w "$var" -A 1 /etc/vsftpd/logins.txt|tail -n 1`
        sed -i "/\<$var\>/d" /etc/vsftpd/logins.txt
        sed -i "/\<$pwlog\>/d" /etc/vsftpd/logins.txt
        db_load -T -t hash -f /etc/vsftpd/logins.txt /etc/vsftpd/vsftpd_login.db
        chmod 600 /etc/vsftpd/vsftpd_login.db
        rm -rf /etc/vsftpd_user_conf/"$var"
        echo "删除虚拟用户完成,按回车键返回目录"
        read
        menua
    ;;
    4)
        echo "修改虚拟用户密码"
        echo "修改的密码必须觉有唯一性,如果不能确定请参考/etc/vsftpd/logins.txt文件。"
        readmenu
        pwlog=`grep -w "$var" -A 1 /etc/vsftpd/logins.txt |tail -n 1`
        sed -i "s/\<$pwlog\>/$vaa/g" /etc/vsftpd/logins.txt
        db_load -T -t hash -f /etc/vsftpd/logins.txt /etc/vsftpd/vsftpd_login.db
        chmod 600 /etc/vsftpd/vsftpd_login.db
        echo "修改虚拟用户密码完成,按回车键返回目录"
        read
        menua
    ;;
    5)
        echo "用户信息查询"
        read -p "请输入用户名:" var
        vsftpscan
        read
        menua
    ;;
    6)
        echo "卸载vsftpd"
        chkconfigconfoff
        yum remove vsftpd -y
        rm -rf /etc/vsftpd_user_conf
  rm -rf /etc/vsftpd/
    ;;
    q|Q)
        echo "退出"
    ;;
    *)
 clear
        menua
    ;;
esac
}
if [ `id -u` == 0 ];then
menua
else
echo "请使用root账号运行该管理脚本"
fi

下载地址


wget https://shengbao.org/tools/vsftpd_1.6.sh

推荐阅读:

linux下centos6/7,rhel6/7下部署vsftpd虚拟用户脚本(三)

离职了

处理华为服务器RH1288V3 iBMC非周期性重启

阅读: 4860
在同意共创许可协议(CC BY-NC-SA-4.0)的前提下,您可以转载本文。
付生保个人博客
https://shengbao.org/702.html

相关阅读

留言评论

2条留言
桃色老李
有点乱,还要下载才能看懂!
付生保个人博客
这么多function,还能乱到哪里去?