-----------业务需求-------
1、需求1: 数据共享。用户a用 ftp提交文件,其他用户通过ftp可以下载文件。到期不让用户下载文件。
2、需求2: 数据汇交。不同用户连ftp将自己汇交的文件提交到自己的目录,然后指定一个用户连ftp去收集那些用户的文件。
-----------实现方案-----------
用vsftpd +MySQL虚拟用户实现
----------踩坑之路,十分心酸-----
在弄vsftpd的时候,遇到了很多问题,都是遇到一个,百度查阅一个,解决一个。
----------vsftpd安装------
大概是三步。
1.安装mysql。建张存放虚拟用户的表ftpuser,存放虚拟用户的账号密码。密码可以明文、password、md5值,跟pam.d文件配置对应。
2.安装vsftpd。安装完,/etc/vsftpd/vsftpd.conf要配置用户权限文件夹,pam.d模块等信息。
3.安装vsftpd MySQL pam.d 的安全模块。配置mysql虚拟用户表的相关信息。
百度很多安装的文章(搜索关键字 :vsftpd mysql虚拟用户),找了大概的一篇(因为也不是我安装的基础环境,所以这边细的不懂)
https://www.cnblogs.com/lvzhenjiang/articles/14406450.html
----------开发思路与步骤------
下面步骤都是在java代码里实现(不是直接在linux那边操作)。
1.java代码里用root用户去创建用户权限文件夹,以及创建用户权限文件。(百度有相关的java操作linux的帮助类)
2.根据读写需求,写虚拟用户的权限文件内容。往mysql 建的用户表写用户账号密码。只有mysql里账号密码对了+有权限文件,以及对应的权限,用户才能登陆上分配给他对应的目录。
3. java代码里,设置创建的ftp文件夹的归属用户,第一步创建的是root用户的,要改成虚拟用户映射用户(比如说用户是 ftpuser)以及组的权限,让文件夹变成这个用户和组的,才有权限写文件。
修改目录以及子子目录的归属。chown -R ftpuser:ftpuser /data/ftpuser
(chown -R 用户:组 目录)
4. 设置用户不能访问ftp。相当于说是 没有权限,就是把用户从mysql ftpuser表数据里删了。没删权限文件跟提交的文件。
--------遇到的问题-------
-----Ftp登陆不上----
Mysql密码加不加密,就看pam.d加密函数与mysql版本的加密函数是否一样,一样才有用。
-------
问题:输入ftp地址-用户密码后转到家目录报错。(家目录,指的是分配给他的路径目录)
错误:
响应: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
错误: 严重错误: 无法连接到服务器
解决:
用户配置加allow_writeable_chroot=YES
---------
问题:文件上传-修改出错
错误:ftp上传(553 Could not create file.) 修改(550 Rename failed.)
解决:把ftp的路径(比如:/data/ftpuser),目录赋给ftp的虚拟用户ftpuser。(在root用户登录的情况,赋予opt目录给liuhai这个用户权限)。
没给之前,文件夹归属显示的是root root。设置之后,是ftpuser的。
chown -R ftpuser:ftpuser /data/ftpuser
--------
问题:自己能上传下载文件,其他人不能下载。
原因:因为linux对文件权限有控制,需要设置文件的属性,支持其他用户操作。
解决:
因为是每个用户提交的文件,所以不能也不现实说用户提交一个文件,然后通过Linux命令去修改属性。
vsftpd有个控制虚拟用户对文件的权限 配置anon_umask=022 后面这个数字表示linux.权限777-022=755,755的权限。
-----vsftpd 虚拟用户-写的--权限--------
# 虚拟用户根目录(家目录)
local_root=/data/ftpuser/test
# 允许写入
write_enable=YES
# 允许下载
download_enable=YES
# 允许上传
anon_upload_enable=YES
# 允许新建文件夹
anon_mkdir_write_enable=YES
# 允许删除_修改等操作
anon_other_write_enable=YES
# 允许在根目录下操作。
allow_writeable_chroot=YES
# 虚拟用户的权限,这样写出来的文件其他人才能下载。linux的文件属性
anon_umask=022
------linux chown详解-------
chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。系统管理员经常使用chown命令,在将文件拷贝到另一个用户的名录下之后,让用户拥有使用该文件的权限。
1.命令格式:
chown [选项]...[所有者][:[组]]文件...
2.命令功能:
通过chown改变文件的拥有者和群组。在更改文件的所有者或所属群组时,可以使用用户名称和用户识别码设置。普通用户不能将自己的文件改变成其他的拥有者。其操作权限一般为管理员。
3.命令参数:
必要参数:
-c显示更改的部分的信息
-f忽略错误信息
-h修复符号链接
-R处理指定目录以及其子目录下的所有文件
-v显示详细的处理信息
-deference作用于符号链接的指向,而不是链接文件本身
选择参数:
--reference=<目录或文件>把指定的目录/文件作为参考,把操作的文件/目录设置成参考文件/目录相同拥有者和群组
--from=<当前用户:当前群组>只有当前用户和群组跟指定的用户和群组相同时才进行改变
--help显示帮助信息
--version显示版本信息