linux下安裝FTP服務(wù)

FTP簡述

FTP 是File Transfer Protocol(文件傳輸協(xié)議)的英文簡稱,而中文簡稱為“文傳協(xié)議”狸剃。用于Internet上的控制文件的雙向傳輸。同時,它也是一個應(yīng)用程序(Application)贼陶。基于不同的操作系統(tǒng)有不同的FTP應(yīng)用程序,而所有這些應(yīng)用程序都遵守同一種協(xié)議以傳輸文件碉怔。它需要依賴于FTP服務(wù)器(支持FTP協(xié)議的服務(wù)器就是FTP服務(wù)器)烘贴。其傳輸方式有兩種:ASCII傳輸方式、二進制傳輸模式撮胧。

安裝

在網(wǎng)上查了查桨踪,F(xiàn)TP的安裝都是用命令安裝,這就要求你的服務(wù)器有網(wǎng)絡(luò)芹啥。如果是個人虛擬機沒有網(wǎng)锻离,可以修改網(wǎng)絡(luò)模式為net模式,ip改為自動模式(Automatic)即可

1墓怀、確認是否安裝

pgrep vsftpd
2017-09-27_181356.png

2纳账、安裝

yum install vsftpd
2017-09-27_181450.png

3、啟動 停止 重啟 卸載

systemctl start vsftpd.service#啟動
systemctl status vsftpd.service#重啟
systemctl stop vsftpd.service#停止 


/sbin/service vsftpd start
/sbin/service vsftpd restart
/sbin/service vsftpd stop


rpm -e vsftpd# 卸載
2017-09-27_181726.png

4捺疼、關(guān)閉防火墻

service iptables stop

5疏虫、修改配置
在修改配置之前,我們先看看ftp有哪些配置啤呼,ftp的配置在/etc/vsftpd/下

2017-09-27_182234.png

vsftpd的配置卧秘,配置文件中限定了vsftpd用戶連接控制配置。
(1):vsftpd.ftpusers:位于/etc/vsftpd目錄下官扣。它指定了哪些用戶賬戶不能訪問FTP服務(wù)器翅敌,例如root等。
(2):vsftpd.user_list:位于/etc/vsftpd目錄下惕蹄。該文件里的用戶賬戶在默認情況下也不能訪問FTP服務(wù)器蚯涮,僅當vsftpd .conf配置文件里啟用userlist_enable=NO選項時才允許訪問。
(3):vsftpd.conf:位于/etc/vsftpd目錄下卖陵。來自定義用戶登錄控制遭顶、用戶權(quán)限控制、超時設(shè)置泪蔫、服務(wù)器功能選項棒旗、服務(wù)器性能選項、服務(wù)器響應(yīng)消息等FTP服務(wù)器的配置撩荣。

anonymous_enable=NO            #禁止匿名
local_enable=YES                       #允許本地登錄
write_enable=YES                       #允許寫铣揉,如需上傳,則必須
llocal_umask=027                        #將上傳文件的權(quán)限設(shè)置為:777-local_umask
anon_upload_enable=YES          #允許虛擬用戶和匿名用戶上傳
anon_other_write_enable=YES #允許虛擬用戶和匿名用戶修改文件名和刪除文件
dirmessage_enable=YES           
xferlog_enable=YES                      #打開日志記錄
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log     #日志存放位置
xferlog_std_format=YES              #標準日志格式
idle_session_timeout=600        #空閑連接超時
data_connection_timeout=120
ftpd_banner=Welcome to ChinaRise FTP service       #歡迎信息

chroot_local_user=NO              
chroot_list_enable=YES
#以上兩行將虛擬用戶限制在其目錄下餐曹,不能訪問其他目錄逛拱,或者直接用                            
chroot_local_user=YES                               

listen=yes               #監(jiān)聽/被動模式
listen_port=21        #監(jiān)聽端口

chroot_list_file=/etc/vsftpd/vsftpd.chroot_list      #虛擬用戶名單保存在文件/etc/vsftpd/vsftpd.chroot_list 中
user_config_dir=/etc/vsftpd/vsftpd_user_conf  #每個虛擬用戶名的更加詳細的培植保存在/etc/vsftpd/vsftpd_user_conf 中

注意
這里ftpusers和user_list的限制用戶列表,通常我們自己本地測試時都用root登陸台猴,所以切記注掉這兩個文件中的root(LZ在這被坑了許久)

6朽合、設(shè)置selinux

vim /etc/selinux/config

  #SELINUX=enforcing #注釋掉
  #SELINUXTYPE=targeted #注釋掉
  SELINUX=disabled #增加
2017-09-27_182724.png

7俱两、關(guān)閉selinux

setenforce 0

8、用winSPC鏈接

