java使用JSCH实现SFTP文件管理

本文实例为大家分享了java使用JSCH实现SFTP文件管理的具体代码,供大家参考,具体内容如下

一、连接配置

1.在项目中导入jsch-0.1.51.jar包;

2.创建SFTP类,存放连接属性,其中要注意一点,在进行FTP操作时,一个会话在建立连接通道后进入A目录进行文件操作,不能直接跳到同级或上级目录操作,需要先退出当前会话或者新建会话。

public class SFTP{

 private Session session;//会话
 private Channel channel;//连接通道
 private ChannelSftp sftp;// sftp操作类 

 public Session getSession() {
 return session;
 }
 public void setSession(Session session) {
 this.session = session;
 }
 public Channel getChannel() {
 return channel;
 }
 public void setChannel(Channel channel) {
 this.channel = channel;
 }
 public ChannelSftp getSftp() {
 return sftp;
 }
 public void setSftp(ChannelSftp sftp) {
 this.sftp = sftp;
 }

}

3.创建SFTPUtil类,创建连接配置方法

 /**
 * 连接ftp/sftp服务器
 * @param SFTP类
 */
 public static void getConnect(SFTP s) throws Exception {

 /** 密钥的密码 */
// String privateKey ="key";
// /** 密钥文件路径 */
// String passphrase ="path";
 /** 主机 */
 String host ="127.0.0.1";
 /** 端口 */
 int port =22;
 /** 用户名 */
 String username ="test";
 /** 密码 */
 String password ="test";

 Session session = null;
 Channel channel = null;
 ChannelSftp sftp = null;// sftp操作类 

 JSch jsch = new JSch(); 

 //设置密钥和密码
 //支持密钥的方式登陆,只需在jsch.getSession之前设置一下密钥的相关信息就可以了
// if (privateKey != null && !"".equals(privateKey)) {
// if (passphrase != null && "".equals(passphrase)) {
// //设置带口令的密钥
//  jsch.addIdentity(privateKey, passphrase);
// } else {
// //设置不带口令的密钥
//  jsch.addIdentity(privateKey);
// }
// }
 session = jsch.getSession(username, host, port);
 session.setPassword(password);
 Properties config = new Properties();
 config.put("StrictHostKeyChecking", "no"); // 不验证 HostKey
 session.setConfig(config);
 try {
 session.connect();
 } catch (Exception e) {
 if (session.isConnected())
 session.disconnect();
 log.error("连接服务器失败,请检查主机[" + host + "],端口[" + port
  + "],用户名[" + username + "],端口[" + port
  + "]是否正确,以上信息正确的情况下请检查网络连接是否正常或者请求被防火墙拒绝.");
 }
 channel = session.openChannel("sftp");
 try {
 channel.connect();
 } catch (Exception e) {
 if (channel.isConnected())
 channel.disconnect();
 log.error("连接服务器失败,请检查主机[" + host + "],端口[" + port
  + "],用户名[" + username + "],密码是否正确,以上信息正确的情况下请检查网络连接是否正常或者请求被防火墙拒绝.");
 }
 sftp = (ChannelSftp) channel; 

 s.setChannel(channel);
 s.setSession(session);
 s.setSftp(sftp);

 }

5.关闭连接方法

 /**
 * 断开连接
 *
 */
 public static void disConn(Session session,Channel channel,ChannelSftp sftp)throws Exception{
 if(null != sftp){
 sftp.disconnect();
 sftp.exit();
 sftp = null;
 }
 if(null != channel){
 channel.disconnect();
 channel = null;
 }
 if(null != session){
 session.disconnect();
 session = null;
 }
 }

二、SFTP目录、文件操作管理

1.上传文件

 /**
 * 上传文件
 * @param directory 上传的目录-相对于SFPT设置的用户访问目录,
 * 为空则在SFTP设置的根目录进行创建文件(除设置了服务器全磁盘访问)
 * @param uploadFile 要上传的文件全路径
 */
 public static void upload(String directory,String uploadFile) throws Exception {

 SFTP s=new SFTP();
 getConnect(s);//建立连接
 Session session = s.getSession();
 Channel channel = s.getChannel();
 ChannelSftp sftp = s.getSftp();// sftp操作类
 try {
 try{
  sftp.cd(directory); //进入目录
 }catch(SftpException sException){
  if(sftp.SSH_FX_NO_SUCH_FILE == sException.id){ //指定上传路径不存在
  sftp.mkdir(directory);//创建目录
  sftp.cd(directory); //进入目录
  }
 }

 }
 File file = new File(uploadFile);
 InputStream in= new FileInputStream(file);
 sftp.put(in, file.getName());
 in.close();

 } catch (Exception e) {
 throw new Exception(e.getMessage(),e);
 } finally {
 disConn(session,channel,sftp);
 }
 }

