Java利用JSch实现SSH远程操作的技术指南

 更新时间:2025年03月13日 08:27:04   作者:拾荒的小海螺  
在日常开发中,许多应用需要通过 SSH 协议远程连接服务器来执行命令、上传或下载文件,JSch是一个功能强大的 Java 库,它提供了便捷的接口来实现 SSH 连接和其他远程管理功能,本文将介绍 JSch 的基本功能,并通过实际代码示例帮助您快速上手,需要的朋友可以参考下

1、简述

在日常开发中,许多应用需要通过 SSH 协议远程连接服务器来执行命令、上传或下载文件。JSch (Java Secure Channel) 是一个功能强大的 Java 库,它提供了便捷的接口来实现 SSH 连接、SFTP 文件传输和其他远程管理功能。

2、核心功能

  • SSH 远程命令执行:通过 SSH 协议在远程服务器上运行命令。
  • SFTP 文件传输:支持上传和下载文件。
  • 端口转发:支持本地端口和远程端口转发。
  • 密钥登录:支持通过密码和私钥进行认证。

在使用 JSch 之前,需要添加其依赖。以下是 JSch 的 Maven 依赖:

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

3、使用实例

3.1 远程执行命令

以下代码展示如何通过 SSH 连接到远程服务器并执行命令:

import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

import java.io.InputStream;

