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();
}
}
}
}