本文介绍在Java中如何使用基于SSH的文件传输协议(SFTP)将文件从本地上传到远程服务器,或者将文件在两个服务器之间安全的传输。我们先来了解一下这几个协议

  • SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。比如:我们购买的云服务器登陆的时候使用的协议都是ssh。
  • ftp协议通常是用来在两个服务器之间传输文件的,但是它本质上是不安全的。
  • 那么SFTP是什么?SFTP可以理解为SSH + FTP,也就是安全的网络文件传输协议。

一般来说,SFTP和FTP服务都是使用相应的客户端软件来提供服务。如果你希望在java代码中使用SFTP协议进行安全的文件传输,那么这篇文章非常适合你。

1. 导入JSch 依赖包

在maven项目pom.xml中导入如下的坐标,我们使用JSch,JSch将SFTP协议封装为对应的API供我们调用。

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

2. 文件传输 – JSch例子

2.1 get与put方法

在中JSch,我们可以使用putget在服务器之间进行文件传输。put方法用来将文件从本地系统传输到远程服务器。

channelSftp.put(localFile, remoteFile);

get方法将文件从远程服务器下载到本地系统。

channelSftp.get(remoteFile, localFile);

2.2 使用用户名和密码进行认证

JSch jsch = new JSch();
jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");
jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT); jschSession.setPassword(PASSWORD);
  • "/home/zimug/.ssh/known_hosts"为SSH的known_hosts文件,也就是可信远程主机的公钥保存文件。
  • USERNAME 为用户名
  • REMOTE_HOST远程主机的Ip
  • REMOTE_PORT远程主机端口
  • PASSWORD远程主机登录密码

2.3.使用公钥和私钥进行认证

如果读者不能理解公钥和私钥的用法及含义,需要先自行补充一下SSH知识。

  • 本地私钥–/home/登录用户名/.ssh/id_rsa
  • 远程公钥默认保存位置–~/.ssh/authorized_keys
JSch jsch = new JSch();
jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");
jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT); jsch.addIdentity("/home/zimug/.ssh/id_rsa");

2.4 完整JSch文件传输示例

将文件从本地系统传输到远程服务器1.2.3.4,并使用SSH密码登陆方式进行身份验证。

import com.jcraft.jsch.*;

public class SFTPFileTransfer {

    private static final String REMOTE_HOST = "1.2.3.4";  //远程主机ip
private static final String USERNAME = ""; //登录用户名
private static final String PASSWORD = ""; //登陆密码
private static final int REMOTE_PORT = 22; //ssh协议默认端口
private static final int SESSION_TIMEOUT = 10000; //session超时时间
private static final int CHANNEL_TIMEOUT = 5000; //管道流超时时间 public static void main(String[] args) { String localFile = "/home/zimug/local/random.txt"; //本地文件路径
String remoteFile = "/home/zimug/remote/targetfile.txt"; //上传到远程的文件路径,要保证登录用户有写权限 Session jschSession = null; try { JSch jsch = new JSch();
jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");
jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT); // 通过ssh私钥的方式登录认证
// jsch.addIdentity("/home/zimug/.ssh/id_rsa"); // 通过密码的方式登录认证
jschSession.setPassword(PASSWORD);
jschSession.connect(SESSION_TIMEOUT); Channel sftp = jschSession.openChannel("sftp"); //建立sftp文件传输管道
sftp.connect(CHANNEL_TIMEOUT); ChannelSftp channelSftp = (ChannelSftp) sftp; // 传输本地文件到远程主机
channelSftp.put(localFile, remoteFile); channelSftp.exit(); } catch (JSchException | SftpException e) {
e.printStackTrace();
} finally {
if (jschSession != null) {
jschSession.disconnect();
}
}
System.out.println("文件传输完成!");
}
}

3. JSch异常处理

在文件上传的过程中,我们可能会遇到下面的一些异常

3.1UnknownHostKey异常

需要将远程服务器IP地址添加到known_hosts文件中。

$ ssh-keyscan -t rsa 1.2.3.4 >> ~/.ssh/known_hosts

3.2对于私钥无效异常

有可能是远程服务器重新生成了私钥,需要把私钥分发复制到本地服务器。

ssh-copy-id  -i  ~/.ssh/id_rsa.pub  <被分发的服务器ip>

3.3对于Auth fail异常

请确保提供的登录密码时正确的

com.jcraft.jsch.JSchException: Auth fail
at com.jcraft.jsch.Session.connect(Session.java:519)
at com.zimug.io.howto.SFTPFileTransfer.main(SFTPFileTransfer.java:34)

欢迎关注我的博客,里面有很多精品合集

  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

