热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CentOS7.6服务器搭建SFTP服务及JAVA工具类

一、SFTP的简介:sftp(SecureFileTransferProtocol)是一种安全的文件传送协议,是ssh内含

一、SFTP的简介:

sftp(Secure File Transfer Protocol)是一种安全的文件传送协议,是ssh内含协议,也就是说只要sshd服务器启动了,sftp就可使用,不需要额外安装,它的默认端口和SSH一样为22。1、sftp的简介:
sftp通过使用加密/解密技术来保障传输文件的安全性,因此sftp的传输效率比普通的FTP要低,但sftp的安全性要比ftp高,因此sftp通常用于对安全性要求较高的场景。

二、SFTP服务配置(基于CentOS 7)

1、查看ssh版本,OpenSSH的版本需大于4.8p1

ssh -V

在这里插入图片描述
2、创建用户和组,组名为sftp;创建sftp用户,用户名为user1,并设置密码为user1@456

groupadd sftp
useradd -g sftp -s /sbin/nologin user1
#useradd -s /sbin/nologin user1
echo "user1@456" |passwd --stdin user1

3、建立SFTP用户登入后可写入的目录

mkdir /data/sftp
usermod -d /data/sftp user1

4、修改配置文件sshd_config

vim /etc/ssh/sshd_config
#注释掉这行
#Subsystem sftp /usr/libexec/openssh/sftp-server #在最后面增加以下行
Subsystem sftp internal-sftp #这行指定使用sftp服务使用系统自带的internal-sftp
Match User user1 #这行用来匹配用户
ChrootDirectory /data/sftp #用chroot将用户的根目录指定到/datas/www ,这样用户就只能在/datas/www下活动
AllowTcpForwarding no
ForceCommand internal-sftp #指定sftp命令

5、设定Chroot目录权限

chown -R root:root /data/sftp
chmod 755 /data/sftp

6、建立SFT用户登入后可写入的目录

mkdir /data/sftp/upload
chown -R user1:sftp /data/sftp/upload
chmod 755 /data/sftp/upload

7、重启SSH服务

systemctl start sshd #开启一个服务
systemctl stop sshd #关闭一个服务
systemctl status sshd #查看一个服务的状态
systemctl restart sshd #重启一个服务

8、测试是否能正常登陆

sftp user1@1.15.106.188


如果链接服务器的时候出现下面的提示,则要设置所有者为root用户
在这里插入图片描述

[root@VM-4-12-centos /]# chown root:sftp /data/sftp/upload
[root@VM-4-12-centos /]# sudo chmod -R 777 /data/sftp/upload

在这里插入图片描述

三、SFTP的JAVA工具类

1、pom.xml文件内引入jsch的jar包

com.jcraftjsch0.1.53

2、java工具类代码