2017-09-27_183248.png

這里注意旁舰,ftp默認有兩個端口20和21,20端口為數(shù)據(jù)傳輸端口锋华,21端口為鏈接控制端口

java操作ftp

準備jar包
commons-net-1.4.1.jar
jakarta-oro-2.0.8.jar
log4j-1.2.17.jar

FtpInfo.java

/**
 * ClassName: FtpInfo
 * @author lvfang
 * @Desc: TODO
 * @date 2017-9-27
 */
public class FtpInfo {

    //主機ip、端口
    private String host;
    private Integer port;
    //用戶名箭窜、密碼
    private String username;
    private String password;
    //基礎(chǔ)路徑毯焕、 文件路徑、 文件名
    private String basePath;
    private String filePath;
    private String filename;

    private String localPath;//下載后保存到本地的路徑 
    
    public FtpInfo(){};
    
    //連接對應(yīng)構(gòu)造函數(shù)
    public FtpInfo(String host,Integer port,String username,String password){
        this.host = host;
        this.port = port;
        this.username = username;
        this.password = password;
    };
    //上傳文件對應(yīng)構(gòu)造函數(shù)
    public FtpInfo(String host,Integer port,String username,String password,String basePath,String filePath,String filename){
        this.host = host;
        this.port = port;
        this.username = username;
        this.password = password;
        this.basePath = basePath;
        this.filePath = filePath;
        this.filename = filename;
    };
    
    //下載文件對應(yīng)構(gòu)造函數(shù)
    public FtpInfo(String host,Integer port,String username,String password,String basePath,String filePath,String filename,String localPath){
        this.host = host;
        this.port = port;
        this.username = username;
        this.password = password;
        this.basePath = basePath;
        this.filePath = filePath;
        this.filename = filename;
        this.localPath = localPath;
    };
    
    //getter   setter方法
}

FtpUtil.java

/**
 * ClassName: FtpUtil
 * @author lvfang
 * @Desc: TODO
 * @date 2017-9-28
 */
public class FtpUtil {

    private static FTPClient ftp;

    private static FtpInfo ftpInfo = null;

    /**
     * Description: 上傳文件
     * 
     * @param f.host
     *            FTP服務(wù)器hostname
     * @param f.port
     *            FTP服務(wù)器端口
     * @param f.username
     *            FTP登錄賬號
     * @param f.password
     *            FTP登錄密碼
     * @param f.basePath
     *            FTP服務(wù)器基礎(chǔ)目錄
     * @param f.filePath
     *            FTP服務(wù)器文件存放路徑磺樱。例如分日期存放:/2017/09/28纳猫。文件的路徑為basePath+filePath
     * @param f.filename
     *            上傳到FTP服務(wù)器上的文件名
     * @param input
     *            輸入流
     * @return 成功返回true,否則返回false
     */
    public static boolean uploadFile(FtpInfo ftpInfo, InputStream input) {
        boolean result = false;
        ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(ftpInfo.getHost(), ftpInfo.getPort());// 連接FTP服務(wù)器
            // 如果采用默認端口竹捉,可以使用ftp.connect(host)的方式直接連接FTP服務(wù)器
            ftp.login(ftpInfo.getUsername(), ftpInfo.getPassword());// 登錄
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            // 切換到上傳目錄
            if (!ftp.changeWorkingDirectory(ftpInfo.getBasePath()
                    + ftpInfo.getFilePath())) {
                // 如果目錄不存在創(chuàng)建目錄
                String[] dirs = ftpInfo.getFilePath().split("/");
                String tempPath = ftpInfo.getBasePath();
                for (String dir : dirs) {
                    if (null == dir || "".equals(dir))
                        continue;
                    tempPath += "/" + dir;
                    if (!ftp.changeWorkingDirectory(tempPath)) {
                        if (!ftp.makeDirectory(tempPath)) {
                            return result;
                        } else {
                            ftp.changeWorkingDirectory(tempPath);
                        }
                    }
                }
            }
            // 設(shè)置上傳文件的類型為二進制類型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            ftp.enterLocalPassiveMode();//不加這一次會出現(xiàn)無法上傳
            // 上傳文件
            if (!ftp.storeFile(ftpInfo.getFilename(), input)) {
                return result;
            }
            input.close();
            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }

