Fan*_*ing 6 java ssh portforwarding jsch ssh-tunnel
我不确定这是否是由于端口转发使用私钥而不是密码引起的,但这是我正在尝试做的
我需要将本地端口 3308 一直转发到我的 SQL 数据库 3306。
我可以在本地的终端中一起运行这样的事情
ssh -L 3308:localhost:3307 username@jumpbox "ssh -L 3307:mysqlDB:3306 username@server"
Run Code Online (Sandbox Code Playgroud)
或者在我的本地运行第一部分,然后在 jumpbox 上运行第二部分。两者都工作正常,我可以连接到我的 localhost:3308。
当我开始使用 JSch 时,问题就来了。这是我的代码
JSch jsch = new JSch();
jsch.addIdentity("~/.ssh/id_rsa");
Session session = jsch.getSession("username", "jumpbox");
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
int assinged_port = session.setPortForwardingL(3308, "localhost", 3307);
Session mysqlSession = jsch.getSession("username", "server", assinged_port);
mysqlSession.setConfig("StrictHostKeyChecking", "no");
mysqlSession.connect(); // Connection timed out here
mysqlSession.setPortForwardingL(3307, "mysqlDB", 3306);
Run Code Online (Sandbox Code Playgroud)
第一个连接已完成,但第二个连接超时。
线程“main”com.jcraft.jsch.JSchException 中的异常:java.net.ConnectException:操作超时(连接超时)
我在 JSch 或端口转发方面做错了吗?
您的ssh命令正在使用ssh在“跳转框”上运行的 SSH 客户端(另一个)。
当您想使用 Java 实现相同的功能时,您有两个选择:
在 Java 中执行相同操作,即用于在“跳转框”上session运行ssh -L 3307:mysqlDB:3306 username@server。
请参阅使用 JSch 执行命令。
不过,我认为您不应该依赖ssh程序进行第二次跳转,原因与您使用 Java/JSch 进行第一次跳转(而不是ssh程序)的原因相同。
避免使用单独的ssh工具,而是通过另一个转发端口在本地打开另一个 SSH 会话。您实际上可以使用最新版本的ssh, 和-J(jump) 开关(自 OpenSSH 7.3 起支持)来执行相同的操作:
ssh -L 3308:mysqlDB:3306 -J username@jumpbox username@server
Run Code Online (Sandbox Code Playgroud)
我更喜欢这种方法。
要实现后一种方法:
您必须将一些本地端口转发到server:22,以便您可以打开到 的 SSH 连接server:
JSch jsch = new JSch();
jsch.addIdentity("~/.ssh/id_rsa");
Session jumpboxSession = jsch.getSession("username", "jumpbox");
jumpboxSession.connect();
int serverSshPort = jumpboxSession.setPortForwardingL(0, "server", 22);
Session serverSession = jsch.getSession("username", "localhost", serverSshPort);
serverSession.connect();
Run Code Online (Sandbox Code Playgroud)
然后将另一个本地端口转发server到 MySQL 端口:
int mysqlPort = serverSession.setPortForwardingL(0, "mysqlDB", 3306);
Run Code Online (Sandbox Code Playgroud)
现在您应该可以连接到localhost:mysqlPort使用 MySQL 客户端。
强制性警告:不要StrictHostKeyChecking=no盲目接受所有主机密钥。这是一个安全漏洞。你失去了对MITM 攻击的保护。
有关正确(且安全)的方法,请参阅:
如何在使用 JSch SFTP 库时解析 Java UnknownHostKey?
| 归档时间: |
|
| 查看次数: |
1522 次 |
| 最近记录: |