热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

这篇文章主要介绍了如何在java中使用SFTP协议安全的传输文件,帮助大家更好的理解和使用JSch,感兴趣的朋友可以了解下

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

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

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

1. 导入JSch 依赖包

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


  com.jcraft
  jsch
  0.1.55

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协议安全的传输文件的详细内容,更多关于Java 传输文件的资料请关注其它相关文章!


推荐阅读
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 解决MongoDB Compass远程连接问题
    本文记录了在使用阿里云服务器部署MongoDB后,通过MongoDB Compass进行远程连接时遇到的问题及解决方案。详细介绍了从防火墙配置到安全组设置的各个步骤,帮助读者顺利解决问题。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
author-avatar
漫路细雨中_575
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有