使用VsFtpd及Acl设置访问控制列表可使用的添加用户设置脚本

使用此脚本需要满足使用VSFTP虚拟用户及使用ACL控制访问列表功能才可用!纯粹自己用~~如想使用请自行修改~

Vsftp服务安装搭建,虚拟用户配置  参见:http://kinggoo.com/app-installvsftpdconf.htm

Acl(Access Control List)访问控制列表 参见:http://kinggoo.com/geren-acl.htm

注意:使用此脚本必须要你的计算机上支持ACL 此脚本为文章库存~~~

ftpAddUser.sh 脚本

@功能: 针对使用vsftp添加虚拟用户
@格式参数: sh ftpAddUser.sh 虚拟用户名 虚拟密码
@@介绍:使用此脚本时,必须含有setACL_ftpWeb.sh

脚本内容如下:

#!/bin/bash
## @auth: Tscccn
## @blog: http://kinggoo.com
## @功能: 针对使用vsftp添加虚拟用户
## @格式参数: sh ftpAddUser.sh 虚拟用户名 虚拟密码
##
# _Home 新添加的ftp用户所要能被访问的根目录
# 比如ftp用户家目录为/home/abc,那_Home设置为/home/即可
_Home="/var/www/html/"

# _vsftpdConfig :vsftpd服务所设置用来保存虚拟用户配置文
# 件的目录。
# 即你在vsftpd服务配置文件内所设置的user_config_dir的属性
_vsftpdConfig="/etc/vsftpd/vsftpd_config/"

# 回显信息
__outMsg(){
echo  "------------------------"
echo  "-   请输入编号并回车   -"
echo  "------------------------"
echo   "( 1 ) 添加vsftp虚拟用户  "
echo   "( 2 ) 删除vsftp虚拟用户  "
echo   "( 3 ) 查看已存在虚拟用户信息 "
echo -e -n "      \033[31m \033[05m 请输入数字并回车\033[0m:"&& read num
}

# 测试用户是否存在,存在将变量_funTestUser置为1不存在为0
__testUser(){
 vU=$1
 i=`awk -F':' '{print $1}' /etc/passwd|grep -o  "${vU}"  |wc -l`
 if (( $i == 0 ));then
    _funTestUser=0
 else
    _funTestUser=1
 fi
}

# 创建用户
__userAdd(){
_vsftpdConfig=$4
_Home=$3
_aclPath=${_Home}
_home=${_Home%?}
_ftpUser=$1
_ftpPasswd=$2

useradd -d ${_home} -s /sbin/nologin ftp.${_ftpUser} > /dev/null 2>&1 && _temp="成功" || _temp="失败" 
echo "添加关联系统ftp用户 ...... [${_temp}]"
echo  "创建虚拟ftp存放文件夹 & 创建配置文件等信息"
mkdir -p ${_Home}${_ftpUser} && _temp="成功" || _temp="失败"
echo  "创建 ${_Home}${_ftpUser} ...... [${_temp}]"
cat>${_vsftpdConfig}${_ftpUser}<<EOF
guest_enable=yes
guest_username=ftp.${_ftpUser}
local_root=${_Home}${_ftpUser}
anon_umask=022
idle_session_timeout=600
data_connection_timeout=120
max_clients=5
max_per_ip=5
local_max_rate=0
EOF

echo "${_ftpUser}" >> `dirname ${_vsftpdConfig}`/virtual_login
echo "${_ftpPasswd}" >> `dirname ${_vsftpdConfig}`/virtual_login
# 限制在配置文件内执行的目录下
echo "${_ftpUser}" >> `dirname ${_vsftpdConfig}`/chroot_list

db_load -T  -t hash -f `dirname ${_vsftpdConfig}`/virtual_login `dirname ${_vsftpdConfig}`/virtual_login.db  && _temp="成功" || _temp="失败"
echo "更新虚拟用户账户  ...... [${_temp}]"

sh ${_Home}setACL_ftpWeb.sh ftp.${_ftpUser} ${_Home}  && _temp="成功" || _temp="失败"
echo "处理acl权限               ...... [${_temp}]"
#/etc/init.d/vsftpd restart
service  vsftpd restart
}

# 删除用户
__userDel(){
_vsftpdConfig=$3
_Home=$2
_aclPath=${_Home}
_home=${_Home%?}
_ftpUser=$1

echo -n "准备删除系统用户ftp.${_ftpUser} ... "
userdel ftp.${_ftpUser} > /dev/null 2>&1 && _temp="成功" || _temp="失败" 
sleep 1
echo  "... [${_temp}]"
echo "备份相关文件 ... "
yes|cp `dirname ${_vsftpdConfig}`/virtual_login `dirname ${_vsftpdConfig}`/virtual_login.ts  > /dev/null 2>&1  && _temp1="成功" || _temp1="失败" 
echo "[`dirname ${_vsftpdConfig}`/virtual_login.ts] ...  [${_temp1}]"
# 清除虚拟文件此帐号密码
sed -i '/^'${_ftpUser}$'/{N; d}' `dirname ${_vsftpdConfig}`/virtual_login

yes|cp `dirname ${_vsftpdConfig}`/chroot_list `dirname ${_vsftpdConfig}`/chroot_list.ts > /dev/null 2>&1  && _temp2="成功" || _temp2="失败" 
echo "[`dirname ${_vsftpdConfig}`/chroot_list.ts] ...  [${_temp2}]"
# 清除限制目录切换
sed -i '/^'${_ftpUser}\$'/d' `dirname ${_vsftpdConfig}`/chroot_list

echo -n "准备删除文件 ${_vsftpdConfig}${_ftpUser} 按任意键继续"&& read
rm -rf ${_vsftpdConfig}${_ftpUser}  > /dev/null 2>&1  && _temp="成功" || _temp="失败" 
echo "删除 ...... ${_temp}"
db_load -T  -t hash -f `dirname ${_vsftpdConfig}`/virtual_login `dirname ${_vsftpdConfig}`/virtual_login.db  && _temp="成功" || _temp="失败"
echo "更新虚拟用户账户 ...... [${_temp}]"

echo "请手动删除 ${_Home}${_ftpUser} "
service  vsftpd restart
}

