栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录
  • maven坐标
  • JSch简单介绍
  • 连接demo

maven坐标
        
        
            redis.clients
            jedis
            3.7.0
        
        
        
        
            com.jcraft
            jsch
            0.1.54
        
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;
			
    }
    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();
            }
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/349093.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号