关于spring:在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,咱们能够应用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)

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

本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 – zimug.com

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源! 。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《实战前后端拆散RBAC权限管理系统》
  • 《实战SpringCloud微服务从青铜到王者》
  • 《VUE深入浅出系列》

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理