package com.example.sftp;import com.jcraft.jsch.*;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;
import java.util.Properties;
import java.util.Vector;/*** @author wanglu* @since 1.0, 2021/7/9 18:13*/
public class SFTPUtil {private transient Logger log = LoggerFactory.getLogger(this.getClass());private ChannelSftp sftp;private Session session;/** FTP 登录用户名*/private String username;/** FTP 登录密码*/private String password;/** 私钥 */private String privateKey;/** FTP 服务器地址IP地址*/private String host;/** FTP 端口*/private int port;/*** 构造基于密码认证的sftp对象* @param username* @param password* @param host* @param port*/public SFTPUtil(String username, String password, String host, int port) {this.username = username;this.password = password;this.host = host;this.port = port;}/*** 构造基于秘钥认证的sftp对象* @param username* @param host* @param port* @param privateKey*/public SFTPUtil(String username, String host, int port, String privateKey) {this.username = username;this.host = host;this.port = port;this.privateKey = privateKey;}public SFTPUtil(){}/*** 连接sftp服务器* @throws Exception*/public void login(){try {JSch jsch = new JSch();if (privateKey != null) {jsch.addIdentity(privateKey);// 设置私钥log.info("sftp connect,path of private key file:{}" , privateKey);}log.info("sftp connect by host:{} username:{}",host,username);session = jsch.getSession(username, host, port);log.info("Session is build");if (password != null) {session.setPassword(password);}Properties config = new Properties();config.put("StrictHostKeyChecking", "no");session.setConfig(config);session.connect();log.info("Session is connected");Channel channel = session.openChannel("sftp");channel.connect();log.info("channel is connected");sftp = (ChannelSftp) channel;log.info(String.format("sftp server host:[%s] port:[%s] is connect successfull", host, port));} catch (JSchException e) {log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}", new Object[]{host, port, e.getMessage()});}}/*** 关闭连接 server*/public void logout(){if (sftp != null) {if (sftp.isConnected()) {sftp.disconnect();log.info("sftp is closed already");}}if (session != null) {if (session.isConnected()) {session.disconnect();log.info("sshSession is closed already");}}}/*** 将输入流的数据上传到sftp作为文件* @param directory 上传到该目录* @param sftpFileName sftp端文件名* @param input 输入流* @throws SftpException* @throws Exception*/public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{try {sftp.cd(directory);} catch (SftpException e) {log.warn("directory is not exist");sftp.mkdir(directory);sftp.cd(directory);}sftp.put(input, sftpFileName);log.info("file:{} is upload successful" , sftpFileName);}/*** 上传单个文件* @param directory 上传到sftp目录* @param uploadFile 要上传的文件,包括路径* @throws FileNotFoundException* @throws SftpException* @throws Exception*/public void upload(String directory, String uploadFile) throws FileNotFoundException, SftpException{File file = new File(uploadFile);upload(directory, file.getName(), new FileInputStream(file));}/*** 将byte[]上传到sftp,作为文件。注意:从String生成byte[]是,要指定字符集。* @param directory 上传到sftp目录* @param sftpFileName 文件在sftp端的命名* @param byteArr 要上传的字节数组* @throws SftpException* @throws Exception*/public void upload(String directory, String sftpFileName, byte[] byteArr) throws SftpException{upload(directory, sftpFileName, new ByteArrayInputStream(byteArr));}/*** 将字符串按照指定的字符编码上传到sftp* @param directory 上传到sftp目录* @param sftpFileName 文件在sftp端的命名* @param dataStr 待上传的数据* @param charsetName sftp上的文件,按该字符编码保存* @throws UnsupportedEncodingException* @throws SftpException* @throws Exception*/public void upload(String directory, String sftpFileName, String dataStr, String charsetName) throws UnsupportedEncodingException, SftpException{upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName)));}/*** 下载文件* @param directory 下载目录* @param downloadFile 下载的文件* @param saveFile 存在本地的路径* @throws SftpException* @throws FileNotFoundException* @throws Exception*/public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{if (directory != null && !"".equals(directory)) {sftp.cd(directory);}File file = new File(saveFile);sftp.get(downloadFile, new FileOutputStream(file));log.info("file:{} is download successful" , downloadFile);}/*** 下载文件* @param directory 下载目录* @param downloadFile 下载的文件名* @return 字节数组* @throws SftpException* @throws IOException* @throws Exception*/public byte[] download(String directory, String downloadFile) throws SftpException, IOException{if (directory != null && !"".equals(directory)) {sftp.cd(directory);}InputStream is = sftp.get(downloadFile);byte[] fileData = IOUtils.toByteArray(is);log.info("file:{} is download successful" , downloadFile);return fileData;}/*** 删除文件* @param directory 要删除文件所在目录* @param deleteFile 要删除的文件* @throws SftpException* @throws Exception*/public void delete(String directory, String deleteFile) throws SftpException {sftp.cd(directory);sftp.rm(deleteFile);}/*** 列出目录下的文件* @param directory 要列出的目录* @return* @throws SftpException*/public Vector listFiles(String directory) throws SftpException {return sftp.ls(directory);}public boolean fileExist(String filePath){try {SftpATTRS attrs = sftp.lstat(filePath);return true;}catch (SftpException e){if(e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE){log.info("file {} not exist.",filePath);}else{log.error("Exception message is: {}",e.getMessage());}}return false;}public static void main(String[] args) throws SftpException, IOException {SFTPUtil sftp = new SFTPUtil("user1", "user1@123", "1.15.106.188", 22);sftp.login();File file = new File("D:\\2.txt");InputStream is = new FileInputStream(file);//是否存在附件boolean isflag = sftp.fileExist("/upload/11dd.txt");System.out.println("isflag="+isflag);//上传附件sftp.upload("/upload", "11.txt",is);sftp.logout();}
}


推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文讨论了在使用sp_msforeachdb执行动态SQL命令时,当发生错误时如何捕获数据库名称。提供了两种解决方案,并介绍了如何正确使用'?'来显示数据库名称。 ... [详细]
author-avatar
天佑伈似_倥伯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有