linux下安装FTP服务

FTP简述

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。它需要依赖于FTP服务器(支持FTP协议的服务器就是FTP服务器)。其传输方式有两种:ASCII传输方式、二进制传输模式。

安装

在网上查了查,FTP的安装都是用命令安装,这就要求你的服务器有网络。如果是个人虚拟机没有网,可以修改网络模式为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、关闭防火墙

service iptables stop

5、修改配置
在修改配置之前,我们先看看ftp有哪些配置,ftp的配置在/etc/vsftpd/下

2017-09-27_182234.png

vsftpd的配置,配置文件中限定了vsftpd用户连接控制配置。
(1):vsftpd.ftpusers:位于/etc/vsftpd目录下。它指定了哪些用户账户不能访问FTP服务器,例如root等。
(2):vsftpd.user_list:位于/etc/vsftpd目录下。该文件里的用户账户在默认情况下也不能访问FTP服务器,仅当vsftpd .conf配置文件里启用userlist_enable=NO选项时才允许访问。
(3):vsftpd.conf:位于/etc/vsftpd目录下。来自定义用户登录控制、用户权限控制、超时设置、服务器功能选项、服务器性能选项、服务器响应消息等FTP服务器的配置。

anonymous_enable=NO            #禁止匿名
local_enable=YES                       #允许本地登录
write_enable=YES                       #允许写,如需上传,则必须
llocal_umask=027                        #将上传文件的权限设置为: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               #监听/被动模式
listen_port=21        #监听端口

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、设置selinux

vim /etc/selinux/config

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

7、关闭selinux

setenforce 0

8、用winSPC链接

2017-09-27_183248.png

这里注意,ftp默认有两个端口20和21,20端口为数据传输端口,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;
    //基础路径、 文件路径、 文件名
    private String basePath;
    private String filePath;
    private String filename;

    private String localPath;//下载后保存到本地的路径 
    
    public FtpInfo(){};
    
    //连接对应构造函数
    public FtpInfo(String host,Integer port,String username,String password){
        this.host = host;
        this.port = port;
        this.username = username;
        this.password = password;
    };
    //上传文件对应构造函数
    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;
    };
    
    //下载文件对应构造函数
    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服务器hostname
     * @param f.port
     *            FTP服务器端口
     * @param f.username
     *            FTP登录账号
     * @param f.password
     *            FTP登录密码
     * @param f.basePath
     *            FTP服务器基础目录
     * @param f.filePath
     *            FTP服务器文件存放路径。例如分日期存放:/2017/09/28。文件的路径为basePath+filePath
     * @param f.filename
     *            上传到FTP服务器上的文件名
     * @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服务器
            // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
            ftp.login(ftpInfo.getUsername(), ftpInfo.getPassword());// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            // 切换到上传目录
            if (!ftp.changeWorkingDirectory(ftpInfo.getBasePath()
                    + ftpInfo.getFilePath())) {
                // 如果目录不存在创建目录
                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);
                        }
                    }
                }
            }
            // 设置上传文件的类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            ftp.enterLocalPassiveMode();//不加这一次会出现无法上传
            // 上传文件
            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服务器hostname
     * @param f.port
     *            FTP服务器端口
     * @param f.username
     *            FTP登录账号
     * @param f.password
     *            FTP登录密码
     * @param f.basePath
     *            基础路径
     * @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服务器
            ftp.login(ftpInfo.getUsername(), ftpInfo.getPassword());// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            ftp.changeWorkingDirectory(ftpInfo.getBasePath() + ftpInfo.getFilePath());// 转移到FTP服务器目录
            ftp.setControlEncoding("GBK");
            //ftp.enterLocalPassiveMode();//不加这一次会出现无法上传
            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;
        }
        // 转入当前目录工作
        // ftp.changeWorkingDirectory(ftpInfo.getBasePath()+ftpInfo.getFilePath());
        flag = true;
        return flag;
    }

    /**
     * 关闭连接
     */
    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

相关文章:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,000评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,745评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,561评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,782评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,798评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,394评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,952评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,852评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,409评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,483评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,615评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,303评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,979评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,470评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,571评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,041评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,630评论 2 359

推荐阅读更多精彩内容