2.文件下载

/**
 * 下载文件
 * @param directory 下载目录 根据SFTP设置的根目录来进行传入
 * @param downloadFile 下载的文件
 * @param saveFile 存在本地的路径
 */
 public static void download(String directory, String downloadFile,String saveFile) throws Exception {
 SFTP s=new SFTP();
 getConnect(s);//建立连接
 Session session = s.getSession();
 Channel channel = s.getChannel();
 ChannelSftp sftp = s.getSftp();// sftp操作类
 try {

 sftp.cd(directory); //进入目录
 File file = new File(saveFile);
 boolean bFile;
 bFile = false;
 bFile = file.exists();
 if (!bFile) {
 bFile = file.mkdirs();//创建目录
 }
 OutputStream out=new FileOutputStream(new File(saveFile,downloadFile));

 sftp.get(downloadFile, out);

 out.flush();
 out.close();

 } catch (Exception e) {
 throw new Exception(e.getMessage(),e);
 } finally {
 disConn(session,channel,sftp);
 }
 }

3.删除文件

/**
 * 删除文件
 * @param directory 要删除文件所在目录
 * @param deleteFile 要删除的文件
 */
 public static void delete(String directory, String deleteFile) throws Exception {
 SFTP s=new SFTP();
 getConnect(s);//建立连接
 Session session = s.getSession();
 Channel channel = s.getChannel();
 ChannelSftp sftp = s.getSftp();// sftp操作类
 try {
 sftp.cd(directory); //进入的目录应该是要删除的目录的上一级
 sftp.rm(deleteFile);//删除目录
 } catch (Exception e) {
 throw new Exception(e.getMessage(),e);
 } finally {
 disConn(session,channel,sftp);
 }
 }

4.列出目录下的文件

/**
 * 列出目录下的文件
 * @param directory 要列出的目录
 * @return list 文件名列表
 * @throws Exception
 */
 public static List<String> listFiles(String directory) throws Exception {
 SFTP s=new SFTP();
 getConnect(s);//建立连接
 Session session = s.getSession();
 Channel channel = s.getChannel();
 ChannelSftp sftp = s.getSftp();// sftp操作类
 Vector fileList=null;
 List<String> fileNameList = new ArrayList<String>();
 fileList = sftp.ls(directory); //返回目录下所有文件名称
 disConn(session,channel,sftp);

 Iterator it = fileList.iterator(); 

 while(it.hasNext()) { 

 String fileName = ((LsEntry)it.next()).getFilename();
 if(".".equals(fileName) || "..".equals(fileName)){
 continue;
 }
 fileNameList.add(fileName); 

 } 

 return fileNameList;
 } 

5.删除目录下所有文件

/**
 * 删除目录下所有文件
 * @param directory 要删除文件所在目录
 */
 public static void deleteAllFile(String directory) throws Exception{
 SFTP s=new SFTP();
 getConnect(s);//建立连接
 Session session = s.getSession();
 Channel channel = s.getChannel();
 ChannelSftp sftp = s.getSftp();// sftp操作类
 try {
 List <String> files=listFiles(directory);//返回目录下所有文件名称
 sftp.cd(directory); //进入目录

 for (String deleteFile : files) {
 sftp.rm(deleteFile);//循环一次删除目录下的文件
 }
 } catch (Exception e) {
 throw new Exception(e.getMessage(),e);
 } finally {
 disConn(session,channel,sftp);
 }

 }

6.删除目录 (删除的目录必须为空)

/**
 * 删除目录 (删除的目录必须为空)
 * @param deleteDir 要删除的目录
 */
 public static void deleteDir(String deleteDir) throws Exception {
 SFTP s=new SFTP();
 getConnect(s);//建立连接
 Session session = s.getSession();
 Channel channel = s.getChannel();
 ChannelSftp sftp = s.getSftp();// sftp操作类
 try {

 sftp.rmdir(deleteDir);

 } catch (Exception e) {
 throw new Exception(e.getMessage(),e);
 } finally {
 disConn(session,channel,sftp);
 }
 }