    /**
     * Description: 下載文件
     * 
     * @param f.host
     *            FTP服務(wù)器hostname
     * @param f.port
     *            FTP服務(wù)器端口
     * @param f.username
     *            FTP登錄賬號
     * @param f.password
     *            FTP登錄密碼
     * @param f.basePath
     *            基礎(chǔ)路徑
     * @param f.filePath
     *            文件路徑
     * @param fileName
     *            要下載的文件名
     * @param localPath
     *            下載后保存到本地的路徑
     * @return
     */
    public static boolean downloadFile(FtpInfo ftpInfo) {
        boolean result = false;
        ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(ftpInfo.getHost(), ftpInfo.getPort());
            // 如果采用默認端口芜辕,可以使用ftp.connect(host)的方式直接連接FTP服務(wù)器
            ftp.login(ftpInfo.getUsername(), ftpInfo.getPassword());// 登錄
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            ftp.changeWorkingDirectory(ftpInfo.getBasePath() + ftpInfo.getFilePath());// 轉(zhuǎn)移到FTP服務(wù)器目錄
            ftp.setControlEncoding("GBK");
            //ftp.enterLocalPassiveMode();//不加這一次會出現(xiàn)無法上傳
            FTPFile[] fs = ftp.listFiles();
            for (FTPFile ff : fs) {
                if (ff.getName().equals(ftpInfo.getFilename())) {
                    File localFile = new File(ftpInfo.getLocalPath() + "/"+ ff.getName());

                    OutputStream is = new FileOutputStream(localFile);
                    ftp.retrieveFile(ff.getName(), is);
                    is.close();
                }
            }

            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }

    /**
     * 測試連接
     * 
     * @param f.host、f.port块差、f.username侵续、f.password           
     * @return
     * @throws Exception
     */
    public static boolean connectFtp(FtpInfo ftpInfo) throws Exception {
        ftp = new FTPClient();
        boolean flag = false;
        int reply;
        if (ftpInfo.getPort() == null) {
            ftp.connect(ftpInfo.getHost(), 21);
        } else {
            ftp.connect(ftpInfo.getHost(), ftpInfo.getPort());
        }
        ftp.login(ftpInfo.getUsername(), ftpInfo.getPassword());
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
        reply = ftp.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
            return flag;
        }
        // 轉(zhuǎn)入當前目錄工作
        // ftp.changeWorkingDirectory(ftpInfo.getBasePath()+ftpInfo.getFilePath());
        flag = true;
        return flag;
    }

    /**
     * 關(guān)閉連接
     */
    public static void closeFtp() {
        if (ftp != null && ftp.isConnected()) {
            try {
                ftp.logout();
                ftp.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws Exception {

        // 測試連接
        // FtpInfo ftpInfo = new
        // FtpInfo("192.168.**.***",21,"root","密碼");
        // System.out.println(FtpUtil.connectFtp(ftpInfo));;

        // 上傳測試
        // FileInputStream in=new FileInputStream(new File("D:\\03.png"));
        // ftpInfo = new
        // FtpInfo("192.168.**.***",21,"root","密碼","/home/images","/2017/09/28","05.jpg");
        // System.out.println(FtpUtil.uploadFile(ftpInfo, in));

        // 下載
        ftpInfo = new FtpInfo("192.168.**.***", 21, "root", "密碼","/home/images", "/2017/09/28", "05.jpg", "d:/");
        System.out.println(FtpUtil.downloadFile(ftpInfo));
    }
}

2017-09-27_185757.png

相關(guān)文章:

http://blog.csdn.net/wantaway314/article/details/52584531
http://www.cnblogs.com/zc123/p/6394470.html
http://www.cnblogs.com/huzi007/p/4236150.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市憨闰,隨后出現(xiàn)的幾起案子状蜗,更是在濱河造成了極大的恐慌,老刑警劉巖鹉动,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轧坎,死亡現(xiàn)場離奇詭異,居然都是意外死亡泽示,警方通過查閱死者的電腦和手機缸血,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來械筛,“玉大人捎泻,你說我怎么就攤上這事”湟蹋” “怎么了族扰?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長定欧。 經(jīng)常有香客問我,道長怒竿,這世上最難降的妖魔是什么砍鸠? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮耕驰,結(jié)果婚禮上爷辱,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好饭弓,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布双饥。 她就那樣靜靜地躺著,像睡著了一般弟断。 火紅的嫁衣襯著肌膚如雪咏花。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天阀趴,我揣著相機與錄音昏翰,去河邊找鬼。 笑死刘急,一個胖子當著我的面吹牛棚菊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叔汁,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼统求,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了据块?” 一聲冷哼從身側(cè)響起码邻,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瑰钮,沒想到半個月后冒滩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡浪谴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年开睡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苟耻。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡篇恒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凶杖,到底是詐尸還是另有隱情胁艰,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布智蝠,位于F島的核電站腾么,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏杈湾。R本人自食惡果不足惜解虱,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漆撞。 院中可真熱鬧殴泰,春花似錦于宙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至离咐,卻和暖如春谱俭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背健霹。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工旺上, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糖埋。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓宣吱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瞳别。 傳聞我的和親對象是個殘疾皇子征候,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容