proftp 似乎很少LINUX 发行版会只用,不过国内的redflag-linux 非常奇葩的使用了proftp,你不就是将readhat进行修改再次发行的么,为啥使用另类的proftp而不使用vsftp。不过工作中遇到,虽然没有用到过也得解决。由于写该博客的时候没有链接在生产上,这里我下载相应的版本在我RHEL6下进行测试。
一 要求
开发项目组要求使用每个人有自己的目录,相互之间没有权限。且使用虚拟用户进行管理。在这里首先考虑使用相对简单的使用文件方式进行认证。
二 配置
编辑proftpd.conf文件
添加: AuthUserFile /opt/proftpd/passwd
AuthGroupFile /opt/proftpd/group
RequireValidShell off --应为为虚拟用户,我们在添加的时候应该将其默认shell设置为fale,这里不添加此参数将导致虚拟用户无法登录
#AuthOrder mod_auth_file.c mod_auth_unix.c --有些文章说需要加上该参数,或许版本有差异,在这里我的版本不需要,此处暂不讨论
创建密码文件: 如果你是使用系统默认的安装包,可能没有ftpasswd工具,此时你可以去官方下载源码包,提取该文件到服务器。
ftpasswd --passwd --file=/opt/proftpd/passwd --name=test1 --uid=3001 --gid=3000 --home=/home/ftp/u1 --shell=/bin/false #添加用户
#ftpasswd --group --file=/opt/proftpd/group --name=group1 --gid=3000 #创建组group1,GID为3000
#ftpasswd --group --name=group1 --gid=3000 --member=test1
这里我没有使用它的group文件,只是在创建用户时指定了其主组,以在完成不同用户之间的权限以及组之间的权限。
--passwd 指定建立一个新的虚拟用户
--file 指定存储虚拟用户的文件;
--name 指定此虚拟用户的用户名,密码会在命令执行时要求输入;
--uid 指定此虚拟用户对应的系统用户UID,此虚拟用户将以此系统UID的身份读写文件
--gid 指定此虚拟用户对应的系统用户GID,此虚拟用户将以此系统GID的身份对其他本组用户读写文件
--home 指定此虚拟用户的根目录,就是其登陆FTP后的根目录;
--shell 指定此虚拟用户的shell,为了安全当然指定一个不可登陆的shell
三 测试
下面我们创建多个用户进行测试
组一:
ftpasswd --passwd --file=/opt/proftpd/passwd --name=test1 --uid=3001 --gid=3000 --home=/home/ftp/u1 --shell=/bin/false
ftpasswd --passwd --file=/opt/proftpd/passwd --name=test2 --uid=3002 --gid=3000 --home=/home/ftp/u2 --shell=/bin/false
mkdir /home/ftp/u1; chown 3001:3000 /home/ftp/u1 ;
mkdir /home/ftp/u2; chown 3002:3000 /home/ftp/u2
组二:
ftpasswd --passwd --file=/opt/proftpd/passwd --name=test3 --uid=4001 --gid=4000 --home=/home/ftp/u3 --shell=/bin/false
ftpasswd --passwd --file=/opt/proftpd/passwd --name=test4 --uid=4002 --gid=4000 --home=/home/ftp/u4 --shell=/bin/false
mkdir /home/ftp/u3; chown 4001:4000 /home/ftp/u3
mkdir /home/ftp/u4; chown 4001:4000 /home/ftp/u4
chmod 750 /home/ftp/ -R
四 结果
这里的结果当然是准确按照上面的测试进行,我使用的是filezilla进行测试,就懒得截图了,索性给大家讲结果
所有的目录由于权限是: 750
test1 对u1 目录具有所有权限,可以对u2进行读操作,对u3,u4没有任何权限,无法看到里面的内容。其他用户同理。
五 添加用户和目录脚本
#!/bin/bash
#
echo -n "the group you have:"
echo ""
cat /opt/proftpd/passwd | awk -F ':' '{print $4}' | uniq
read -p "input the GID is : " g
while true
do
echo ""
echo ""
read -p "input username and passwd like (zhang qiang): " u p
cat /opt/proftpd/passwd | grep $g | awk -F ':' '{print $3}' |sort| uniq > /tmp/uid
a=`cat /opt/proftpd/passwd | grep $g | wc -l`
if [ $a -gt 0 ]
then
id=`tail -n 1 /tmp/uid`
let uid=id+1
echo "have"
else
let uid=$g+1
echo "do not have"
fi
echo "$p" | ftpasswd --passwd --file=/opt/proftpd/passwd --name=$u --uid=$uid --gid=$g --home=/home/ftp/$u --shell=/bin/false --stdin
mkdir /home/ftp/$u
chown $uid:$g /home/ftp/$u
chmod 750 /home/ftp/$u
echo ""
echo "you have create user: `echo -e $u `"
echo "password is: `echo $p `"
echo "user id is: `echo $uid `"
echo "group id is: `echo $g `"
echo "home is: `echo /home/ftp/$u `"
done
这里没有对输入进行判断,自己使用的时候输入正确的内容,或自己添加相应的判断