public class JSchExecExample {
    public static void main(String[] args) {
        String host = "your-server-ip";
        String user = "your-username";
        String password = "your-password";

        try {
            JSch jsch = new JSch();
            Session session = jsch.getSession(user, host, 22);
            session.setPassword(password);

            // 忽略主机密钥检查
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();

            // 打开执行命令的通道
            ChannelExec channel = (ChannelExec) session.openChannel("exec");
            channel.setCommand("ls -l");

            // 获取命令输出
            InputStream inputStream = channel.getInputStream();
            channel.connect();

            byte[] tmp = new byte[1024];
            while (inputStream.read(tmp) != -1) {
                System.out.print(new String(tmp));
            }

            channel.disconnect();
            session.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3.2 上传文件到远程服务器 (SFTP)

以下代码展示如何通过 SFTP 上传文件:

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class JSchSFTPUploadExample {
    public static void main(String[] args) {
        String host = "your-server-ip";
        String user = "your-username";
        String password = "your-password";
        String localFile = "/path/to/local/file.txt";
        String remoteDir = "/path/to/remote/dir/";

        try {
            JSch jsch = new JSch();
            Session session = jsch.getSession(user, host, 22);
            session.setPassword(password);

            // 忽略主机密钥检查
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();

            // 打开 SFTP 通道
            ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
            channel.connect();

            // 上传文件
            channel.put(localFile, remoteDir);
            System.out.println("File uploaded successfully!");

            channel.disconnect();
            session.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3.3 下载文件到本地 (SFTP)

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class JSchSFTPDownloadExample {
    public static void main(String[] args) {
        String host = "your-server-ip";
        String user = "your-username";
        String password = "your-password";
        String remoteFile = "/path/to/remote/file.txt";
        String localDir = "/path/to/local/dir/";

        try {
            JSch jsch = new JSch();
            Session session = jsch.getSession(user, host, 22);
            session.setPassword(password);

            // 忽略主机密钥检查
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();

            // 打开 SFTP 通道
            ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
            channel.connect();

            // 下载文件
            channel.get(remoteFile, localDir);
            System.out.println("File downloaded successfully!");

            channel.disconnect();
            session.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3.4 使用私钥进行认证

如果需要使用私钥而不是密码进行认证,可以如下设置:

import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

import java.io.InputStream;

public class JSchPrivateKeyExample {
    public static void main(String[] args) {
        String host = "your-server-ip";
        String user = "your-username";
        String privateKey = "/path/to/private/key";

        try {
            JSch jsch = new JSch();
            jsch.addIdentity(privateKey);

            Session session = jsch.getSession(user, host, 22);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();

            ChannelExec channel = (ChannelExec) session.openChannel("exec");
            channel.setCommand("ls -l");

            InputStream inputStream = channel.getInputStream();
            channel.connect();

            byte[] tmp = new byte[1024];
            while (inputStream.read(tmp) != -1) {
                System.out.print(new String(tmp));
            }

            channel.disconnect();
            session.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3.5 本地端口转发

通过 JSch 实现本地端口转发,可以让本地端口访问远程服务:

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class JSchPortForwarding {
    public static void main(String[] args) {
        String host = "your-server-ip";
        String user = "your-username";
        String password = "your-password";

        try {
            JSch jsch = new JSch();
            Session session = jsch.getSession(user, host, 22);
            session.setPassword(password);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();

            // 设置本地端口转发
            int assignedPort = session.setPortForwardingL(8888, "localhost", 8080);
            System.out.println("Local port forwarding: localhost:" + assignedPort + " -> localhost:8080");

            // 保持连接
            Thread.sleep(60000);

            session.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4、总结

以上JSch常见的使用样例,JSch常见的使用场景是自动化远程管理、文件传输、构建SSH隧道等。以下是JSch 的优势:

  • 轻量级:单个 JAR 包即可使用。
  • 功能丰富:支持 SSH、SFTP、端口转发等多种功能。
  • 开源免费:无额外成本。

到此这篇关于Java利用JSch实现SSH远程操作的技术指南的文章就介绍到这了,更多相关Java JSch SSH远程操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java查询Elasticsearch数据根据指定id检索(in查询)、sql权限过滤、多字段匹配检索及数据排序

    Java查询Elasticsearch数据根据指定id检索(in查询)、sql权限过滤、多字段匹配检索及数据排序

    在Java开发中Elasticsearch(简称ES)是一个非常流行的搜索引擎,它提供了强大的全文搜索和分析功能,这篇文章主要给大家介绍了关于Java查询Elasticsearch数据根据指定id检索(in查询)、sql权限过滤、多字段匹配检索及数据排序的相关资料,需要的朋友可以参考下
    2024-05-05
  • Java中的输出格式化问题小结

    Java中的输出格式化问题小结

    在Java中,System.out.printf方法用于格式化输出,格式化字符串`%.6f`表示浮点数保留6位小数,其他格式化选项包括`%d`(整数)、`%s`(字符串)和`%e`(科学计数法),示例代码展示了如何使用这些格式化选项,感兴趣的朋友一起看看吧
    2025-02-02
  • Java解析pdf格式发票的代码实现

    Java解析pdf格式发票的代码实现

    为了减少用户工作量及误操作的可能性,需要实现用户上传PDF格式的发票,系统通过解析PDF文件获取发票内容,并直接将其写入表单,以下文章记录了功能实现的代码,需要的朋友可以参考下
    2024-08-08
  • SpringBoot在容器中创建实例@Component和@bean有什么区别

    SpringBoot在容器中创建实例@Component和@bean有什么区别

    这篇文章主要介绍了SpringBoot在容器中创建实例@Component和@bean有什么区别,在Spring Boot中,@Component注解和@Bean注解都可以用于创建bean。它们的主要区别在于它们的作用范围和创建方式
    2023-03-03
  • Java中的关键字synchronized 详解

    Java中的关键字synchronized 详解

    这篇文章主要介绍了Java中的关键字synchronized,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • springboot应用中使用过滤器的过程详解

    springboot应用中使用过滤器的过程详解

    过滤器通常用于实现跨切面的功能,例如身份验证、日志记录、请求和响应的修改、性能监控等,这篇文章主要介绍了springboot应用中使用过滤器,需要的朋友可以参考下
    2023-06-06
  • Spring Boot修改内置Tomcat默认端口号的示例

    Spring Boot修改内置Tomcat默认端口号的示例

    本篇文章主要介绍了Spring Boot修改内置Tomcat端口号的示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • spring结合hibernate示例详解

    spring结合hibernate示例详解

    这篇文章主要介绍了spring结合hibernate结合,需要的朋友可以参考下
    2017-09-09
  • Java多线程 BlockingQueue实现生产者消费者模型详解

    Java多线程 BlockingQueue实现生产者消费者模型详解

    这篇文章主要介绍了Java多线程 BlockingQueue实现生产者消费者模型详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 解析Flink内核原理与实现核心抽象

    解析Flink内核原理与实现核心抽象

    Flink API提供了开发的接口,此外,为了实现业务逻辑,还必须为开发者提供自定义业务逻辑的能力,下面为大家解析Flink内核原理与实现核心抽象
    2021-08-08

最新评论