From c5d0763172dcb6b59e5ff979f0c6640b20236186 Mon Sep 17 00:00:00 2001 From: xgc Date: Wed, 24 Jan 2024 12:34:18 +0800 Subject: [PATCH] =?UTF-8?q?starter=E5=86=85=E6=B7=BB=E5=8A=A0=E4=BA=86SSH?= =?UTF-8?q?=E4=B8=AD=E8=BD=AC=E9=9A=A7=E9=81=93=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client+/neutrino-proxy-client-starter/pom.xml | 12 ++++ .../starter/ssh/SSHConnectionFactory.java | 5 ++ .../starter/ssh/SSHConnectionService.java | 8 +++ .../starter/ssh/SSHConnectionServiceImpl.java | 60 +++++++++++++++++++ .../client/starter/ssh/SSHProxy.java | 23 +++++++ .../client/starter/ssh/SSHProxyFactory.java | 6 ++ .../starter/ssh/SSHProxyFactoryImpl.java | 59 ++++++++++++++++++ .../client/starter/ssh/Test.java | 18 ++++++ 8 files changed, 191 insertions(+) create mode 100644 client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionFactory.java create mode 100644 client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionService.java create mode 100644 client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionServiceImpl.java create mode 100644 client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxy.java create mode 100644 client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxyFactory.java create mode 100644 client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxyFactoryImpl.java create mode 100644 client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/Test.java diff --git a/client+/neutrino-proxy-client-starter/pom.xml b/client+/neutrino-proxy-client-starter/pom.xml index fcad790c..9c2a34ba 100644 --- a/client+/neutrino-proxy-client-starter/pom.xml +++ b/client+/neutrino-proxy-client-starter/pom.xml @@ -73,6 +73,18 @@ ${mica-auto.vaersion} provided + + + com.jcraft + jsch + 0.1.54 + + + com.jcraft + jzlib + 1.1.3 + + diff --git a/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionFactory.java b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionFactory.java new file mode 100644 index 00000000..1c3596b0 --- /dev/null +++ b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionFactory.java @@ -0,0 +1,5 @@ +package org.dromara.neutrinoproxy.client.starter.ssh; + +public class SSHConnectionFactory { + public static final SSHConnectionService factory = new SSHConnectionServiceImpl(); +} diff --git a/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionService.java b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionService.java new file mode 100644 index 00000000..fedf326c --- /dev/null +++ b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionService.java @@ -0,0 +1,8 @@ +package org.dromara.neutrinoproxy.client.starter.ssh; + +public interface SSHConnectionService { + String addConnection(String host, String username, String password, int localPort, int remotePort,String remoteHost); + void openTunnel(String sshId); + void closeTunnel(String sshId); + void closeAllTunnels(); +} \ No newline at end of file diff --git a/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionServiceImpl.java b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionServiceImpl.java new file mode 100644 index 00000000..0986221a --- /dev/null +++ b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHConnectionServiceImpl.java @@ -0,0 +1,60 @@ +package org.dromara.neutrinoproxy.client.starter.ssh; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class SSHConnectionServiceImpl implements SSHConnectionService { + + private Map connections; + private Map factories; + + public SSHConnectionServiceImpl() { + connections = new HashMap<>(); + factories = new HashMap<>(); + } + + @Override + public String addConnection(String host, String username, String password, int localPort, int remotePort,String remoteHost) { + SSHProxy connection = new SSHProxy(); + String sshId = UUID.randomUUID().toString(); + connection.setSshId(sshId); + connection.setHost(host); + connection.setUsername(username); + connection.setPassword(password); + connection.setLocalPort(localPort); + connection.setRemotePort(remotePort); + connection.setRemoteHost(remoteHost); + connections.put(connection.getSshId(), connection); + return sshId; + } + + @Override + public void openTunnel(String sshId) { + SSHProxy connection = connections.get(sshId); + if (connection != null && !factories.containsKey(sshId)) { + SSHProxyFactory factory = new SSHProxyFactoryImpl(connection); + factory.openTunnel(); + factories.put(sshId, factory); + } + } + + @Override + public void closeTunnel(String sshId) { + SSHProxyFactory factory = factories.get(sshId); + + if (factory != null) { + factory.closeTunnel(); + factories.remove(sshId); + } + } + + @Override + public void closeAllTunnels() { + for (Map.Entry entry : factories.entrySet()) { + SSHProxyFactory factory = entry.getValue(); + factory.closeTunnel(); + } + factories.clear(); + } +} \ No newline at end of file diff --git a/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxy.java b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxy.java new file mode 100644 index 00000000..903efc4e --- /dev/null +++ b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxy.java @@ -0,0 +1,23 @@ +package org.dromara.neutrinoproxy.client.starter.ssh; + +import lombok.Data; + +@Data +public class SSHProxy { + private String sshId; + + //跳板机服务器公网IP + private String host; + //跳板机服务器登录名 + private String username; + //跳板机登陆密码 + private String password; + //本地的端口 + private int localPort; + + //需代理服务器端口号 + private int remotePort; + //需代理服务器ip + private String remoteHost; + +} \ No newline at end of file diff --git a/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxyFactory.java b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxyFactory.java new file mode 100644 index 00000000..9ecb65ee --- /dev/null +++ b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxyFactory.java @@ -0,0 +1,6 @@ +package org.dromara.neutrinoproxy.client.starter.ssh; + +public interface SSHProxyFactory { + void openTunnel(); + void closeTunnel(); +} \ No newline at end of file diff --git a/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxyFactoryImpl.java b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxyFactoryImpl.java new file mode 100644 index 00000000..a6520e7b --- /dev/null +++ b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/SSHProxyFactoryImpl.java @@ -0,0 +1,59 @@ +package org.dromara.neutrinoproxy.client.starter.ssh; + +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.Session; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class SSHProxyFactoryImpl implements SSHProxyFactory { + private SSHProxy connection; + private Session session; + + public SSHProxyFactoryImpl(SSHProxy connection) { + this.connection = connection; + } + + @Override + public void openTunnel() { + try { + JSch jsch = new JSch(); + session = jsch.getSession(connection.getUsername(), connection.getHost(), 22); + session.setPassword(connection.getPassword()); + // 开启调试模式,打印更多详细日志 + java.util.Properties config = new java.util.Properties(); + config.put("StrictHostKeyChecking", "no"); + config.put("userauth.gssapi-with-mic", "no"); + config.put("compression.s2c", "zlib@openssh.com,zlib,none"); + config.put("compression.c2s", "zlib@openssh.com,zlib,none"); + session.setConfig(config); + session.setDaemonThread(true); + JSch.setLogger(new com.jcraft.jsch.Logger() { + public boolean isEnabled(int level) { + return true; + } + public void log(int level, String message) { + log.info("JSch - " + level + ": " + message); + } + }); + + int assignedPort = session.setPortForwardingL(connection.getLocalPort(), connection.getRemoteHost(), connection.getRemotePort()); + session.connect(10000); + if (assignedPort != -1) { + log.info("SSH connection established successfully!"); + } else { + log.info("Failed to establish SSH connection!"); + } + } catch (Exception e) { + // 异常处理 + e.printStackTrace(); + } + } + + @Override + public void closeTunnel() { + if (session != null && session.isConnected()) { + session.disconnect(); + log.info("SSH connection closed successfully!"); + } + } +} \ No newline at end of file diff --git a/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/Test.java b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/Test.java new file mode 100644 index 00000000..46807f5f --- /dev/null +++ b/client+/neutrino-proxy-client-starter/src/main/java/org/dromara/neutrinoproxy/client/starter/ssh/Test.java @@ -0,0 +1,18 @@ +package org.dromara.neutrinoproxy.client.starter.ssh; + +public class Test { + public static void main(String[] args) { + + // 添加SSH连接 + String sshId = SSHConnectionFactory.factory.addConnection("194.36.209.398", "root", "xxxxxx", 1234, 6379,"xx.xx.xx.xx"); + SSHConnectionFactory.factory.openTunnel(sshId); + try { + Thread.sleep(100000000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + // 关闭SSH隧道 + SSHConnectionFactory.factory.closeTunnel(sshId); + + } +}