篇九:vsftpd文件服務器

  導語:文件上傳一般都是直接上傳tomcat發佈的機器上,而後依賴tomcat暴露,由此會引起一個問題,當tomcat更換位置、或者重啓會清空環境,上傳的文件就沒有了,另外一個就是開發階段文件會上傳到各自的服務器,不便於調試。java

1、安裝linux

¬    查看是否安裝: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 //容許本地用戶登陸

2、參數詳解apache

 
參數 說明
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

3、FtpUtil工具類tomcat

 

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

}
相關文章
相關標籤/搜索