当前位置: 首页 > news >正文

linux 单独装ftp服务,linux下安装FTP服务

FTP简述

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

安装

在网上查了查,FTP的安装都是用命令安装,这就要求你的服务器有网络。如果是个人虚拟机没有网,可以修改网络模式为net模式,ip改为自动模式(Automatic)即可

1、确认是否安装

pgrep vsftpd

7cb710fd023a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

2017-09-27_181356.png

2、安装

yum install vsftpd

7cb710fd023a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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# 卸载

7cb710fd023a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

2017-09-27_181726.png

4、关闭防火墙

service iptables stop

5、修改配置

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

7cb710fd023a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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 #增加

7cb710fd023a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

2017-09-27_182724.png

7、关闭selinux

setenforce 0

8、用winSPC链接

7cb710fd023a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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

}

}

7cb710fd023a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

2017-09-27_185757.png

相关文章:

相关文章:

  • linux日志服务重开,linux重新編譯內核
  • linux arm中断进程,ARM Linux对中断的处理
  • linux jvm自动退出,在Linux中启动Eclipse时出错:“ JVM已终止。退出代码= 13”
  • 远程监控linux的jboss,如何将JBoss做成Redhat Linux的系统服务
  • 火狐浏览器在linux下编译,linux下火狐浏览器插件开发.doc
  • linux vi编辑撤销,vi撤销命令(u和U),撤销上一次的操作
  • flask部署linux视频,基于python的web架构部署注意事项
  • Linux下载WordPress出现错误,解决wordpress发生意外错误,可能WordPress.org或服务器配置文件存在问题...
  • linux下github上传文件,linux下将本地文件上传到github中?
  • 具有二进制时钟的Linux,Unix Linux
  • c语言while语句里if,C语言中流程控制语句(if,switch,for,while,do-while,continue,break,return)...
  • 0809连接单片机c语言,adc0809引脚图及功能详解,adc0809与51单片机连接电路分析
  • c语言 星期,计算任何一天是星期几的C语言源代码.
  • android版本sdk api对应,Android API Level与sdk版本对照表
  • android js变量定义数组,js 声明数组和向数组中添加对象变量的简单实例
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • CEF与代理
  • CSS 专业技巧
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JS 面试题总结
  • Node + FFmpeg 实现Canvas动画导出视频
  • PAT A1017 优先队列
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SOFAMosn配置模型
  • spring boot下thymeleaf全局静态变量配置
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 规范化安全开发 KOA 手脚架
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 前端面试总结(at, md)
  • 前嗅ForeSpider采集配置界面介绍
  • 使用 Docker 部署 Spring Boot项目
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #pragma data_seg 共享数据区(转)
  • #stm32整理(一)flash读写
  • (33)STM32——485实验笔记
  • (C)一些题4
  • (floyd+补集) poj 3275
  • (四) Graphivz 颜色选择
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转载)Linux 多线程条件变量同步
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .NET业务框架的构建
  • .考试倒计时43天!来提分啦!
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @ModelAttribute使用详解