JAVA 连接sftp服务器,用户名密码方式链接

  • 添加maven依赖:
  • 链接SFTP
  • 关闭连接 server
  • SFTP上传
  • SFTP下载
  • SFTP删除文件
  • 列出目录下的文件
  • 最终 SFTPUtils工具类
  • 业务类ImportSourceController

添加maven依赖:

<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.54</version>
</dependency>

链接SFTP

下面展示一些 内联代码片

/*** 连接sftp服务器*/public static ChannelSftp login(String host, int port, String username, String password) {logger.info("SftpUtils login begin");Session session = null;String config = "Port "+port+"\n" +"\n" +"Host foo\n" +" User "+username+"\n" +" Hostname "+host+"\n" +"Host *\n" +" ConnectTime 3000\n" +" PerferredAuthentications Keyboard-interact,password,publicKey\n" +" #ForwardAgent yes\n" +" #StrictHostKeyChecking no\n" +" #identiyFile ~/.ssh/id_rsa\n" +" #UserKnownHostFile ~/.shh/known_hosts";ConfigRepository configRepository = null;try {configRepository = OpenSSHConfig.parse(config);JSch jSch = new JSch();jSch.setConfigRepository(configRepository);//"foo" is from "Host foo" in the above configsession = jSch.getSession("foo");session.setPassword(password);session.setConfig("StrictHostKeyChecking", "no");session.connect(18000);Channel channel = session.openChannel("sftp");channel.connect();ChannelSftp sftp = (ChannelSftp) channel;logger.info("SftpUtils login end");return sftp;} catch (JSchException | IOException e) {logger.error("连接SFTP服务器失败", e);return null;}}

关闭连接 server

下面展示一些 内联代码片

// A code block
var foo = 'bar';
/*** 关闭连接 server*/public static void logout(ChannelSftp sftp){logger.info("SftpUtils logout begin");if (sftp != null) {Session session = null;try {session = sftp.getSession();if (sftp.isConnected()) {sftp.disconnect();}} catch (JSchException e) {logger.error("获取session失败", e);} finally {if (session != null) {session.disconnect();}}}logger.info("SftpUtils logout end");}

SFTP上传

下面展示一些 内联代码片

/*** 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory*  basePath  服务器的基础路径*  directory  上传到该目录*  sftpFileName  sftp端文件名*  in   输入流*/public static boolean upload(String host, int port, String username, String password, String basePath, String sftpFileName, InputStream input) {logger.info("SftpUtils upload begin");boolean success = true;ChannelSftp sftp = login(host, port, username, password);try {sftp.cd(basePath);} catch (SftpException e) {//目录不存在,则创建文件夹String [] dirs = basePath.split("/");String tempPath = "";for(String dir:dirs){if(null== dir || "".equals(dir)) {continue;}tempPath+="/"+dir;try {sftp.cd(tempPath);} catch (SftpException e1) {try {sftp.mkdir(tempPath);sftp.cd(tempPath);} catch (SftpException e2) {logger.error("创建文件夹失败", e2);//throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("创建文件夹失败"));}}try{sftp.cd(tempPath);}catch(SftpException e1){logger.error("SFTP服务器异常", e1);//throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("SFTP服务器异常"));}}}try {//上传文件sftp.put(input, sftpFileName);} catch (SftpException e) {// TODO Auto-generated catch blocklogger.error("上传文件失败", e);
//            throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("上传文件失败"));success = false;} finally {logout(sftp);}logger.info("SftpUtils upload end");return success;}

SFTP下载

下面展示一些 内联代码片

/*** 下载文件。*  directory 下载目录*  downloadFile 下载的文件*  saveFile 存在本地的路径*/public static boolean download(String host, int port, String username, String password, String filePath, final OutputStream outputStream) {logger.info("SftpUtils download begin");boolean downloaded = true;ChannelSftp sftp = login(host, port, username, password);String fileName = null;try {if (filePath != null && !"".equals(filePath)) {String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));sftp.cd(directory);}fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);sftp.get(fileName, outputStream);} catch (SftpException e) {downloaded = false;logger.error("FTP服务器异常", e);} finally {logout(sftp);}logger.info("SftpUtils download end");return downloaded;}

SFTP删除文件

下面展示一些 内联代码片

/*** 删除文件*  directory 要删除文件所在目录*  deleteFile 要删除的文件*/public static boolean delete(String host, int port, String username, String password, String filePath){logger.info("SftpUtils delete begin");boolean success = true;ChannelSftp sftp = null;try {sftp = login(host, port, username, password);String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));sftp.cd(directory);String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);sftp.rm(fileName);} catch (SftpException e) {logger.error("文件删除失败", e);success = false;} finally {logout(sftp);}logger.info("SftpUtils delete end");return success;}

