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

在Java中使用SFTP传输文件

1. 概述

在本教程中,我们将讨论如何在Java中使用SFTP从远程服务器上传和下载文件。

我们将使用三个不同的库:JSchSSHJApache Commons VFS来实现。

2. 使用 JSch

首先,让我们看看如何使用JSch库从远程服务器上传和下载文件。

2.1. Maven 配置

我们需要将 jsch 依赖添加到我们的 pom.xml 中:

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

jsch 的最新版本可以在 [Maven Central](https://search.maven.org/search?q=g:com.jcraft AND a:jsch) 上找到。

2.2. 设置 JSch

现在我们将设置 JSch。

JSch 使我们能够使用密码验证或公钥验证来访问远程服务器。 在此示例中,我们将使用密码验证

private ChannelSftp setupJsch() throws JSchException {
    JSch jsch = new JSch();
    jsch.setKnownHosts("/Users/john/.ssh/known_hosts");
    Session jschSession = jsch.getSession(user_name, remote_Host);
    jschSession.setPassword(pass_word);
    jschSession.connect();
    return (ChannelSftp) jschSession.openChannel("sftp");
}

在上面的示例中,remoteHost 代表远程服务器的名称或 IP 地址(即 example.com)。 我们可以将测试中使用的变量定义为:

private String remote_Host = "HOST_NAME_HERE";
private String user_name = "USERNAME_HERE";
private String pass_word = "PASSWORD_HERE";

我们还可以使用以下命令生成 known_hosts 文件:

ssh-keyscan -H -t rsa REMOTE_HOSTNAME >> known_hosts

2.3. 使用 JSch 上传文件

要将文件上传到远程服务器,我们将使用方法 ChannelSftp.put():

@Test
public void whenUploadFileUsingJsch_thenSuccess() throws JSchException, SftpException {
    ChannelSftp channelSftp = setupJsch();
    channelSftp.connect();
 
    String localFile = "src/main/resources/sample.txt";
    String remoteDir = "remote_sftp_test/";
 
    channelSftp.put(localFile, remoteDir + "jschFile.txt");
 
    channelSftp.exit();
}

在这个例子中,方法的第一个参数代表要传输的本地文件,src/main/resources/sample.txt,而*remoteDir*是远程服务器上目标目录的路径。

2.4. 使用 JSch 下载文件

我们还可以使用 ChannelSftp.get() 从远程服务器下载文件:

@Test
public void whenDownloadFileUsingJsch_thenSuccess() throws JSchException, SftpException {
    ChannelSftp channelSftp = setupJsch();
    channelSftp.connect();
 
    String remoteFile = "welcome.txt";
    String localDir = "src/main/resources/";
 
    channelSftp.get(remoteFile, localDir + "jschFile.txt");
 
    channelSftp.exit();
}

其中remoteFile是要下载的文件的路径,localDir代表目标本地目录的路径。

3. 使用 SSHJ

接下来,我们将使用 SSHJ 库从远程服务器上传和下载文件。

3.1. Maven 配置

首先,我们将依赖添加到我们的 pom.xml 中:

<dependency>
    <groupId>com.hierynomus</groupId>
    <artifactId>sshj</artifactId>
    <version>0.27.0</version>
</dependency>

最新的sshj版本可以在 [Maven Central](https://search.maven.org/search?q=g:com.hierynomus AND a:sshj) 上找到。

3.2. 设置 SSHJ

然后我们设置 SSHClient.

SSHJ 还允许我们使用密码或公钥认证来访问远程服务器。

我们将在示例中使用密码验证:

private SSHClient setupSshj() throws IOException {
    SSHClient client = new SSHClient();
    client.addHostKeyVerifier(new PromiscuousVerifier());
    client.connect(remoteHost);
    client.authPassword(username, password);
    return client;
}

3.3. 使用 SSHJ 上传文件

与 JSch 类似,我们将使用 SFTPClient.put() 方法将文件上传到远程服务器

@Test
public void whenUploadFileUsingSshj_thenSuccess() throws IOException {
    SSHClient sshClient = setupSshj();
    SFTPClient sftpClient = sshClient.newSFTPClient();
 
    sftpClient.put(localFile, remoteDir + "sshjFile.txt");
 
    sftpClient.close();
    sshClient.disconnect();
}

我们在这里定义了两个新变量:

private String localFile = "src/main/resources/input.txt";
private String remoteDir = "remote_sftp_test/";

3.4. 使用 SSHJ 下载文件

从远程服务器下载文件也是如此; 我们将使用 SFTPClient.get()

@Test
public void whenDownloadFileUsingSshj_thenSuccess() throws IOException {
    SSHClient sshClient = setupSshj();
    SFTPClient sftpClient = sshClient.newSFTPClient();
 
    sftpClient.get(remoteFile, localDir + "sshjFile.txt");
 
    sftpClient.close();
    sshClient.disconnect();
}

我们将添加上面使用的两个变量:

private String remoteFile = "welcome.txt";
private String localDir = "src/main/resources/";

4. 使用 Apache Commons VFS

最后,我们将使用 Apache Commons VFS 将文件传输到远程服务器。

实际上,Apache Commons VFS 内部使用 JSch 库

4.1. Maven 配置

我们需要将 commons-vfs2 依赖项添加到 pom.xml 中:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-vfs2</artifactId>
    <version>2.4</version>
</dependency>

最新版本的 commons-vfs2 可以在 [Maven Central](https://search.maven.org/search?q=g:org.apache.commons AND a:commons-vfs2) 上找到。

4.2. 使用 Apache Commons VFS 上传文件

Apache Commons VFS 有点不同。

我们将使用 FileSystemManager 从我们的目标文件创建 FileObjects,然后使用 FileObjects 传输我们的文件。

在本例中,我们将使用 FileObject.copyFrom() 方法上传文件:

@Test
public void whenUploadFileUsingVfs_thenSuccess() throws IOException {
    FileSystemManager manager = VFS.getManager();
 
    FileObject local = manager.resolveFile(
      System.getProperty("user.dir") + "/" + localFile);
    FileObject remote = manager.resolveFile(
      "sftp://" + username + ":" + password + "@" + remoteHost + "/" + remoteDir + "vfsFile.txt");
 
    remote.copyFrom(local, Selectors.SELECT_SELF);
 
    local.close();
    remote.close();
}

注意本地文件路径应该是绝对路径,远程文件路径应该以*sftp://username:password@remoteHost/*开头

4.3. 使用 Apache Commons VFS 下载文件

从远程服务器下载文件非常相似; 我们将使用 FileObject.copyFrom() 从 remoteFile 复制 localFile:

@Test
public void whenDownloadFileUsingVfs_thenSuccess() throws IOException {
    FileSystemManager manager = VFS.getManager();
 
    FileObject local = manager.resolveFile(
      System.getProperty("user.dir") + "/" + localDir + "vfsFile.txt");
    FileObject remote = manager.resolveFile(
      "sftp://" + username + ":" + password + "@" + remoteHost + "/" + remoteFile);
 
    local.copyFrom(remote, Selectors.SELECT_SELF);
 
    local.close();
    remote.close();
}

5. 结束

在本文中,我们学习了如何使用 Java 从远程 SFTP 服务器上传和下载文件。 为此,我们使用了多个库:JSchSSHJApache Commons VFS

完整的源代码可以在 over on GitHub 中找到。

相关文章:

  • OC5860降压芯片,MPS2459脚位一样,节省肖特基规格书
  • 哈工大李治军老师操作系统笔记【4】:系统调用的实现(Learning OS Concepts By Coding Them !)
  • 【光学】基于matlab色散曲线拟合【含Matlab源码 2053期】
  • (多级缓存)多级缓存
  • 复习三:线性表
  • C/C++语言100题练习计划 87——火柴棒等式(枚举实现)
  • 数仓架构演进
  • 约瑟夫问题对应算法的实现(思路分析) [Java][数据结构]
  • 深圳市第十二届职工技术创新运动会暨2022年深圳技能大赛—集成电路应用开发职业技能竞赛
  • 携职教育:对于想进入财务工作的人来说,第一个证考CPA还是CMA?
  • PostgreSQL 创建数据库、创建用户、赋予权限、创建表、主键总结
  • SynchroTrap:基于相似度的异常检测算法
  • 【微信小程序模板直接套用】微信小程序制作模板套用平台
  • 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-用户系统EP03
  • 适合开发者使用的6款浏览器,开发者工具很实用
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Java 网络编程(2):UDP 的使用
  • Javascript设计模式学习之Observer(观察者)模式
  • Just for fun——迅速写完快速排序
  • log4j2输出到kafka
  • 三栏布局总结
  • 算法-插入排序
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 因为阿里,他们成了“杭漂”
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #define
  • #在 README.md 中生成项目目录结构
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2015)JS ES6 必知的十个 特性
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (windows2012共享文件夹和防火墙设置
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (一)kafka实战——kafka源码编译启动
  • .htaccess 强制https 单独排除某个目录
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • /bin/bash^M: bad interpreter: No such file or directory
  • @ModelAttribute注解使用
  • [2018-01-08] Python强化周的第一天
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [AutoSar NVM] 存储架构
  • [IE9] GPU硬件加速到底是实用创新还是噱头
  • [LeetCode] 19. 删除链表的倒数第 N 个结点
  • [LeetCode] Sort List
  • [lintcode easy]Maximum Subarray
  • [NOIP 2003] 栈(三种方法:DP、数论、搜索)
  • [POI2007] ZAP-Queries (莫比乌斯反演)
  • [RK-Linux] 移植Linux-5.10到RK3399(六)| 检查GMAC(RTL8211F)配置使能千兆以太网
  • [Spring Cloud Task]3 框架配置详解
  • [svc][op]关闭linux centos各种声音