1、安装多用户vsftpd服务
安装环境:centos 6.9
yum install vsftpd -y
cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
chroot_local_user=YES
guest_enable=YES
guest_username=virftp
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
2、创建一个普通的系统用户:
useradd -s /sbin/nologin virftp #指定用户的shell为nologin,不允许登录
3、创建虚拟ftp用户配置文件:
vim /etc/vsftpd/vsftpd_login
ty #奇数行 写用户名
123 #偶数行 写密码
test2 #多个用户就写多组,中间不能有空行和空格
456
4、更改权限:
chmod 600 /etc/vsftpd/vsftpd_login
5、将文本文件转换成二进制文件:
db_load -T -t hash -f /etc/vsftpd/vsftpd_login /etc/vsftpd/vsftpd_login.db
6、创建虚拟用户的配置文件目录:
mkdir /etc/vsftpd/vsftpd_user_conf
cd /etc/vsftpd/vsftpd_user_conf
#创建虚拟用户的配置文件:
vim ty #此处的文件名必须和/etc/vsftpd/vsftpd_login文件里的用户名一致。
#加入以下配置文件内容
anon_upload_enable=NO
anon_mkdir_write_enable=NO
idle_session_timeout=600
data_connection_timeout=120
max_clients=10
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
chroot_local_user=YES
local_root=/data/ftpdata/ty/
7、创建虚拟ftp用户的家目录,并创建测试文件
mkdir /data/ftpdata/ty/
echo "test ty" >/data/ftpdata/ty/test.txt
8、级联更改系统用户virftp家目录的属主属组
chown -R virftp:virftp /data/ftpdata/ty/
9、定义用户验证文件路径
vim /etc/pam.d/vsftpd 编辑ftp的用户认证文件
session optional pam_keyinit.so force revoke
session required pam_loginuid.so
session include password-auth
auth sufficient pam_userdb.so db=/etc/vsftpd/vsftpd_login #指定密码验证形式为文件形式,并指定路径路径
account sufficient pam_userdb.so db=/etc/vsftpd/vsftpd_login #指定账户存储形式为文件,并指定账户存储文件路径
10、启动vsftpd服务
/etc/init.d/vsftpd start
11、filezilla客户端连接登陆测试
略
12、附上部分管理脚本
#!/bin/bash
#-------------------------------------------
#Author:holger
#Date:2019-09
#Describe:用于创建ftp账户
#Version: V1.0
# 根据不同的项目创建单独的FTP账号、权限
#
#Version: V2.0
# 1、根据不同的用户创建不同的账号、权限
# 2、多个用户共同管理一个项目
# 3、一个用户负责多个项目
#-------------------------------------------
Printf(){
color=${1:-31}
content=$2
echo -e "\e[${color}m$content\e[0m"
}
Help(){
Printf "32" "\n\tusage: sh $0 add|del \$username \$permission"
Printf "32" "\n\tExamples:"
Printf "32" "\t\tsh $0 add testftp r #只读权限"
Printf "32" "\t\tsh $0 add testftp rw #读写权限"
Printf "32" "\t\tsh $0 del testftp #删除用户\n"
}
User_add(){
#Username=$1
case $Permission in
r)
Per=NO
;;
rw)
Per=YES
;;
*)
Printf "31" "Error: permission should be 'r'(read) or 'rw'(read and write) "
Printf "31" "Error: please try again"
Help
exit
esac
tmpPassword=`openssl rand -base64 12`
Password=${Username}@${tmpPassword}
user_config=/etc/vsftpd/vsftpd_login
grep -wq $Username $user_config >/dev/null
[ $? -eq 0 ]&&{ Printf "" "Error: user $Username aready exist";exit; }||{ Printf "32" "add"; }
echo -e "$Username\n$Password" >>/etc/vsftpd/vsftpd_login
db_load -T -t hash -f /etc/vsftpd/vsftpd_login /etc/vsftpd/vsftpd_login.db
cat > /etc/vsftpd/vsftpd_user_conf/$Username <<EOF
anon_upload_enable=NO
anon_mkdir_write_enable=NO
idle_session_timeout=600
data_connection_timeout=120
max_clients=10
anonymous_enable=NO
local_enable=YES
write_enable=$Per
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
chroot_local_user=YES
local_root=/data/ftpdata/$Username/
EOF
mkdir /data/ftpdata/$Username/package -p
echo "welcome $Username" >/data/ftpdata/$Username/test.txt
chown -R virftp:virftp /data/ftpdata/$Username
echo -e "user: \e[32;1m$Username\e[0m Password: \e[32;1m$Password\e[0m"
}
main(){
if [ $# -lt 3 ];then
Help
exit
fi
action=$1
Username=$2
Permission=$3
case $action in
add)
User_add $Username $Permission
if [ $? -ne 0 ];then
Printf "" "add user $Username Failed"
exit
else
Printf "32" "add user $Username success"
fi
;;
del)
echo "delete $Username ?"
read -p "Please enter yes/no: " choice
[[ -d /data/ftpdata/$Username && -f /etc/vsftpd/vsftpd_user_conf/$Username ]]||{ Printf "" "Error: user $Username not exist";exit; }
case $choice in
[Yy][Ee][Ss])
rm /data/ftpdata/$Username -fr
rm /etc/vsftpd/vsftpd_user_conf/$Username -f
sed -i "/$Username\$/d" /etc/vsftpd/vsftpd_login
sed -i "/$Username@/d" /etc/vsftpd/vsftpd_login
;;
*)
Printf "" "Error: wrong choice,delete failed"
exit
esac
;;
*)
echo "wrong args"
exit
esac
/etc/init.d/vsftpd restart
}
main $*