网络文件共享服务-FTP

网络文件共享服务-FTP

FTP文件传输协议

FTP工作原理介绍
  1. 文件传输协议:File Transfer Protocol 早期的三个应用级协议之一,基于C/S结构

  2. 数据传输格式:二进制(默认)和文本

  3. 双通道协议:命令和数据连接

  4. 两种模式:从服务器角度

    • 主动(PORT style):服务器主动连接

      ​ 命令(控制):客户端:随机port —> 服务器:21/tcp

      ​ 数据:客户端:随机port <—服务器:20/tcp

    • 被动(PASV style):客户端主动连接

      ​ 命令(控制):客户端:随机port —> 服务器:21/tcp

      ​ 数据:客户端:随机port —> 服务器:随机port /tcp

FTP服务状态码
1XX:信息 125:数据连接打开
2XX:成功类状态 200:命令OK     230:登录成功
3XX:补充类     331:用户名OK
4XX:客户端错误 425:不能打开数据连接
5XX:服务器错误 530:不能登录
用户认证
匿名用户:ftp,anonymous,对应Linux用户ftp
系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
虚拟用户:特定服务的专用用户,独立的用户/密码文件
常见 FTP 相关软件
FTP服务器端软件
  • Wu-ftpd
  • Proftpd
  • Pureftpd
  • Filezilla Server
  • Serv-U
  • Wing FTP
  • Server
  • IIS
  • vsftpd

​ vsftpd介绍:

  • Very Secure FTP Daemon,CentOS 默认FTP服务器
  • 高速,稳定,下载速度是WU-FTP的两倍
  • 数据:单机最多可支持15000个并发
  • vsftpd官网: https://security.appspot.com/vsftpd.html
客户端软件
  • ftp,lftp,lftpget,wget,curl
  • ftp -A ftpserver port -A 主动模式 -p 被动模式
  • lftp -u username ftpserver
  • lftp username@ftpserver
  • lftpget ftp://ftpserver/pub/file
  • gftp:GUI centos5 最新版2.0.19 (11/30/2008),官网:https://www.gftp.org/
  • filezilla,FTP Rush,CuteFtp,FlashFXP,LeapFtp
  • IE ftp://username:password@ftpserver

vsftp软件介绍

  • 由 vsftpd 包提供,不再由xinetd管理
  • 用户认证配置文件:/etc/pam.d/vsftpd
启动服务相关文件
/usr/lib/systemd/system/vsftpd.service
/etc/rc.d/init.d/vsftpd
配置文件
/etc/vsftpd/vsftpd.conf
配置文件格式
option=value 
#注意= 前后不要有空格
用户和其共享目录
	匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
	系统用户共享文件位置:用户家目录
	虚拟用户共享文件位置:专用于FTP服务的用户帐号, 为其映射的系统用户的家目录
vsftpd服务常见配置
访问端口设置
listen_port=XXX 默认端口为21
主动模式端口设置
connect_from_port_20=YES 主动模式端口为20
ftp_data_port=20 (默认) 指定主动模式的端口
被动模式端口设置
  • linux ftp 客户端默认使用被动模式
  • windows ftp 客户端默认使用主动模式