在java中使用SFTP协议安全的传输文件的更多相关文章

  1. Java中的UDP协议编程

    一. UDP协议定义   UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层——传输层,处于IP协议的上一层.UDP有不提供数据报分组.组装和不能对数据包 ...

  2. 如何在Linux中使用sFTP上传或下载文件与文件夹

    如何在Linux中使用sFTP上传或下载文件与文件夹 sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与 FTP(文件传输协议)类似. 然而,sFTP 比 FTP 更安全;它通过 ...

  3. java中如何生成可执行的jar文件

    java中如何生成可执行的jar文件 最简单的方法就是: jar -cfe Card.jar CardLayoutDemo CardLayoutDemo$1.class CardLayoutDemo$ ...

  4. Xshell5下利用sftp上传下载传输文件

    sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一样的语法和功能.SFTP 为 SSH ...

  5. Java中基于HTTP协议网络编程

    java中为我们的网络支持提供了java.net包,能够使我们以编程的方式来訪问Web服务功能,这篇博客,就跟大家分享一下.Java中的网络编程的知识.主要是学习下该java.net包下的API. U ...

  6. 在Java中实现UDP协议编程(DatagramSocket/DatagramPacket)

    1.什么是UDP协议? UDP( User Datagram Protocol )协议是用户数据报,在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层——传输层,处于IP协议的上一层. ...

  7. 使用Java中的IO流,把A文件里的内容输入到B文件中

    我们先创建两个文本文件,out.txt和in.txt,在out.txt中输入"Hello World",然后使用FileInputStream把字符串读取出来,再使用FileOut ...

  8. Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案

    注意:此参考解决方案只是针对xlsx格式的excel文件! 背景 前一段时间遇到一种情况,服务器经常宕机,而且没有规律性,查看GC日志发生了out of memory,是堆溢出导致的,分析了一下堆的d ...

  9. Java中获取classpath路径下的资源文件

    ClassLoader 提供了两个方法用于从装载的类路径中取得资源: public URL  getResource (String name); public InputStream  getRes ...

随机推荐

  1. [BUUOJ记录] [BJDCTF2020]EasySearch

    前面的突破点考察swp泄露以及md5截断认证,最后一步考察ssi注入 进入题目是一个登陆页面什么提示都没有,工具扫了一下发现swp泄露,得到登录验证页面的源码: <?php ob_start() ...

  2. 在Linux命令行里与其他用户通信

    大家好,我是良许 在 Linux 命令行里向其他用户发送信息很简单,很多命令都可以做到这点,麻烦的是你需要从众多命令中挑选一个合适的命令来使用.因此,我挑选了四种常用的 Linux 用户通信命令分享给 ...

  3. Effective Objective-C 的读书笔记

    本文主要是摘录了 <Effective Objective-C 2.0>一书中提到的编写高质量iOS 代码的几个方法. 1 熟悉Objective -C 1.1 OC 起源 OC 为C语言 ...

  4. MvvmLight框架使用入门(5)

    上一次写MvvmLight框架使用入门(4)的时候还在用Visual Studio 2015,我儿子也不会过来盖上我的XPS……重启这个系列一方面是因为最近又开始写UWP的东西了,另一个是因为Mvvm ...

  5. Django+bootstrap启动登录模板页面(Django三)

    上次用Django启动了我的第一个页面 具体步骤参考:初步启动DjangoDjango启动第一个页面但是页面非常简陋,所以我从网上找了个模板,下载网址:免费下载模板,解压后内部文件如下: 效果图:下面 ...

  6. python中faker模块:产生随机数据的模块

    #pip install faker #产生各种随机数据的模块 想要运用更多的随机数据,可以百度查找下

  7. [Java并发编程之美]第1章 线程基础

    第1章 线程 1.1 线程与进程 进程是操作系统资源分配和调度的基本单位,但cpu资源是分配到线程的,也就是线程是CPU分配的基本单位. 线程自己的栈资源中,存放的局部变量是线程私有的,其他线程无法访 ...

  8. 当try、catch中有return时,finally中的代码会执行么?

    今天,看到一个面试题: try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 我们用代码来验证下: public static void mai ...

  9. python中的画笔控制函数

    蟒蛇绘制代码中的画笔控制函数 penup() ,pendown() ,pensize() , pencolor()函数 这里就将海龟想象成画笔 画笔控制函数,画笔操作后一直有效,一般成对出现 将画笔抬 ...

  10. stringstream使用

    stringstream的头文件是<sstream>,stringstream可以作为中间介质,实现字符串和数字之间的转换. 数字转string double a=213; string ...