网络文件共享服务-FTP
FTP文件传输协议
FTP工作原理介绍
-
文件传输协议:File Transfer Protocol 早期的三个应用级协议之一,基于C/S结构
-
数据传输格式:二进制(默认)和文本
-
双通道协议:命令和数据连接
-
两种模式:从服务器角度
-
主动(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-Server | 192.168.213.122 | ftp服务器 |
Mariadb-Server | 192.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