pasv_min_port=6000   0为随机分配,端口范围会影响客户端的并发数
pasv_max_port=6010
时间设置
use_localtime=YES 使用当地时间(默认为NO,使用GMT)
匿名用户设置
anonymous_enable=YES 支持匿名用户,CentOS8 默认不允许匿名
no_anon_password=YES 匿名用户略过口令检查 , 默认NO
anon_upload_enable=YES 匿名上传,注意:文件系统权限
anon_mkdir_write_enable=YES 匿名建目录
anon_world_readable_only=NO 只能下载全部读的文件, 默认YES
anon_umask=0333 指定匿名上传文件的umask,默认077,注意:0333中的0不能省略
anon_other_write_enable=YES 可删除和修改上传的文件,默认NO
指定匿名用户的上传文件的默认的所有者和权限
chown_uploads=YES        #默认NO
chown_username=wang
chown_upload_mode=0644
Linux系统用户权限设置
local_enable=YES 是否允许linux用户登录
write_enable=YES 允许linux用户上传文件
local_umask=022 指定系统用户上传文件的默认权限对应umask
将所有系统用户映射为指定的guest用户
guest_enable=YES 所有系统用户都映射成guest用户
guest_username=ftp   配合上面选项才生效,指定guest用户
local_root=/ftproot 指定guest用户登录所在目录,但不影响匿名用户的登录目录
user_config_dir=/etc/vsftpd/conf.d/ 每个用户独立的配置文件目录,需要新建立文件包含local_root=XXX的信息
禁锢系统用户
#禁锢所有系统用户在家目录中
chroot_local_user=YES #禁锢系统用户,默认NO,即不禁锢
#禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反
chroot_list_enable=YES     #默认是NO
chroot_list_file=/etc/vsftpd/chroot_list   #默认值
  
当chroot_local_user=YES和chroot_list_enable=YES时,则chroot_list中用户不禁锢,即白名单
当chroot_local_user=NO和chroot_list_enable=YES时, 则chroot_list中用户禁锢,即黑名单
日志设置
#wu-ftp 日志:默认启用
xferlog_enable=YES #启用记录上传下载日志,此为默认值
xferlog_std_format=YES #使用wu-ftp日志格式,此为默认值
xferlog_file=/var/log/xferlog #可自动生成, 此为默认值
#vsftpd日志:默认不启用
dual_log_enable=YES 使用vsftpd日志格式,默认不启用
vsftpd_log_file=/var/log/vsftpd.log 可自动生成, 此为默认值
提示信息设置
#登录前提示信息
ftpd_banner="welcome to mage ftp server"
banner_file=/etc/vsftpd/ftpbanner.txt  
#目录访问提示信息
dirmessage_enable=YES #此为默认值
message_file=.message #信息存放在指定目录下.message ,此为默认值,只支持单行说明
基于PAM模块实现用户访问控制
pam_service_name=vsftpd
#pam配置文件:/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers 默认文件中用户拒绝登录,默认是黑名单,但也可以是白名单
登录白名单
userlist_enable=YES   此为默认值
userlist_deny=YES(默认值) 黑名单,不提示口令,NO为白名单
userlist_file=/etc/vsftpd/user_list 此为默认值
指定服务运行用户
nopriv_user=nobody   此为默认值
最大并发数限制(用户连接)
max_clients=0 #最大并发连接数
max_per_ip=0 #每个IP同时发起的最大连接数
传输速率限制
anon_max_rate=0 匿名用户的最大传输速率,以字节为单位,比如:1024000表示1MB/s
local_max_rate=0 本地用户的最大传输速率
超时时间设置
connect_timeout=60 主动模式数据连接超时时长
accept_timeout=60 被动模式数据连接超时时长
data_connection_timeout=300 数据连接无数据输超时时长
idle_session_timeout=60 无命令操作超时时长
文本方式传输设置
  • 以文本方式传输文件时,会自动对文件进行格式转换,比如转换成windows的文本格式
  • 不建议使用文本方式,因为可能导致二进制文件内容被破坏
#启用此选项可使服务器在ASCII模式下实际对文件进行ASCII处理。
#默认是禁用,禁用后,服务器将假装允许ASCII模式,但实际上会忽略激活它的请求
ascii_upload_enable=YES
ascii_download_enable=YES
#下载时指定二进制格式:binary
vsftpd 虚拟用户

虚拟用户:给特定服务使用的用户帐号

  • 所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录
  • 各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

虚拟用户帐号的存储方式:

  • 文件:创建文本文件,奇数行为用户名,偶数行为密码,再被编码为hash 格式Berkeley DB database文件

    db_load -T -t hash -f vusers.txt vusers.d
    
  • 关系型数据库中的表中:实时查询数据库完成用户认证,vsftpd 支持mysql库:pam要依赖于pam-mysql

    /lib64/security/pam_mysql.so
    /usr/share/doc/pam_mysql-0.7/README
    
