java跳板执行ssh命令方式

 更新时间:2024年12月17日 10:25:46   作者:princeAladdin  
本文分享了在Java中使用跳板机执行SSH命令的方法,并推荐了一些Maven依赖,希望这些信息对大家有所帮助

java跳板执行ssh命令

maven依赖

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.5.6</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.5.6</version>
</dependency>
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;
import java.lang.invoke.MethodHandles;

public class SSHJumpServerUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

    public static String executeCommandWithJumpServer(String jumpHost, String jumpUser, String jumpPassword, int jumpPort,
                                                    String targetHost, String targetUser, String targetPassword, int targetPort,
                                                    String command) {
        String excuteResult = null;
        try {
            JSch jsch = new JSch();

            // 创建跳板会话
            Session jumpSession = jsch.getSession(jumpUser, jumpHost, jumpPort);
            jumpSession.setPassword(jumpPassword);
            jumpSession.setConfig("StrictHostKeyChecking", "no");
            jumpSession.connect();

            // 创建跳板通道
            int forwardedPort = 10022; // 本地转发端口
            jumpSession.setPortForwardingL(forwardedPort, targetHost, targetPort);

            // 创建目标服务器会话
            Session targetSession = jsch.getSession(targetUser, "localhost", forwardedPort);
            targetSession.setPassword(targetPassword);
            targetSession.setConfig("StrictHostKeyChecking", "no");
            targetSession.connect();

            // 执行命令
            ChannelExec channelExec = (ChannelExec) targetSession.openChannel("exec");
            channelExec.setCommand(command);

            InputStream in = channelExec.getInputStream();
            channelExec.connect();

            // 读取命令输出
            byte[] tmp = new byte[1024];
            while (true) {
                while (in.available() > 0) {
                    int i = in.read(tmp, 0, 1024);
                    if (i < 0) break;
                    excuteResult = new String(tmp, 0, i);
                }
                if (channelExec.isClosed()) {
                    if (in.available() > 0) continue;
                    LOGGER.debug("exit-status: " + channelExec.getExitStatus());
                    break;
                }
                try {
                    Thread.sleep(1000);
                } catch (Exception ee) {
                    ee.printStackTrace();
                }
            }

            // 关闭通道和会话
            channelExec.disconnect();
            targetSession.disconnect();
            jumpSession.disconnect();
        } catch (JSchException | IOException e) {
            LOGGER.error("跳板连接服务器执行异常",e);
        }

        return excuteResult;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot整合RocketMQ的方法详解

    SpringBoot整合RocketMQ的方法详解

    这篇文章主要为大家详细介绍了SpringBoot整合RocketMQ的方法,文中的示例代码讲解详细,对我们学习有一定帮助,感兴趣的小伙伴可以了解一下
    2022-08-08
  • 关于同一个service调用service本身的方法

    关于同一个service调用service本身的方法

    这篇文章主要介绍了关于同一个service调用service本身的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java随机生成姓名,手机号,住址代码示例

    Java随机生成姓名,手机号,住址代码示例

    这篇文章主要介绍了Java随机生成姓名,手机号,住址代码示例,属于Java基础方面的内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 手动添加jar包进Maven本地库内的方法

    手动添加jar包进Maven本地库内的方法

    这篇文章主要介绍了手动添加jar包进Maven本地库内的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 详解Spring获取配置的三种方式

    详解Spring获取配置的三种方式

    这篇文章主要为大家详细介绍了Spring获取配置的三种方式:@Value方式动态获取单个配置、@ConfigurationProperties+前缀方式批量获取配置以及Environment动态获取单个配置,感兴趣的可以了解一下
    2022-03-03
  • MyBatis传入数组集合类并使用foreach遍历

    MyBatis传入数组集合类并使用foreach遍历

    这篇文章主要介绍了MyBatis传入数组集合类并使用foreach遍历,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • maven一键删除仓库无用文件的实现

    maven一键删除仓库无用文件的实现

    大家都知道我们在使用Maven的时候,会下载一堆无用非jar文件,本文主要介绍了maven一键删除仓库无用文件的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Java基础教程之整数运算

    Java基础教程之整数运算

    Java的整数运算与C语言相同,遵循四则运算规则,下面这篇文章主要给大家介绍了关于Java基础教程之整数运算的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • SSM框架前后端信息交互实现流程详解

    SSM框架前后端信息交互实现流程详解

    这篇文章主要介绍了SSM框架前后端信息交互实现流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • MyBatis实现表连接查询写法(三种对应关系)的方法总结

    MyBatis实现表连接查询写法(三种对应关系)的方法总结

    这篇文章主要介绍了MyBatis实现表连接查询写法(一对一关系、一对多关系、多对多关系)的方法,文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-01-01

最新评论