7.创建目录

 /**
 * 创建目录
 * @param directory 要创建的目录 位置
 * @param dir 要创建的目录
 */
 public static void creatDir(String directory,String dir) throws Exception {
 SFTP s=new SFTP();
 getConnect(s);//建立连接
 Session session = s.getSession();
 Channel channel = s.getChannel();
 ChannelSftp sftp = s.getSftp();// sftp操作类
 try {
 sftp.cd(directory);
 sftp.mkdir(dir);
 } catch (Exception e) {
 throw new Exception(e.getMessage(),e);
 } finally {
 disConn(session,channel,sftp);
 }
 }

8.更改文件名

/**
 * 更改文件名
 * @param directory 文件所在目录
 * @param oldFileNm 原文件名
 * @param newFileNm 新文件名
 * @throws Exception
 */
 public static void rename(String directory, String oldFileNm, String newFileNm) throws Exception {
 SFTP s=new SFTP();
 getConnect(s);//建立连接
 Session session = s.getSession();
 Channel channel = s.getChannel();
 ChannelSftp sftp = s.getSftp();// sftp操作类
 try {
 sftp.cd(directory);
 sftp.rename(oldFileNm, newFileNm);
 } catch (Exception e) {
 throw new Exception(e.getMessage(),e);
 } finally {
 disConn(session,channel,sftp);
 }
 } 

9.进入目录

