篇九:vsftpd文件服务器
导语:文件上传通常都是直接上传tomcat发布的机器上,然后依赖tomcat暴露,由此会引发一个问题,当tomcat更换位置、或者重启会清空环境,上传的文件就没有了,另一个就是开发阶段文件会上传到各自的服务器,不便于调试。
一、安装
¬ 查看是否安装:rpm –qa|grep vsftpd
¬ 安装vsftpd:yum install –y vsftpd
¬ 查看vsftpd状态:service vsftpd status
¬ 启动vsftpd:service vsftpd start
¬ vsftpd配置文件:vi /etc/vsftpd/vsftpd.conf
配置注意事项:
开放端口或关闭防火墙: iptables 20、21
设置selinux iptables:查看状态 getenforce
修改状态 vi /etc/sysconfig/selinux selinux = disabled(重启)
单次关闭 setenforce 0 (不需要重启)
匿名账户设置:
anon_umask = 777 //匿名用户的权限配置
anonymous_enable = yes //允许匿名登录
anon_mkdir_write_enable = yes //匿名用户拥有创建文件夹的权限
anon_other_write_enable = yes //匿名用户拥有写权限
write_enable = yes //必须配置为yes,匿名用户才拥有写的权限
登录:
user:ftp
password:任何字段
本地账户
local_umask = 072 //配置权限,权限值刚好相反
write_enable = yes //本地用户拥有写权限
local_enable = yes //允许本地用户登录