配置vsftpd虚拟用户步骤–基于文件
1.创建数据库存文件
#安装ftp server(3.0.2)
yum -y install vsftpd
#查看db_load命令来源
rpm -qf $(which db_load)
#创建虚拟用户库文件
vim  /etc/vsftpd/vusers.txt
Test1
123456
Test2
123456
#生成对应的库文件
db_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db
#修改权限
chmod 600 /etc/vsftpd/vuser.db
2.创建与虚拟用户对应的操作系统用户和FTP目录
#创建系统用户映射为虚拟用户,并设置家目录为/data/ftphome
useradd  /data/ftphome  -s /sbin/nologin -r vuser
#创建目录
mkdir -p /data/ftphome/Test
#设置acl权限
setfacl -m u:vuser:rwx /data/ftphome/Test
3.创建PAM配置文件
#创建pam配置文件
tee /etc/pam.d/vsftpd.db <<EOF
#检查用户是否存在vuser.db文件中
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
EOF
#修改vsftp配置文件,将默认调用的pam文件改为自己创建的pam文件
sed -ri "/(pam_service_name=).*/\1vsftp.db" /etc/vsftpd/vsftpd.conf
#新增配置条目,不允许系统用户登录,且操作系统账号全映射为vuser
echo "guest_enable=YES" >> /etc/vsftpd/vsftpd.conf
echo "guest_username=vuser" >> /etc/vsftpd/vsftpd.conf
#开放匿名权限(可选)
echo "anon_upload_enable=YES" >> /etc/vsftpd/vsftpd.conf
echo "anon_mkdir_write_enable=YES" >> /etc/vsftpd/vsftpd.conf
echo "anon_other_write_enable=YES" >> /etc/vsftpd/vsftpd.conf
#重启服务
systemctl restart vsftpd
4.为虚拟用户建立独立的配置文件
#为虚拟用户创建专用目录
mkdir -p /data/ftphome/Test1/
mkdir -p /data/ftphome/Test2/
#为虚拟用户创建独立的配置文件
tee /etc/vsfpd/conf.d/Test1.conf <<EOF
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/data/ftphome/Test1/
EOF
tee /etc/vsfpd/conf.d/Test2.conf <<EOF
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/data/ftphome/Test2/
EOF
#修改配置文件
echo "user_config_dir=/etc/vsftpd/conf.d/"

