From 43bbd33bbe58f180fcf8727164eb83ba6011e0ca Mon Sep 17 00:00:00 2001 From: sidian Date: Wed, 2 Sep 2020 20:02:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=A1=A5=E5=85=85=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=BD=AC=E5=8F=91=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/extra/ssh/JschUtil.java | 32 +++++++++++++++---- .../cn/hutool/extra/ssh/JschUtilTest.java | 20 ++++++++++-- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java index 62211cab1..356907ee9 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java @@ -6,13 +6,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.net.LocalPortGenerater; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; -import com.jcraft.jsch.Channel; -import com.jcraft.jsch.ChannelExec; -import com.jcraft.jsch.ChannelSftp; -import com.jcraft.jsch.ChannelShell; -import com.jcraft.jsch.JSch; -import com.jcraft.jsch.JSchException; -import com.jcraft.jsch.Session; +import com.jcraft.jsch.*; import java.io.IOException; import java.io.InputStream; @@ -232,6 +226,30 @@ public class JschUtil { return false; } + /** + * 绑定ssh服务端的serverPort端口, 到host主机的port端口上.
+ * 即数据从ssh服务端的serverPort端口, 流经ssh客户端, 达到host:port上. + * + * @param session 与ssh服务端建立的会话 + * @param bindPort ssh服务端上要被绑定的端口 + * @param host 转发到的host + * @param port host上的端口 + * @return 成功与否 + * @throws JschRuntimeException 端口绑定失败异常 + */ + public static boolean bindRemotePort(Session session, int bindPort, String host, int port) throws JschRuntimeException { + if (session != null && session.isConnected()) { + try { + session.setPortForwardingR(bindPort, host, port); + } catch (JSchException e) { + throw new JschRuntimeException(e, "From [{}] mapping to [{}] error!", bindPort, port); + } + return true; + } + return false; + } + + /** * 解除端口映射 * diff --git a/hutool-extra/src/test/java/cn/hutool/extra/ssh/JschUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/ssh/JschUtilTest.java index 7d29f1cd7..30cdf0c90 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/ssh/JschUtilTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/ssh/JschUtilTest.java @@ -3,6 +3,7 @@ package cn.hutool.extra.ssh; import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.Console; import com.jcraft.jsch.Session; +import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; @@ -13,7 +14,7 @@ import org.junit.Test; * */ public class JschUtilTest { - + @Test @Ignore public void bindPortTest() { @@ -22,7 +23,22 @@ public class JschUtilTest { // 将堡垒机保护的内网8080端口映射到localhost,我们就可以通过访问http://localhost:8080/访问内网服务了 JschUtil.bindPort(session, "172.20.12.123", 8080, 8080); } - + + + @Test + @Ignore + public void bindRemotePort() throws InterruptedException { + // 建立会话 + Session session = JschUtil.getSession("looly.centos", 22, "test", "123456"); + // 绑定ssh服务端8089端口到本机的8000端口上 + boolean b = JschUtil.bindRemotePort(session, 8089, "localhost", 8000); + Assert.assertTrue(b); + // 保证一直运行 +// while (true){ +// Thread.sleep(3000); +// } + } + @Test @Ignore public void sftpTest() {