列出目录下的文件

下面展示一些 内联代码片

/*** 列出目录下的文件*  directory 要列出的目录*  sftp*/public static boolean isFileExist(String host, int port, String username, String password, String filePath) {boolean success = false;ChannelSftp sftp = null;try {sftp = login(host, port, username, password);String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);Vector<?> vector = sftp.ls(directory);for (Object obj : vector) {if (obj != null) {LsEntry lsEntry = (LsEntry) obj;if (fileName.equals(lsEntry.getFilename())) {success = true;break;}}}} catch (Exception e) {logger.error("sftp服务器异常");} finally {logout(sftp);}return success;}

最终 SFTPUtils工具类

import com.jcraft.jsch.*;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Base64Utils;
import org.springframework.util.StringUtils;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import java.util.Vector;/*** @author Administrator**/public  class SFTPUtils {private final static Logger logger = LoggerFactory.getLogger(SFTPUtils.class);protected final static int CLIENT_TIMEOUT = 1000 * 180;/*** 连接sftp服务器*/public static ChannelSftp login(String host, int port, String username, String password) {logger.info("SftpUtils login begin");Session session = null;String config = "Port "+port+"\n" +"\n" +"Host foo\n" +" User "+username+"\n" +" Hostname "+host+"\n" +"Host *\n" +" ConnectTime 3000\n" +" PerferredAuthentications Keyboard-interact,password,publicKey\n" +" #ForwardAgent yes\n" +" #StrictHostKeyChecking no\n" +" #identiyFile ~/.ssh/id_rsa\n" +" #UserKnownHostFile ~/.shh/known_hosts";ConfigRepository configRepository = null;try {configRepository = OpenSSHConfig.parse(config);JSch jSch = new JSch();jSch.setConfigRepository(configRepository);//"foo" is from "Host foo" in the above configsession = jSch.getSession("foo");session.setPassword(password);session.setConfig("StrictHostKeyChecking", "no");session.connect(18000);Channel channel = session.openChannel("sftp");channel.connect();ChannelSftp sftp = (ChannelSftp) channel;logger.info("SftpUtils login end");return sftp;} catch (JSchException | IOException e) {logger.error("连接SFTP服务器失败", e);return null;}}/*** 关闭连接 server*/public static void logout(ChannelSftp sftp){logger.info("SftpUtils logout begin");if (sftp != null) {Session session = null;try {session = sftp.getSession();if (sftp.isConnected()) {sftp.disconnect();}} catch (JSchException e) {logger.error("获取session失败", e);} finally {if (session != null) {session.disconnect();}}}logger.info("SftpUtils logout end");}/*** 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory*  basePath  服务器的基础路径*  directory  上传到该目录*  sftpFileName  sftp端文件名*  in   输入流*/public static boolean upload(String host, int port, String username, String password, String basePath, String sftpFileName, InputStream input) {logger.info("SftpUtils upload begin");boolean success = true;ChannelSftp sftp = login(host, port, username, password);try {sftp.cd(basePath);} catch (SftpException e) {//目录不存在,则创建文件夹String [] dirs = basePath.split("/");String tempPath = "";for(String dir:dirs){if(null== dir || "".equals(dir)) {continue;}tempPath+="/"+dir;try {sftp.cd(tempPath);} catch (SftpException e1) {try {sftp.mkdir(tempPath);sftp.cd(tempPath);} catch (SftpException e2) {logger.error("创建文件夹失败", e2);//throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("创建文件夹失败"));}}try{sftp.cd(tempPath);}catch(SftpException e1){logger.error("SFTP服务器异常", e1);//throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("SFTP服务器异常"));}}}try {//上传文件sftp.put(input, sftpFileName);} catch (SftpException e) {// TODO Auto-generated catch blocklogger.error("上传文件失败", e);
//            throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("上传文件失败"));success = false;} finally {logout(sftp);}logger.info("SftpUtils upload end");return success;}/*** 下载文件。*  directory 下载目录*  downloadFile 下载的文件*  saveFile 存在本地的路径*/public static boolean download(String host, int port, String username, String password, String filePath, final OutputStream outputStream) {logger.info("SftpUtils download begin");boolean downloaded = true;ChannelSftp sftp = login(host, port, username, password);String fileName = null;try {if (filePath != null && !"".equals(filePath)) {String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));sftp.cd(directory);}fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);sftp.get(fileName, outputStream);} catch (SftpException e) {downloaded = false;logger.error("FTP服务器异常", e);} finally {logout(sftp);}logger.info("SftpUtils download end");return downloaded;}/*** 删除文件*  directory 要删除文件所在目录*  deleteFile 要删除的文件*/public static boolean delete(String host, int port, String username, String password, String filePath){logger.info("SftpUtils delete begin");boolean success = true;ChannelSftp sftp = null;try {sftp = login(host, port, username, password);String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));sftp.cd(directory);String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);sftp.rm(fileName);} catch (SftpException e) {logger.error("文件删除失败", e);success = false;} finally {logout(sftp);}logger.info("SftpUtils delete end");return success;}/*** 列出目录下的文件*  directory 要列出的目录*  sftp*/public static boolean isFileExist(String host, int port, String username, String password, String filePath) {boolean success = false;ChannelSftp sftp = null;try {sftp = login(host, port, username, password);String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);Vector<?> vector = sftp.ls(directory);for (Object obj : vector) {if (obj != null) {LsEntry lsEntry = (LsEntry) obj;if (fileName.equals(lsEntry.getFilename())) {success = true;break;}}}} catch (Exception e) {logger.error("sftp服务器异常");} finally {logout(sftp);}return success;}}

业务类ImportSourceController


package org.apache.dolphinscheduler.api.controller;import org.apache.dolphinscheduler.api.utils.SFTPUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;import java.io.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;/*** data source controller*/
@RestController
@RequestMapping("importSource")
public class ImportSourceController extends BaseController {private static final Logger logger = LoggerFactory.getLogger(ImportSourceController.class);/*** sftp获取上传暂存文件* @param uploadFile 上传的文件路径* @param sftpFileName 存放的文件名称* @return* @throws SQLException*/@PostMapping("/getHeadBack")@ResponseBodypublic List<String> getHeadBack(@RequestParam("uploadFile") String uploadFile,@RequestParam("sftpFileName") String sftpFileName) throws FileNotFoundException {List<String> headlist = new ArrayList<String>();InputStream input = new InputStream() {@Overridepublic int read() throws IOException {return 0;}};File file = new File(uploadFile);String host = "192.168.1.92";String port = "22";String username = "root";String password = "rootroot";String basePath = "/opt/testSFTP/";//String sftpFileName = "wx";//上传文件SFTPUtils.upload(host,Integer.valueOf(port),username,password,basePath,sftpFileName,new FileInputStream(file));return headlist;}}

JAVA 连接sftp服务器,用户名密码方式链接(类似于FinalShell以ssh方式链接LINUX)相关推荐

  1. EMQX服务器搭建系列四:配置EMQX服务器用户名/密码方式登录

    系统:ubuntu 18.04server lts EMQX版本:v4.0.6 停止服务 emqx stop 编辑用户名密码配置文件 vim ./etc/emqx/plugins/emqx_auth_ ...

  2. JAVA远程连接ssh异步,SSH-2实现java连接远程服务器并执行脚本命令

    参考文档: maven jar包:https://mvnrepository.com/artifact/ch.ethz.ganymed/ganymed-ssh2 Ganymed SSH2 API文档 ...

  3. java连接MQTT服务器(Springboot整合MQTT)

    一.业务场景 硬件采集的数据传入EMQX平台(采用MQTT协议),java通过代码连接MQTT服务器,进行采集数据接收.解析.业务处理.存储入库.数据展示. MQTT 是基于 发布(Publish)/ ...

  4. 连接sftp服务器命令

    连接sftp服务器 sftp -oIdentityFile=/home/work/.ssh/own_isa -oPort=57000 SFTP_ACCOUNT@192.168.0.1 -v -oIde ...

  5. android默认smb用户名和密码错误,win7系统下连接SMB提示用户名密码错误的解决方法...

    有很多电视都可以通过SMB协议和电脑连接,但是有不少win7系统用户在连接SMB的时候,按要求输入用户名和密码之后却提示用户名密码错误,该怎么办呢,本文就给大家讲解一下win7系统下连接SMB提示用户 ...

  6. Winscp无法连接SFTP服务器

    Winscp无法连接SFTP服务器 适用于windows下SFTP服务器 适用于winscp连接显示拒绝lianjie 适用于sftp admih@127.0.0.1 登陆显示Permission d ...

  7. 暴力破解FTP服务器用户名密码

    暴力破解FTP服务器用户名密码 破解 今天的例子很简单,就是用python的FTPLIB模块,登陆ftp服务器.并尝试用户名和密码. 大概的逻辑是,假设远程主机上有FTP服务器,我们使用用户和密码文件 ...

  8. JSCH通过密码和公钥连接SFTP服务器的指纹判断以及Serv-U设置公钥登录

    文章目录 (零)背景 (一)主机指纹 1.1 现象和原理 1.2 解决方法 1.2.1手动ssh 1.2.2 执行ssh-keyscan 1.2.3 程序用公钥登录 1.3 指纹变化 (二)JSCH程 ...

  9. Java从sftp服务器上传与下载文件

    一.背景 业务需要从sftp服务器上上传.下载.删除文件等功能,通过查阅资料及手动敲打代码,实现了操作sftp的基本功能,有需求的小伙伴可以看看具体的实现过程. 二.sftp介绍 摘自百度百科:SSH ...

  10. Java从SFTP服务器下载文件一

    最近对接一个需求,要用SFTP去服务器上取文件,这里记录下自己的思路. SFTP下载文件需要用到jsch的jar包,我用的是jsch-0.1.54.jar,可以到http://www.jcraft.c ...

最新文章

  1. vue中的minix
  2. 陆奇全面解读 AI 创业创新发展趋势,创业公司应该如何把握住机会?
  3. 真的有人在偷听我们讲话么?
  4. symbol lookup error
  5. java List集合
  6. 【编译原理】编译是怎么一个过程?
  7. [转载] 不少Gate或Node运算子 的反向传播代码
  8. [php基础]Mysql日期函数:日期时间格式转换函数详解
  9. python pyquery 解析html数据(2)
  10. 南华大学c语言实验答案,南华大学C语言习题答案2012年版
  11. Linux环境入侵应急与排查
  12. Win7扫雷的H5完整复刻实现(三) / 鼠标左右键同时按下事件与收尾工作的实现
  13. MS08067红队攻防第三期 今晚7点 不见不散~
  14. Android 原生GPS定位 判断室内室外
  15. 谈canvas转图片的方法(base64编码)
  16. 极客日报:曝 iPhone 13 系列定价有望下调:起售价或低于 5499 元;TikTok 成为全球收入最高 App
  17. 使用Axure完成交互式UI设计
  18. Linux的常用命令思维导图
  19. idea软件调整字体大小和行间距
  20. 算数运算符、算术表达式

热门文章

  1. --------溢出植入型木马(后门)的原型实现 作者:FLASHSKY(原创)
  2. GIS数据处理与应用开发一站式解决方案
  3. 直播客户端和浏览器使用桌面共享时出现黑屏等问题
  4. PyTorch-07 卷积神经网络(什么是卷积、卷积神经网络、池化层、Batch normalization、经典卷积网络、深度残差网络 ResNet、nn.Module、数据增强)
  5. ThinkCMF框架修复漏洞 名称:ThinkPHP5 远程代码执行高危漏洞(CNNVD-201812-617)
  6. 内网通积分|免广告工具
  7. HackerRank Twin Arrays 题解
  8. MATLAB表示非线性系统,matlab非线性控制系统分析.ppt
  9. ViewStub用法
  10. Unity 中文语言包下载