/**
 * 进入目录
 * @param directory
 * @throws Exception
 */
 public static void cd(String directory)throws Exception { 

 SFTP s=new SFTP();
 getConnect(s);//建立连接
 Session session = s.getSession();
 Channel channel = s.getChannel();
 ChannelSftp sftp = s.getSftp();// sftp操作类
 try {
 sftp.cd(directory); //目录要一级一级进
 } catch (Exception e) {
 throw new Exception(e.getMessage(),e);
 } finally {
 disConn(session,channel,sftp);
 }
 } 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java使用SFTP上传文件到资源服务器

    本文实例为大家分享了java实现SFTP上传文件到资源服务器工具类,供大家参考,具体内容如下 首先得创建连接sftp服务器的公共类MySftp.java: package cn.test.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.text.SimpleDateFormat; import java.util.Date; import

  • java实现sftp客户端上传文件以及文件夹的功能代码

    1.依赖的jar文件 jsch-0.1.53.jar 2.登录方式有密码登录,和密匙登录 代码: 主函数: import java.util.Properties; import com.cloudpower.util.Login; import com.util.LoadProperties; public class Ftp { public static void main(String[] args) { Properties properties = LoadProperties.ge

  • JAVA SFTP文件上传、下载及批量下载实例

    1.jsch官方API查看地址(附件为需要的jar) http://www.jcraft.com/jsch/ 2.jsch简介 JSch(Java Secure Channel)是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序. SFTP(Secure File Transfer Protocol)安全文件传送协议.可以为传输文件提供一种安全的加密方法.SFTP 为 SSH的一部份,是一种传输

  • Java使用sftp定时下载文件的示例代码

    sftp简介 sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的网络的加密方法.sftp 与 ftp 有着几乎一样的语法和功能.SFTP 为 SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式.其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)

  • Java使用SFTP上传文件到服务器的简单使用

    最近用到SFTP上传文件查找了一些资料后自己做了一点总结,方便以后的查询.具体代码如下所示: /** * 将文件上传到服务器 * * @param filePath * 文件路径 * @param channelSftp * channelSftp对象 * @return */ public static boolean uploadFile(String filePath, ChannelSftp channelSftp) { OutputStream outstream = null; In

  • java使用JSCH实现SFTP文件管理

    本文实例为大家分享了java使用JSCH实现SFTP文件管理的具体代码,供大家参考,具体内容如下 一.连接配置 1.在项目中导入jsch-0.1.51.jar包: 2.创建SFTP类,存放连接属性,其中要注意一点,在进行FTP操作时,一个会话在建立连接通道后进入A目录进行文件操作,不能直接跳到同级或上级目录操作,需要先退出当前会话或者新建会话. public class SFTP{ private Session session;//会话 private Channel channel;//连接

  • 详解Java使用Jsch与sftp服务器实现ssh免密登录

    一.什么是SFTP? SFTP是一个安全文件传送协议,可以为传输文件提供一种安全的加密方法.SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式.SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的.但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP. 二.什么是Jsch以及它的作用? Jsch是一个纯粹的用java实现SSH功能的java library.如果要知道Jsch的功

  • 如何用java程序(JSch)运行远程linux主机上的shell脚本

    运行远程主机上的shell脚本 下面的例子是教给大家如何通过java程序,运行远程主机上的shell脚本.(我讲的不是一个黑客学习教程,而是使用用户名密码去执行有用户认证资格的主机上的shell脚本).并且通过java程序获得shell脚本的输出. 首先通过maven坐标引入JSch依赖库,我们正是通过JSch去执行远程主机上的脚本. <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch<

  • Java实战之简单的文件管理器

    示例图 可以在指定目录下实现文件的创建.文件夹的创建.文件的复制.粘贴.删除.重命名.返回上一级目录.以及不同设备之间文件的发送 完整代码 package com.atguitu.java; public class FileDemo { public static void main(String[] args) { FileSystem fs = new FileSystem(); fs.start(); } } package com.atguitu.java; import java.a

  • Java工具jsch.jar实现上传下载

    在做运维的时候,我们一般使用shell脚本实现文件的服务器之间定时传输,那么对于一些不会shell脚本的童鞋,就得使用万能的编程语言了,这里我们介绍一款Java操作ftp的工具,那就是jsch.jar.工具已经写好,可以根据实际情况做调整,注释很清晰.大家按需阅读: package com.wdy.tools.utils.sftputil; import java.io.File; import java.io.FileInputStream; import java.io.FileOutput

  • Java SSH 秘钥连接mysql数据库的方法

    当目标数据库不能直连的,需要一个服务器作为中间跳板的时候,我们需要通过SSH通道连接数据库. ps:使用ssh连接,相当于本地开了个端口去连接远程的服务,就是ssh通道,本地起的项目监听本地的端口,就可以使用这个通道进行数据传输. 1.引入依赖 <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</ver

  • 如何在java中使用SFTP协议安全的传输文件

    本文介绍在Java中如何使用基于SSH的文件传输协议(SFTP)将文件从本地上传到远程服务器,或者将文件在两个服务器之间安全的传输.我们先来了解一下这几个协议 SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议.比如:我们购买的云服务器登陆的时候使用的协议都是ssh. ftp协议通常是用来在两个服务器之间传输文件的,但是它本质上是不安全的. 那么SFTP是什么?SFTP可以理解为SSH + FTP,也就是安全的网络文件传输协议. 一般来说,SFTP和FTP服务都是使用相应的客户端软

  • Java使用Sftp和Ftp实现对文件的上传和下载

    sftp和ftp两种方式区别,还不清楚的,请自行百度查询,此处不多赘述.完整代码地址在结尾!! 第一步,导入maven依赖 <!-- FTP依赖包 --> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.6</version> </dependency> <!

  • Java8实现FTP及SFTP文件上传下载

    有网上的代码,也有自己的理解,代码备份 一般连接windows服务器使用FTP,连接linux服务器使用SFTP.linux都是通过SFTP上传文件,不需要额外安装,非要使用FTP的话,还得安装FTP服务(虽然刚开始我就是这么干的). 另外就是jdk1.8和jdk1.7之前的方法有些不同,网上有很多jdk1.7之前的介绍,本篇是jdk1.8的 添加依赖Jsch-0.1.54.jar <!-- https://mvnrepository.com/artifact/com.jcraft/jsch -

  • SpringBoot集成FTP与SFTP连接池流程

    目录 简介 FTP 简介 FTPS 简介 SFTP 简介 FTP SFTP FTPS区别 实战代码 公共配置文件 pom.xml 配置 application.yml 配置 FTP 连接池 FTP 配置文件 ftp.properties FTP 配置实体类 FTP 连接工厂 FTP 连接池服务接口 FTP 工具类 SFTP 连接池 SFTP 配置文件 sftp.properties SFTP 配置实体类 SFTP 连接工厂 SFTP 连接池服务接口 SFTP 工具类 SFTP 工具类 测试代码

随机推荐