配置vsftpd虚拟用户步骤–基于mysql数据库
1.在数据库服务器上
主机IP地址备注
FTP-Server192.168.213.122ftp服务器
Mariadb-Server192.168.213.123数据库服务器
安装mysql数据库(Mysql有版本要求–8.0以下,8.0及以上没有password函数)
###安装mariadb-10.7
#生成数据库yum配置文件
tee /etc/yum.repos.d/mariadb.repo <<EOF
[mariadb]
name= MariaDB
baseurl= https://mirrors.aliyun.com/mariadb/yum/10.7/centos7-amd64
gpgkey=https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
#清除空字符和空行
sed -ri "s/ +//" /etc/yum.repos.d/mariadb.repo
#安装数据库
yum -y install MariaDB-server
#启动服务
systemctl enable --now mysqld
2.在数据库服务上配置数据库支持vsftpd服务
#创建ftp使用的用户库
CREATE DATABASE vsftpd
#创建虚拟用户表
CREATE TABLE users (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name CHAR(50) BINARY NOT NULL,
password CHAR(48) BINARY NOT NULL
);
#插入条目
INSERT INTO users(name,password) values('ftp_Test1',password('redhat@2020'));
INSERT INTO users(name,password) values('ftp_Test2',password('redhat@2021'));
INSERT INTO users(name,password) values('ftp_Test3',password('redhat@2022'));
#创建远程接入用户
create user ftp@'192.168.213.%' identified by 'redhat@2022';
#授权库vsftpd权限给用户ftp
grant all on vsftpd.* to ftp@'192.168.213.%';
#将权限提取到内存
FLUSH PRIVILEGES;
#修改root密码(新库没有密码)
alter user root@localhost identified by 'redhat@2022';
3.在FTP服务器上安装vsftpd 和 pam_mysql包
###在ftp-server服务器上安装vsftpd和pam_mysql模块
#查看yum源内是否有vsftp,并查看版本
yum info vsftpd
#安装vsftpd
yum -y install vsftpd
#编译安装pam-安装编译支持包
yum -y install gcc gcc-c++ make mariadb-devel pam-devel
#下载pam源码包
wget -P /apps http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
#解压pam源码包
cd /apps && tar xvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1/ && ./configure --with-pam-mods-dir=/lib64/security
#编译安装
make install 
4.在FTP服务器上建立pam认证所需文件
vi /etc/pam.d/vsftpd.mysql 
auth required pam_mysql.so user=ftp passwd=redhat@2022 host=192.168.213.123 db=vsftpd
table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=ftp passwd=redhat@2022  host=192.168.213.123 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
4.1 README文档命令解析
#crypt 加密方式:
0表示不加密
1表示crypt(3)加密
2表示使用mysql password()函数加密
3表示md5加密
4表示sha1加密
#配置字段说明
auth 表示认证
account 验证账号密码正常使用
required 表示认证要通过
pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后
面为给此模块传递的参数
user=vsftpd为登录mysql的用户
passwd=magedu 登录mysql的的密码
host=mysqlserver mysql服务器的主机名或ip地址
db=vsftpd 指定连接msyql的数据库名称
table=users 指定连接数据库中的表名
usercolumn=name 当做用户名的字段
passwdcolumn=password 当做用户名字段的密码
crypt=2 密码的加密方式为mysql password()函数加密
5.建立相应用户和修改vsftpd配置文件
#建立虚拟用户映射的系统用户
useradd -s /sbin/nologin -d /data/ftproot -r vuser
#创建目录
mkdir -p /data/ftproot/Test
#设置目录权限
setfacl -m u:vuser:rwx /data/ftproot/Test
#修改配置文件
vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd.mysql
#启动服务
systemctl enable --now vsftpd
6.在FTP服务器上配置虚拟用户具有不同的访问权限
#配置vsftpd为虚拟用户使用配置文件目录
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/conf.d/
#创建所需要目录,并为虚拟用户提供配置文件
mkdir /etc/vsftpd/conf.d/
#配置虚拟用户配置文件
vim /etc/vsftpd/conf.d/ftp_Test1
anon_upload_enable={YES|NO}
anon_mkdir_write_enable={YES|NO}
anon_other_write_enable={YES|NO}
local_root=/data/ftp_Test1
#创建目录并授权
mkdir /data/ftp_Test1 && setfacl -m u:vuser:rwx /data/ftp_Test1
一键部署VSftp Server脚本
#!/bin/bash
#####该脚本需要链接外网,通过epel源完成软件安装
#####基于mysql的vsftp虚拟用户服务器
. /etc/init.d/functions
###Mysql相关变量
#Mysql服务器IP
Mysql_Server_IP="192.168.213.123"
#Mysql服务器密码
Mysql_Server_paswd="redhat"
#Mysql数据库管理员用户
Mysql_user="root"
#Mysql数据库管理员密码
Mysql_passwd="redhat@2022"
###Vsftp相关变量
#映射的虚拟用户
Ftp_Vuser="vuser"
#虚拟用户列表
ftp_userlist="/data/user_list.txt"
#pam_mysql软件包名称
software_pam="pam_mysql-0.7RC1"
suffix="tar.gz"
#远程连接用户
long_user="ftp"
long_user_passwd="redhat@2022"
#授权网段
long_IP_segment=${Mysql_Server_IP%.*}

