如题

安装 yum -y install vsftpd

1
2
3
4
5
[root@192 ~]# yum -y install vsftpd
...
---> Package vsftpd.x86_64 0:2.2.2-24.el6 will be installed
--> Finished Dependency Resolution
...

添加用户并设置密码

1
2
3
4
5
6
[root@192 ~]# useradd -d /home/javaftp -s /sbin/nologin javaftpuser
[root@192 ~]# passwd javaftpuser
Changing password for user javaftpuser.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

作为开发环境,为了方便,用户 javaftpuser 的密码也设置成:javaftpuser

常用命令/设置

rpm -qa|grep vsftpd //查看是否安装了vsftpd

1
2
[root@192 ~]# rpm -qa|grep vsftpd 
vsftpd-2.2.2-24.el6.x86_64

service vsftpd status //查看状态,默认是关闭的
service vsftpd start //开启vsftpd服务
chkconfig vsftpd on //设置为开机启动
netstat -tulnp| grep 21 //查看是否启动了vsftpd服务

1
2
3
4
5
6
[root@192 ~]# netstat -tulnp| grep 21
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 1998/memcached
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 3752/vsftpd
tcp 0 0 :::11211 :::* LISTEN 1998/memcached
udp 0 0 0.0.0.0:11211 0.0.0.0:* 1998/memcached
udp 0 0 :::11211 :::* 1998/memcached

修改配置

vi /etc/vsftpd/vsftpd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
listen=YES
listen_port=21
tcp_wrappers=YES
write_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
idle_session_timeout=600
data_connection_timeout=120
chown_uploads=YES
chown_username=daemon
ftpd_banner=Welcome to andy.vbox.centos6.6 FTP service
anonymous_enable=NO
local_enable=yes
chroot_local_user=yes
pam_service_name=vsftpd
userlist_enable=YES

改好之后重启 vsftpd :service vsftpd restart

禁用 SELinux

vim /etc/selinux/config
设置 SELINUX 为:
SELINUX=disabled

1
2
[root@192 javaftp]# getenforce
Disabled

java 连接 ftp 服务器,遇到的问题

通过 FTPClient.rename,报:550 RNFR command failed.
尝试了好几种方式,也参考了网上的方案,都没对。最后通过 filezilla client 把一个文件从一个目录移动到另外一个目录,从日志得到了启发,日志是这样的:

1
Renaming '/completed/cacea8dd-27e3-4ba7-bf9b-2d66db8e1acc.png' to '/pending/cacea8dd-27e3-4ba7-bf9b-2d66db8e1acc.png'

问题的关键是指定 rename 的 from 和 to 参数,需要指定相对于 ftp 用户的默认目录来指定, “/“即代表 ftp 用户的默认目录,并非操作系统的根目录。
如下,最后一种方式为正确的调用方式。前面两种方式大概是初用 FTPClient 者常犯的错误。

1
2
3
4
5
6
//失败
ftpClient.rename("/" + FtpConfig.ftpUploadPath + "/" + fileName, "/" + FtpConfig.ftpCompletedPath + "/")
//失败
ftpClient.rename(FtpConfig.ftpUploadPath + "/" + fileName, FtpConfig.ftpCompletedPath + "/" + fileName)
//成功,_replyString=250 Rename successful.
ftpClient.rename("/" + FtpConfig.ftpUploadPath + "/" + fileName, "/" + FtpConfig.ftpCompletedPath + "/" + fileName)

需要注意的是:当需要移动的文件不存在时,也会报:550 RNFR command failed.