starter内添加了SSH中转隧道的实现
This commit is contained in:
@@ -73,6 +73,18 @@
|
||||
<version>${mica-auto.vaersion}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<!--SSH中转隧道-->
|
||||
<dependency>
|
||||
<groupId>com.jcraft</groupId>
|
||||
<artifactId>jsch</artifactId>
|
||||
<version>0.1.54</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.jcraft</groupId>
|
||||
<artifactId>jzlib</artifactId>
|
||||
<version>1.1.3</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package org.dromara.neutrinoproxy.client.starter.ssh;
|
||||
|
||||
public class SSHConnectionFactory {
|
||||
public static final SSHConnectionService factory = new SSHConnectionServiceImpl();
|
||||
}
|
||||
+8
@@ -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();
|
||||
}
|
||||
+60
@@ -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<String, SSHProxy> connections;
|
||||
private Map<String, SSHProxyFactory> 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<String, SSHProxyFactory> entry : factories.entrySet()) {
|
||||
SSHProxyFactory factory = entry.getValue();
|
||||
factory.closeTunnel();
|
||||
}
|
||||
factories.clear();
|
||||
}
|
||||
}
|
||||
+23
@@ -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;
|
||||
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
package org.dromara.neutrinoproxy.client.starter.ssh;
|
||||
|
||||
public interface SSHProxyFactory {
|
||||
void openTunnel();
|
||||
void closeTunnel();
|
||||
}
|
||||
+59
@@ -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", "[email protected],zlib,none");
|
||||
config.put("compression.c2s", "[email protected],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!");
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user