【小记】使用JSch和jedis通过跳板机连接redis

maven坐标

        <!--Redis依赖-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.7.0</version>
        </dependency>
        
        <!--jsch依赖-->
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>

JSch简单介绍

JSch是纯java编写的用于ssh远程登录服务的工具。
JSch官网:http://www.jcraft.com/jsch/

JSch可以通过SSH2协议登录远程服务器,并且可以几种打开不同的协议通道,并进行xi相应操作。
Channel的类型列表:
在这里插入图片描述
比如如果跳板机没有限制shell命令,我们可以按照如下代码,在本地模拟一个控制台。不过跳板机出于安全考虑都会限制shell功能,执行大部分shell命令都会出现如下提示:

rbash: /usr/lib/command-not-found: restricted: cannot specify `/' in command names

ssh登录执行shell示例代码:

JSch jsch = new JSch();
Session session = jsch.getSession("登录名", "跳板机域名或ip", "跳板机端口号");
ChannelShell shell = (ChannelShell) session.openChannel("shell");
shell.setPtyType("dumb");
shell.setPty(true);
shell.connect(60000);

OutputStream outputStream = shell.getOutputStream();
InputStream inputStream = shell.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
Scanner scanner = new Scanner(System.in);
while(true) {
    System.err.println("输入linux shell命令:");
    String input = scanner.nextLine();
    System.out.println("输入命令为:" + input);
    outputStream.write((input + "\n").getBytes());
    outputStream.flush();
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        System.out.println(line);
    }
}

原本想尝试一下ssh登录跳板机之后,使用EOF操作redis,但是因为跳板机通常限制命令,所以放弃。

连接demo

连接的方式最主要的就是将跳板机session,绑定远程redis服务ip和端口号到本地机器ip和端口上。即:

session.setPortForwardingL(config.getLocalPort(), config.getRedisHost(), config.getRedisPort());

看一下setPortForwardingL方法。
在这里插入图片描述
示例代码如下:

package jsch;

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.Objects;

public class RedisSSHTool {
    private static RedisConnectConfig connectConfig;
    static {
        connectConfig = new RedisConnectConfig();
        //redis域名或ip
        connectConfig.setRedisHost("redis域名或ip");
        //redis端口号
        connectConfig.setRedisPort(6379);
        //redis密码
        connectConfig.setRedisPassword("redis密码");
        //跳板机域名或ip
        connectConfig.setSshHost("跳板机域名或ip");
        //跳板机端口号
        connectConfig.setSshPort(6222);
        //跳板机登录名
        connectConfig.setSshUsername("跳板机登录名");
        //跳板机登录密码
        connectConfig.setSshPassword("跳板机登录密码");
    }

    static class RedisConnectConfig{
        private String redisHost;
        private Integer redisPort;
        private String redisPassword;
        //本地机器IP
        private String localHost = "127.0.0.1";
        //本地端口号 - 选任意一个未被占用端口号即可
        private int localPort = 33333;
        private String sshHost;
        private int sshPort;
        private String sshUsername;
        private String sshPassword;
		/** getter && setter **/	
    }
    public static Session getSession(RedisConnectConfig config) throws JSchException {
        JSch jsch = new JSch();
        //设置ssh目标跳板机连接信息
        Session session = jsch.getSession(config.getSshUsername(), config.getSshHost(), config.getSshPort());
        session.setPassword(config.getSshPassword());
        session.setConfig("StrictHostKeyChecking", "no");
        session.setConfig("userauth.gssapi-with-mic", "no");
        //将session绑定本地机器ip和端口
        session.setPortForwardingL(config.getLocalPort(), config.getRedisHost(), config.getRedisPort());
        //开启ssh跳板机连接
        session.connect(10000);
        return session;
    }

    public static void main(String[] args) {
        Session sshSession = null;
        try {
            //开启并绑定了本地机器ip和端口
            sshSession = getSession(connectConfig);
            JedisPoolConfig jedisConfig = new JedisPoolConfig();
            //连接redis使用跳板机session绑定的本地机器ip和端口
            JedisPool jedisPool = new JedisPool(jedisConfig, connectConfig.getLocalHost(), connectConfig.getLocalPort(),
                    10000, connectConfig.getRedisPassword());
            Jedis jedis = jedisPool.getResource();
            String selectDB = jedis.select(0);
            System.out.println("选择db结果:" + selectDB);
            String value = jedis.get("wlc:dict:biz_order_status");
            System.out.println("测试key值为:" + value);
        } catch (JSchException e) {
            e.printStackTrace();
        } finally {
            if(Objects.nonNull(sshSession) && sshSession.isConnected()) {
                sshSession.disconnect();
            }
        }
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSch是一个Java实现的SSH2协议客户端库,可以用于在Java程序中实现SSH连接和传输文件等功能。使用JSch实现跳板机登录其它主机的步骤如下: 1. 创建跳板机连接Session ```java JSch jsch = new JSch(); Session session = jsch.getSession("username", "jumpserver", 22); session.setConfig("StrictHostKeyChecking", "no"); session.setPassword("password"); session.connect(); ``` 其中,"username"是跳板机的用户名,"jumpserver"是跳板机的IP地址或域名,22是SSH端口号,"password"是跳板机的登录密码。 2. 创建SSH连接到目标主机 ```java String host = "targetserver"; int port = 22; String user = "username"; String password = "password"; int assignedPort = session.setPortForwardingL(0, host, port); System.out.println("localhost:" + assignedPort + " -> " + host + ":" + port); JSch jsch2 = new JSch(); Session session2 = jsch2.getSession(user, "localhost", assignedPort); session2.setConfig("StrictHostKeyChecking", "no"); session2.setPassword(password); session2.connect(); ``` 其中,"targetserver"是目标主机的IP地址或域名,22是SSH端口号,"username"是目标主机的用户名,"password"是目标主机的登录密码。 3. 在SSH连接上执行命令 ```java String command = "ls -l"; Channel channel = session2.openChannel("exec"); ((ChannelExec) channel).setCommand(command); channel.setInputStream(null); ((ChannelExec) channel).setErrStream(System.err); InputStream in = channel.getInputStream(); channel.connect(); byte[] tmp = new byte[1024]; while (true) { while (in.available() > 0) { int i = in.read(tmp, 0, 1024); if (i < 0) { break; } System.out.print(new String(tmp, 0, i)); } if (channel.isClosed()) { if (in.available() > 0) { continue; } System.out.println("exit-status: " + channel.getExitStatus()); break; } try { Thread.sleep(1000); } catch (Exception ee) { } } channel.disconnect(); session2.disconnect(); ``` 其中,"ls -l"是要在目标主机上执行的命令,可以根据需求替换成其它命令。 通过以上三个步骤,就可以使用JSch实现跳板机登录其它主机并执行命令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值