二、参数详解
| 参数 | 说明 |
| listen_address=ip address | 指定侦听IP |
| listen_port=port_value | 指定侦听端口,默认21 |
| anonymous_enable=YES | 是否允许使用匿名帐户 |
| local_enable=YES | 是否允许本地用户登录 |
| nopriv_user=ftp | 指定vsftpd服务的运行帐户,不指定时使用ftp |
| write_enable=YES | 是否允许写入 |
| anon_upload_enable=YES | 匿名用户是否可上传文件 |
| anon_mkdir_write_enable=YES | 匿名用户是否建立目录 |
| dirmessage_enable=YES | 进入每个目录是显示欢迎信息,在每个目录下建立.message文件在里面写欢迎信息 |
| xferlog_enable=YES | 上传/下载文件时记录日志 |
| connect_from_port_20=YES | 是否使用20端口传输数据(是否使用主动模式) |
| chown_uploads=YES、chown_username=whoever | 修改匿名用户上传文件的拥有者 |
| xferlog_file=/var/log/vsftpd.log | 日志文件 |
| xferlog_std_format=YES | 使用标准文件日志 |
| idle_session_timeout=600 | 会话超时,客户端连接到ftp但未操作 |
| data_connection_timeout=120 | 数据传输超时 |
| async_abor_enable=YES | 是否允许客户端使用sync等命令 |
| ascii_upload_enable=YES、ascii_download_enable=YES | 是否允许上传/下载二进制文件 |
| chroot_local_user=YES | 限制所有的本地用户在自家目录 |
| chroot_list_enable=YES、chroot_list_file=/etc/vsftpd/chroot_list | 指定不能离开家目录的用户,将用户名一个一行写在/etc/vsftpd/chroot_list文件里,使用此方法时必须chroot_local_user=NO |
| ls_recurse_enable=YES | 是否允许使用ls -R等命令 |
| listen=YES | 开启ipv4监听 |
| listen_ipv6=YES | 开启ipv6监听 |
| pam_service_name=vsftpd | 使用pam模块控制,vsftpd文件在/etc/pam.d目录下 |
| userlist_enable=YES | 此选项被激活后,vsftpd将读取userlist_file参数所指定的文件中的用户列表。当列表中的用户登录FTP服务器时,该用户在提示输入密码之前就被禁止了。即该用户名输入后,vsftpd查到该用户名在列表中,vsftpd就直接禁止掉该用户,不会再进行询问密码等后续步聚 |
| userlist_deny=YES | 决定禁止还是只允许由userlist_file指定文件中的用户登录FTP服务器。此选项在userlist_enable 选项启动后才生效。YES,默认值,禁止文件中的用户登录,同时也不向这些用户发出输入密码的提示。NO,只允许在文件中的用户登录FTP服务器 |
| tcp_wrappers=YES | 是否允许tcp_wrappers管理 |
| local_root=/home/ftp | 所有用户的根目录,,对匿名用户无效 |
| anon_max_rate | 匿名用户的最大传输速度,单位是Byts/s |
| local_max_rate | 本地用户的最大传输速度,单位是Byts/s |
| download_enable= YES | 是否允许下载 |
# 允许本地用户登录
local_enable=YES
# 本地用户的写权限
write_enable=YES
# 使用FTP的本地文件权限,默认为077
# 一般设置为022
local_umask=022
# 切换目录时
# 是否显示目录下.message的内容
dirmessage_enable=YES
dirlist_enable = NO
#验证方式
#pam_service_name=vsftpd
# 启用FTP数据端口的数据连接
connect_from_port_20=YES
# 以独立的FTP服务运行
listen=yes
# 修改连接端口
#listen_port=2121
######### 匿名登录设置 ###########
# 允许匿名登录
anonymous_enable=NO
# 如果允许匿名登录
# 是否开启匿名上传权限
#anon_upload_enable=YES
# 如果允许匿名登录
# 是否允许匿名建立文件夹并在文件夹内上传文件
#anon_mkdir_write_enable=YES
# 如果允许匿名登录
# 匿名帐号可以有删除的权限
#anon_other_write_enable=yes
# 如果允许匿名登录
# 匿名的下载权限
# 匿名为Other,可设置目录/文件属性控制
#anon_world_readable_only=no
# 如果允许匿名登录
# 限制匿名用户传输速率,单位bite
#anon_max_rate=30000
######### 用户限制设置 ###########
#### 限制登录
# 用userlist来限制用户访问
#userlist_enable=yes
# 名单中的人不允许访问
#userlist_deny=no
# 限制名单文件放置的路径
#userlist_file=/etc/vsftpd/userlist_deny.chroot
#### 限制目录
# 限制所有用户都在家目录
#chroot_local_user=yes
# 调用限制在家目录的用户名单
chroot_list_enable=YES
# 限制在家目录的用户名单所在路径
chroot_list_file=/etc/vsftpd/chroot_list
######### 日志设置 ###########
# 日志文件路径设置
xferlog_file=/var/log/vsftpd.log
# 激活上传/下载的日志
xferlog_enable=YES
# 使用标准的日志格式
#xferlog_std_format=YES
######### 安全设置 ###########
# 用户空闲超时,单位秒
#idle_session_timeout=600
# 数据连接空闲超时,单位秒
#data_connection_timeout=120
# 将客户端空闲1分钟后断开
#accept_timeout=60
# 中断1分钟后重新连接
#connect_timeout=60
# 本地用户传输速率,单位bite
#local_max_rate=50000
# FTP的最大连接数
#max_clients=200
# 每IP的最大连接数
#max_per_ip=5
######### 被动模式设置 ###########
# 是否开户被动模式
pasv_enable=yes
# 被动模式最小端口
pasv_min_port=5000
# 被动模式最大端口
pasv_max_port=6000
三、FtpUtil工具类
package com.guduo.common.utils.ftp; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import com.guduo.common.utils.string.StringUtil; /** * Ftp:远程操作文件服务器(FTP连接、创建文件夹、删除文件、上传文件、下载文件) * @author Liugp * */ public class FtpUtil { private static FTPClient ftpClient = new FTPClient(); private String hostname="192.168.1.61"; private String port="80"; private String username="ftpUser"; private String password="ftpUser"; /** * FTP 连接登录 * @param hostname * @param port * @param username * @param password * @return * @throws IOException */ public static boolean connect() throws IOException { ftpClient.connect(hostname, port); if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { if (ftpClient.login(username, password)) { return true; }else{ ftpClient.logout(); ftpClient.disconnect(); } } return false; } /** * 获取ftp指定目录下的文件列表 * @param tempDir:绝对路径,例如("/usr/local") * @return */ public static FTPFile[] listFiles(String tempDir){ FTPFile[] ff = null; try { connect(); ftpClient.changeWorkingDirectory(tempDir); ff = ftpClient.listFiles(); //打印文件名 for(FTPFile file:ff){ if(file.isFile()) System.out.println(file.getName()); else if(file.isDirectory()) System.out.println(file.getName()); } } catch (IOException e) { return null; } disConnect(); return ff; } /** * 创建文件夹: * 存在,不创建 * 不存在,创建 * @param path:绝对路径 * @param dirname:文件名 */ public static void createDir(String path,String dirname){ try{ //建立连接 connect(); //创建文件夹 if(StringUtil.isNotEmpty(path)) { ftpClient.changeWorkingDirectory(path); //创建多级目录 String[] dirs = dirname.split("/"); for(String dir:dirs){ ftpClient.makeDirectory(dir); ftpClient.changeWorkingDirectory(dir); } } ftpClient.changeWorkingDirectory("/"+dirname); //断开连接 // disConnect(); }catch(Exception ex){ System.out.println(ex.getMessage()); } } /** * 文件上传 * @param path:上传路径 * @param name:文件名 * @param in:文件流 */ public static void ftpPut(String path,InputStream file,String name) { try{ //判断文件夹是否存在,不存在创建 createDir("/home/ftpTest",path); //建立连接 connect(); //切换至上传路径 ftpClient.changeWorkingDirectory("/home/ftpTest/"+path); //设置二进制上传 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); //存储文件 ftpClient.storeFile(name, file); //断开连接 disConnect(); }catch(Exception ex){ System.out.println(ex.getMessage()); } } /** * 下载文件 * @param ftpPath:下载路径加文件名 * @param localPath:本地保存路径加文件名 */ public static void ftpDownload(String ftpPath,String localPath) { try { //建立连接 connect(); ftpClient.changeWorkingDirectory(ftpPath.substring(0, ftpPath.lastIndexOf("/"))); InputStream is = ftpClient.retrieveFileStream(ftpPath); File file = new File(localPath); FileOutputStream os = new FileOutputStream(file); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); } is.close(); os.close(); //断开连接 disConnect(); } catch (IOException e) { e.printStackTrace(); } } /** * 删除文件 * @param filePath:绝对路径 * @return */ public static boolean removeFile(String filePath){ boolean flag = false; if( ftpClient!=null ){ try { //建立连接 connect(); flag = ftpClient.deleteFile(filePath); //断开连接 disConnect(); } catch (IOException e) { disConnect(); e.printStackTrace(); } } return flag; } /** * 关闭连接 */ public static void disConnect() { try { ftpClient.logout(); ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } }

浙公网安备 33010602011771号