java ftp文件上传总结
在centos上搭建了ftp服务很简单yum装的 几步搞定
在用java上传文件的时候遇到一些坑总结一下,以后也可以翻看。希望能帮到一些新手
老手可能不屑这些基础的东西。写出来相信还是有价值,分享还是很重要的。
首先ftp配置理一理
在配置文件中 vim /etc/vsftpd/vsftpd.conf
#锁定用户到各自目录为其根目录
chroot_local_user=YES
#chroot_list_enable=YES
chroot_list_enable=NO
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
这段配置纠结了很久,最后静下心认真看了下属性
参考此篇 摘抄如下
圈起来满足我的条件 所以我的配置是 chroot_local_user=YES 注释掉#chroot_list_enable=YES 就相当于#chroot_list_enable=NO
另外在一些网站上发现有人说chroot_list是个文件夹,里面放用户名命名的文件 文件里面放用户的限定目录 比如这样
实践过这样没什么卵用的。不明白这个ftp具体的实现。所以只能一个个试,经验是真的很重要。
最后改成chroot_list是个文件 里面放ftp用户名
[aaa@qq.com_201_13_centos chroot_list]# cd /etc/vsftpd/
[aaa@qq.com_201_13_centos vsftpd]# ll
total 28
-rw-r--r-- 1 root root 14 May 25 12:04 chroot_list
-rw------- 1 root root 125 May 25 11:06 ftpusers
drwxr-xr-x 2 root root 4096 May 24 18:20 userconfig
-rw-r--r-- 1 root root 376 May 25 16:47 user_list
-rw------- 1 root root 4837 May 25 16:57 vsftpd.conf
-rwxr--r-- 1 root root 338 Mar 22 2017 vsftpd_conf_migrate.sh
[aaa@qq.com_201_13_centos vsftpd]# cat chroot_list
ftpuser2
ftpuser1
上头解释是是否限制在主目录下的用户名单 摘抄一下详细说明
chroot_list_file=/etc/vsftpd/chroot_list #是否限制在主目录下的用户名单,至于是限制名单还是排除名单,这取决于chroot_local_user的值,我们可以这样记忆: chroot_local_user总是一个全局性的设定,其为YES时,全部用户被锁定于主目录,其为NO时,全部用户不被锁定于主目录。那么我们势必需要在全局设定下能做出一些“微调”,即,我们总是需要一种“例外机制”,所以当chroot_list_enable=YES时,表示我们“需要例外”。而”例外“的含义总是有一个上下文的,即,当”全部用户被锁定于主目录“时(即chroot_local_user=YES),”例外”就是:不被锁定的用户是哪些;当”全部用户不被锁定于主目录”时(即chroot_local_user=NO),”例外”“就是:要被锁定的用户是哪些。这样解释和记忆两者之间的关系就很清晰了!
另外在/etc/vsftpd/目录下还有个文件ftpusers 来看一看
[root@VM_201_13_centos vsftpd]# cat ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
注意打头的注释 # Users that are not allowed to login via ftp 翻译就是不允许通过ftp登录的用户 这里相当于一个黑名单
重点来了。之前调试的时候用java代码上传死活不成功。明明登录成功了。最后查明是权限问题。请把对应用户的家目录权限改成可写。问题解决。
这就是为什么工具可以连接上传,但是代码里面死活不行的终极原因。这里浪费了我很多时间,希望你能吸取教训。
有需要可以联系我相互学习一下我写的ftp工具类。给不给看我心情咯。花了很多时间修改完善,已经很完美了。网上好像还没有这种拿来就能用的例子。感觉都可以去卖钱。财迷。受不了~ 第一次写自己jar包工具。也发现很多不足。纪念一下。
关于限定不同用户访问不同根目录的问题。其实一开始纠结在以为是可以在ftp里面配置不同用户的家目录。其实没那么麻烦就是新建用户时候指定的目录。这里给出命令,下次自己也能直接用。有大神同事建议我用虚拟用户。搜了一下感觉挺麻烦要认证啥的就放弃了。这个搞一半也不甘心。一条道走到黑
添加用户 指定家目录
useradd -d /data/webapp_share/ -s /sbin/nologin wechat
passwd wechat
关于ftp的主动模式和被动模式 详细的自己百度一哈
大概是这么回事
主动FTP:
命令连接:客户端 >1023端口 -> 服务器 21端口
数据连接:客户端 >1023端口 <- 服务器 20端口
被动FTP:
命令连接:客户端 >1023端口 -> 服务器 21端口
数据连接:客户端 >1023端口 -> 服务器 >1023端口
有些情况下只能用被动模式。
配置文件里搞一搞
listen_port=2121
#local_root=/data/webapp_share/
anon_root=/tmp/
pasv_min_port=10000
pasv_max_port=10005
这里listen_port=2121是自己指定的端口号
最大最小端口指明
还有个属性打开忘记了百度一哈
local_enable=YES (NO)
這個設定值必須要為 YES 時,在 /etc/passwd 內的帳號才能以
實體用戶的方式登入我們的 vsftpd 主機喔!
发现这篇配置说明也很全鸟哥的可惜繁体的 参考一下
注意注释掉的哪一行#local_root 这里如果不注释掉 所有用户登录都会到/data/webapp_share/这个目录底下
限定不同用户访问不同目录总结一下: 新建用户的时候就设置好家目录,vim /etc/vsftpd/vsftpd.conf 配置文件里面修改
#锁定用户到各自目录为其根目录
chroot_local_user=YES
#chroot_list_enable=YES
chroot_list_enable=NO
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
即上面那篇文章里面说的所有用户限定自己的家目录。这样ftp登录的时候就能到各自的家目录。哎,这点折腾了好久。主要是第一个思维影响。
关于:
响应: 331 Please specify the password.
命令: PASS *********
响应: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
错误: 严重错误: 无法连接到服务器
状态: 已从服务器断开
参考此篇 权限问题修改目录权限或者配置文件中增加:allow_writeable_chroot=YES
user_list:位于/etc/vsftpd目录下。该文件里的用户账户在默认情况下也不能访问FTP服务器,仅当/etc/vsftpd/vsftpd.conf配置文件里启用userlist_enable=NO选项时才允许访问。不然会报错 530 Permission denied
最后要交代一哈
一定要记得关服务器防火墙!
一定要记得关服务器防火墙!
一定要记得关服务器防火墙!
一定要记得检查文件目录权限!
一定要记得检查文件目录权限!
一定要记得检查文件目录权限!
这篇有点长了不 哎算了 写一起好了
关于java的ftp上传 文件创建、乱码等问题。
肚子饿了 去吃饭吧,不写了。有道云笔记里有草稿标星文件。哦前几天发现有道云笔记好卡。所以体验了一下其他笔记产品。最后发现还是有道云比较靠谱。卡是因为公司这开发电脑配置不行。自己的笔记本上飞快的。不知道什么发去年的年终奖剩下的那笔钱。等得好辛苦。。。
下一篇: cglib-create分析