function check_env()
{
    echo "开始执行环境检查............................."
    #检查网络状态
    if ping -w1 -c1 www.baidu.com &> /dev/null ;then
       #检查yum仓库是否可用
       yum makecache &> /dev/null || { echo "yum不可用";exit; }
       action "仓库状态"
       else
       action "外网连通性" false
       exit
    fi
    #软件安装
    yum -q -y install sshpass vsftpd gcc gcc-c++ make mariadb-devel pam-devel
    #检查对端是否有mysql数据库
    if nmap -p -T:3306 "$Mysql_Server_IP" | grep -q -i "open.*mysql";then
       mysql_type="0"
    fi
    #检查用户文件
    [ ! -f "$ftp_userlist" ] && { mkdir /data/;touch "$ftp_userlist"; }
    #生成测试用户
    tee  "$ftp_userlist" << EOF
    UserName        Passwd
    zhangsan        Test123
    lisi            Test456
    wangmazi        Test789
EOF
    #删除开头的空字符
    sed -ri "s/^ +//" "$ftp_userlist"
    action "环境检查............"
}

function deploy_mysql()
{
    if [[ $mysql_type =~ 0 ]];then
        echo "检查到对端已有数据库,开始创建vsftpd相关库与插入条目............................"
        #创建库vsftpd
        sshpass -p "$Mysql_Server_paswd" ssh root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\" -p\"$Mysql_passwd\" -e \"CREATE DATABASE vsftpd\"" && action "相关库创建"
        #插入表users
        sshpass -p "$Mysql_Server_paswd" ssh root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\" -p\"$Mysql_passwd\" -e \" 
        CREATE TABLE vsftpd.users (
            id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
            name CHAR(50) BINARY NOT NULL,
            password CHAR(48) BINARY NOT NULL
            )'\"
        " && action "users表创建"
        #插入条目
        while read -r User Passwd;do
        sshpass -p "$Mysql_Server_paswd" ssh -n root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\" -p\"$Mysql_passwd\" -e \"INSERT INTO users(name,password) values('$User',password('$Passwd'));\""
        done <<< "$(tail -n +2 "$ftp_userlist")" && action "测试用户条目"
        #创建远端接入用户
        sshpass -p "$Mysql_Server_paswd" ssh root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\" -p\"$Mysql_passwd\" -e \"create user $long_user@'$long_IP_segment.%' identified by \"$long_user_passwd\";\""
        #授权
        sshpass -p "$Mysql_Server_paswd" ssh root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\" -p\"$Mysql_passwd\" -e \"grant all on vsftpd.* to $long_user@'$long_IP_segment.%';\""
        #输出列表
        echo -e "部署完成,ftp用户列表如下:"
        sshpass -p redhat ssh root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\"  -p\"$Mysql_passwd\" -e \"select id,name from vsftpd.users;\""
    else
        #生成数据库YUM仓库配置文件
        echo "开始生成数据库YUM源......";sleep  3
        tee /etc/yum.repos.d/mariadb.repo <<EOF
        [mariadb]
        name=MariaDB
        baseurl=https://mirrors.aliyun.com/mariadb/yum/10.7/centos7-amd64
        gpgkey=https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB
        gpgcheck=1
EOF
        sed -ri "s/ +//" /etc/yum.repos.d/mariadb.repo && action mariadbYUM源
        echo "开始在$Mysql_Server_IP安装数据库............................"
        #复制源到对端存储,并安装数据库
        sshpass -p "$Mysql_Server_paswd" scp /etc/yum.repos.d/mariadb.repo "$Mysql_Server_IP":/etc/yum.repos.d/mariadb.repo
        #安装数据库,并启动数据库
        sshpass -p "$Mysql_Server_paswd" ssh root@"$Mysql_Server_IP" "yum -q -y install MariaDB-server && systemctl enable --now mysqld" && action "Maiadb安装"
        echo "开始创建vsftp相关库............................";sleep 3
        #创建库vsftpd
        sshpass -p "$Mysql_Server_paswd" ssh root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\"  -e \"CREATE DATABASE vsftpd\"" && action "相关库创建"
        #插入表users
        sshpass -p "$Mysql_Server_paswd" ssh root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\"  -e \"
        CREATE TABLE vsftpd.users (
            id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
            name CHAR(50) BINARY NOT NULL,
            password CHAR(48) BINARY NOT NULL
            );\"
        " && action "users表创建"
        #插入条目
        while read -r User Passwd;do
        sshpass -p "$Mysql_Server_paswd" ssh -n root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\" -e \"INSERT INTO vsftpd.users(name,password) values('$User',password('$Passwd'));\""
        done <<< "$(tail -n +2 "$ftp_userlist")" && action "测试用户条目"
        #创建远端接入用户
        sshpass -p "$Mysql_Server_paswd" ssh root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\"  -e \"create user $long_user@'$long_IP_segment.%' identified by \"$long_user_passwd\";\""
        #授权
        sshpass -p "$Mysql_Server_paswd" ssh root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\"  -e \"grant all on vsftpd.* to $long_user@'$long_IP_segment.%';\""
        #初始化数据库密码
        sshpass -p "$Mysql_Server_paswd" ssh root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\" -e \"alter user root@localhost identified by 'redhat@2022';\"" && action "初始化数据库"
    fi
        #验证
        sshpass -p redhat ssh 192.168.213.123 "mysql -uroot -p"redhat@2022" -e \"show tables from vsftpd;\"" &> /dev/null &&\
        action vsftpd相关库
        #列表输出
        echo -e "部署完成,ftp用户列表如下:"
        sshpass -p redhat ssh root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\"  -p\"$Mysql_passwd\" -e \"select id,name from vsftpd.users;\""
}

