linux下安装FTP服务

2017-09-27  本文已影响34人  先生_吕

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

上一篇 下一篇

猜你喜欢

热点阅读