# main Top
__outMsg

# 处理交互数据
case $num in
1)
echo -e -n "\033[31m 请输入vsftp虚拟用户用户名\033[0m:"&& read _vUser
if [[ $(echo "${_vUser}"|wc -c) > 1 &&  ${_vUser/ /} == ${_vUser} ]];then
        __testUser ${_vUser}
if [[ ${_funTestUser} == 0 ]];then
        echo  "--->> 在系统内没有发现这个用户。"
        echo  -n "--->> 是否立即创建(${_vUser})?[y/n]"&& read _isOk
        if [[ ${_isOk} == "Y" || ${_isOk} == "y" ]];then
                echo -n "--->> 请输入虚拟用户 ${_vUser} 的ftp密码 "&& read _vPasswd
                _ftpUser=${_vUser}
                _ftpPasswd=${_vPasswd}
                __userAdd ${_ftpUser} ${_ftpPasswd} ${_Home} ${_vsftpdConfig}
        else
                clear
                __outMsg
        fi
else
        echo "--->> 此用户已存在。"
        echo "..... 马上跳转 ....."
        sleep 2
        clear
        __outMsg
fi
else
#用户名输入格式不标准
        clear
        __outMsg
fi

;;
2)
echo -e -n "\033[31m 请输入要删除的 vsftp 虚拟用户用户名\033[0m:"&& read _vUser
if [[ $(echo "${_vUser}"|wc -c) > 1 &&  ${_vUser/ /} == ${_vUser} ]];then
        __testUser ftp.${_vUser}
        if [[ ${_funTestUser} == 1 ]];then
                        echo  "--->> 在系统用户文件内检测到关联帐号 ftp.${_vUser} "
                        echo  -n "--->> 是否删除与(${_vUser})关联帐号?[y/n]"&& read _isOk
                        if [[ ${_isOk} == "y" ||  ${_isOk} == "Y" ]];then
                                        _ftpUser=${_vUser}
                                        __userDel ${_ftpUser} ${_Home} ${_vsftpdConfig}
                        else
                                        clear
                                        exit
                        fi
        else
                        echo "--->> 无法删除,系统内查找不到此用户信息"
                        echo "按任意键退出!"
                        read
                        clear
                        exit
        fi
else
#用户名输入格式不标准
        clear
                echo "输入格式不符合标准 ... 退出"
        exit
fi

;;

3)
_userArr=( $( sed -n '1~2p' `dirname ${_vsftpdConfig}`/virtual_login ) )
_passwdArr=( $( sed -n '0~2p' `dirname ${_vsftpdConfig}`/virtual_login ) )
echo "有如下虚拟用户"
echo " ___________________________________"
printf "| 用户名\t| 密码\t|\n"
echo "|_______________ ___________________|"
for (( i=0 ;i<${#_userArr[@]};i++)) 
do
#	echo $i | awk  '{ print length, $0}' - | sort -n -t $'\t' || sed 's/.* //'
	printf "| ${_userArr[$i]}\t| ${_passwdArr[$i]}\n"
done
;;

exit|EXIT)
        exit ;;
*)
exit
;;
esac

setACL_ftpWeb.sh 脚本

@功能: 设置虚拟FTP用户对web用户的访问
@格式参数: sh setACL_ftpWeb.sh ftp的虚拟用户 nginx进程用户 需要设置的路径
@@介绍:在单独使用的时候,请在设置时将需要设置的路径最好是web的根目录,比如你的a、b、c三个Web站点放在“/var/www/html/”下,则需要将设置的路径改为"/var/www/html"

脚本内容如下:

#!/bin/bash
## @auth: Tscccn
## @blog: http://kinggoo.com
## @功能: 设置虚拟FTP用户可以访问对应WEB目录
## @格式参数: sh setACL_ftpWeb.sh ftp用户 nginx进程用户 需要设置的路径
# $1: ftp用户
# $2: nginx进程用户
# $3: 需要设置的路径,需要手动创建

setfacl -R -m u:$1:rwx $3;
setfacl -R -m u:$2:rwx $3;
setfacl -d -R -m u:$1:rw- $3;
setfacl -d -R -m u:$2:rwx $3;

setfacl -R -m g:$1:--- $3;
setfacl -R -m g:$2:--- $3;
setfacl -d -R -m g:$1:--- $3;
setfacl -d -R -m g:$2:--- $3;

setfacl -R -m o::--- $3;
setfacl -d -R -m o::--- $3;

setfacl -R -m m::rwx $3;
setfacl -d -R -m m::rw- $3;

OK.

- THE END -
版权声明:
转载原创文章请注明,文章出处:http://kinggoo.com
原文地址:http://kinggoo.com/ftpadduser.htm
发表评论?

3 条评论。

  1. 不错的博客,支持一下!

发表评论