function deploy_pam()
{
    #下载源码包
    wget -P /apps http://prdownloads.sourceforge.net/pam-mysql/"$software_pam"."$suffix" &> /dev/null 
    #解压pam源码包
    cd /apps && tar -xvf "$software_pam"."$suffix"
    #编译软件
    cd "$software_pam" && ./configure --with-pam-mods-dir=/lib64/security
    #安装
    make install
    #修改pam配置文件
    tee /etc/pam.d/vsftpd.mysql <<EOF
    auth required pam_mysql.so user=ftp passwd=redhat@2022 host=$Mysql_Server_IP db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
    account required pam_mysql.so user=ftp passwd=redhat@2022  host=$Mysql_Server_IP db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
EOF
    #删除开头的空字符
    sed -ri "s/^ +//" /etc/pam.d/vsftpd.mysql
    #建立虚拟用户映射的系统用户
    useradd -s /sbin/nologin -d /data/ftproot -r "$Ftp_Vuser"
    #创建目录
    mkdir -p /data/ftproot/Test
    #设置目录权限
    setfacl -m u:"$Ftp_Vuser":rwx /data/ftproot/Test
    #修改主配置文件
    sed -ri.bak "s/(pam_service_name.*)/#\1/" /etc/vsftpd/vsftpd.conf
    {
    echo "guest_enable=YES";
    echo "guest_username=vuser"; 
    echo "pam_service_name=vsftpd.mysql";
    echo "user_config_dir=/etc/vsftpd/conf.d/";
    echo "allow_writeable_chroot=YES";
    } >> /etc/vsftpd/vsftpd.conf
    #创建虚拟用户目录
    mkdir /etc/vsftpd/conf.d/
    while read -r User Passwd;do
        mkdir /data/"$User" && setfacl -m u:vuser:rwx /data/"$User"
        tee /etc/vsftpd/conf.d/"$User" <<EOF
        anon_upload_enable=YES
        anon_mkdir_write_enable=YES
        anon_other_write_enable=YES
        local_root=/data/ftproot/$User
EOF
    #删除开头的空字符
    sed -ri "s/^ +//" /etc/vsftpd/conf.d/"$User"
    #授权vuser用户权限
    setfacl -m u:"$Ftp_Vuser":rwx /data/ftproot/"$User"
    done <<< "$(tail -n +2 "$ftp_userlist")"
    #启动vsftp服务
    systemctl enable --now vsftpd
}

