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

本文介绍在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,我们可以使用put和get在服务器之间进行文件传输。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)
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
在java中使用SFTP协议安全的传输文件的更多相关文章
- Java中的UDP协议编程
一. UDP协议定义 UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层——传输层,处于IP协议的上一层.UDP有不提供数据报分组.组装和不能对数据包 ...
- 如何在Linux中使用sFTP上传或下载文件与文件夹
如何在Linux中使用sFTP上传或下载文件与文件夹 sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与 FTP(文件传输协议)类似. 然而,sFTP 比 FTP 更安全;它通过 ...
- java中如何生成可执行的jar文件
java中如何生成可执行的jar文件 最简单的方法就是: jar -cfe Card.jar CardLayoutDemo CardLayoutDemo$1.class CardLayoutDemo$ ...
- Xshell5下利用sftp上传下载传输文件
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一样的语法和功能.SFTP 为 SSH ...
- Java中基于HTTP协议网络编程
java中为我们的网络支持提供了java.net包,能够使我们以编程的方式来訪问Web服务功能,这篇博客,就跟大家分享一下.Java中的网络编程的知识.主要是学习下该java.net包下的API. U ...
- 在Java中实现UDP协议编程(DatagramSocket/DatagramPacket)
1.什么是UDP协议? UDP( User Datagram Protocol )协议是用户数据报,在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层——传输层,处于IP协议的上一层. ...
- 使用Java中的IO流,把A文件里的内容输入到B文件中
我们先创建两个文本文件,out.txt和in.txt,在out.txt中输入"Hello World",然后使用FileInputStream把字符串读取出来,再使用FileOut ...
- Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案
注意:此参考解决方案只是针对xlsx格式的excel文件! 背景 前一段时间遇到一种情况,服务器经常宕机,而且没有规律性,查看GC日志发生了out of memory,是堆溢出导致的,分析了一下堆的d ...
- Java中获取classpath路径下的资源文件
ClassLoader 提供了两个方法用于从装载的类路径中取得资源: public URL getResource (String name); public InputStream getRes ...
随机推荐
- Linux平台Zabbix Agent的安装配置
这里简单总结一下Linux平台Zabbix Agent的安装配置,实验测试的Zabbix版本比较老了(Zabbix 3.0.9),不过版本虽然有点老旧,但是新旧版本的安装步骤.流程基本差别不大.这里的 ...
- Java判断一个字符串是否是回文
package com.spring.test; /** * 判断字符串是否为回文 * * @author liuwenlong * @create 2020-08-31 11:33:04 */ @S ...
- 大量数据也不在话下,Spring Batch并行处理四种模式初探
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Spring相关文章:Springboot-Cloud 前面写了一篇文章<通过例子讲解Spring Batch入门,优 ...
- Unity3D与iOS的交互
1. 关于Unity3D Unity3D(以下简称U3D)是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开 ...
- CSAPP =2= 信息的表示和处理
思维导图 预计阅读时间:30min 阅读书籍 <深入理解计算机系统 第五版> 参考视频 [精校中英字幕]2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频 参考文章 ...
- oracle之二管理undo
管理undo(PPT-I-299-309) 7.1 undo的作用(SMON) 使用undo tablespace 存放从datafiles 读出的数据块的前镜像,提供以下四种情况所需要的信息 ...
- Proxy使用详解
文档:Proxy 基本使用就不赘述,看文档即可 通用 1.Proxy可以包装任何形式的对象:包括原生数组,函数,甚至另一个代理 2.代理实例中没有指定的handler,实际就是操作原对象target: ...
- C#开发PACS医学影像处理系统(十一):Dicom影像挂片协议
通俗点说,挂片协议可以看作整个系统的一个相对复杂一点的配置文件,可以用JSON或XML格式来读取与保存, 另外,可以制作一个独立的exe配置程序来管理这些挂片协议. 假设配置了CT的挂片协议的右键菜单 ...
- k8s运行容器之deployment(三)
deployment 我们已经知道k8s是通过各种controller来管理pod的生命周期.为了满足不同业务场景,k8s开发了Deployment.ReplicaSet.DaemonSet.Stat ...
- TCP连接问题之CLOSE_WAIT和TIME_WAIT过多
参考博文 https://dengqsintyt.iteye.com/blog/2086485 Timeout waiting for connection异常排查:https://blog.csdn ...