篇九: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();
        }
    }

}

 

 

 

 

 

 

 

posted @ 2016-10-14 18:27  刘广平  阅读(424)  评论(0)    收藏  举报