function add_vuser()
{
    
    read -r -p "添加单个用户还是批量添加用户:(single/batch)" Options
    case $Options in
    single|sin)
    read -r -p "请输入新增的用户名称:" Add_User
    read -r -s -p "请输入新增用户的密码:" Add_User_passwd
    #添加mysql用户条目
    sshpass -p "$Mysql_Server_paswd" ssh -n root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\" -p\"$Mysql_passwd\" -e \"INSERT INTO vsftpd.users(name,password) values('$Add_User',password('$Add_User_passwd'));\""
    #添加用户配置文件
    tee /etc/vsftpd/conf.d/"$Add_User" <<EOF
        anon_upload_enable=YES
        anon_mkdir_write_enable=YES
        anon_other_write_enable=YES
        local_root=/data/ftproot/$Add_User
EOF
    sed -ri "s/^ +//" /etc/vsftpd/conf.d/"$Add_User"
    [ -d /data/ftproot/"$Add_User" ] || mkdir /data/ftproot/"$Add_User"
    setfacl -m u:"$Ftp_Vuser":rwx /data/ftproot/"$Add_User"
    ;;
    batch|bat)
    local add_userlist 
    add_userlist=/data/add_userlist.txt
    if [ ! -e $add_userlist ];then
    echo -e "#第一列输入用户名称,第二列输入用户密码,中间请用空格隔离开;\n用户名称          密码" > $add_userlist
    fi
    vim "$add_userlist"
    if [ -e "$add_userlist" ];then
        while read -r User Passwd;do
        #解决ID不连续问题
        sshpass -p "$Mysql_Server_paswd" ssh -n root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\" -p\"$Mysql_passwd\" -e \"ALTER TABLE vsftpd.users AUTO_INCREMENT=1\""
        sshpass -p "$Mysql_Server_paswd" ssh -n root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\" -p\"$Mysql_passwd\" -e \"INSERT INTO vsftpd.users(name,password) values('$User',password('$Passwd'));\""
        tee /etc/vsftpd/conf.d/"$Add_User" <<EOF
        anon_upload_enable=YES
        anon_mkdir_write_enable=YES
        anon_other_write_enable=YES
        local_root=/data/ftproot/$User
EOF
    sed -ri "s/^ +//" /etc/vsftpd/conf.d/"$User"
    [ -d /data/ftproot/"$User" ] || mkdir /data/ftproot/"$User"
    setfacl -m u:"$Ftp_Vuser":rwx /data/ftproot/"$User"
        done <<< "$( awk 'NR>2{print $0}' "$add_userlist")"
    fi 
        action "用户添加"
        echo "当前用户列表如下:"
        mysql -u$long_user -p"$long_user_passwd" -h "$Mysql_Server_IP" -e "select name from vsftpd.users;"
    ;;
    esac
}

function del_vuser()
{
    #列出当前用户列表:
    echo -e "ftp用户列表如下:"
        sshpass -p redhat ssh root@"$Mysql_Server_IP" "mysql -u\"$Mysql_user\"  -p\"$Mysql_passwd\" -e \"select id,name from vsftpd.users;\""
    read -r -p "请输入虚删除的用户名称:" DelName
        mysql -u$long_user -p"$long_user_passwd" -h "$Mysql_Server_IP" -e "select name from vsftpd.users;" |grep "$DelName" || { action "用户存在";range 0; } 
        mysql -u$long_user -p"$long_user_passwd" -h "$Mysql_Server_IP" -e "delete from vsftpd.users where name=\"$DelName\"" &&\
        action "删除用户"
        echo "当前用户列表如下:"
        mysql -u$long_user -p"$long_user_passwd" -h "$Mysql_Server_IP" -e "select name from vsftpd.users;"
}

PS3="请选择:(1-6):"
select MENU in 一键安装 单独部署数据库 单独部署vsftp 增加虚拟用户 删除虚拟用户 退出 ;do
case $REPLY in
1)
    check_env
    deploy_mysql
    deploy_pam
    ;;
2)
    check_env
    deploy_mysql
    ;;
3)
    check_env
    deploy_pam
    ;;
4)
    add_vuser
    ;;
5)
    del_vuser
    ;;
6)
    exit
    ;;
esac
done

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值