3

我正在尝试通过 SSH 隧道从本地 JAVA 程序连接到 RDS 数据库到 EC2 实例以进行调试。我正在尝试在 EC2 实例中建立 SSH 隧道,然后将端口转发到 RDS 数据库。这是我的代码。

final int localPort = 9999;
// Create BaiscDataSource.
final String databaseURL = "jdbc:mysql://localhost:" + localPort + "/database";
// SSH Tunnel.
final JSch jsch = new JSch();
jsch.addIdentity(sshKeyPath);
this.session = jsch.getSession(ec2Username, ec2Host, 22);
this.session.setTimeout(0);
this.session.setConfig("StrictHostKeyChecking", "no");
this.session.connect();
this.session.setPortForwardingL(localPort, rdsHost, 3306);

请帮忙!

编辑:looply_dev 2012 年 10 月 2 日下午 4:17

4

2 回答 2

1

我使用了堡垒主机并使用了本地端口转发。

ssh -i ec2key.pem -N -L 3306:my-dev-db.cluster-cdnxxxxxxxxxx.ap-southeast-1.rds.amazonaws.com:3306 ec2-user@54.253.196.193

54.253.196.193是 bastian 主机的 IP。

最后,我使用 AWS Secrets Manager 连接到 localhost:3306。但是您也应该能够使用数据库用户名和密码。

于 2020-02-06T04:31:03.820 回答
1

我得到了你所做的工作,但没有使用 jcraft jsch 库。我能够在单独的线程上从我的 java 应用程序内部执行终端命令。这是终端命令:

ssh -i /path/to/pem/ -L -N localport:remotehost:remoteport remoteuser@remotetunnelserver.com

然后在你的 java jdbc 适配器代码中连接127.0.0.1上面的本地端口:

jdbc.mysql://127.0.0.1:1345/databasename/user=user&password=pass

我认为的问题是命令中的 -N 选项只创建了一个无法通过隧道执行远程命令的隧道,这在 jcraft 的 jsch 库中默认为 true,我无法将默认设置为 false 来执行远程命令。

于 2016-06-01T18:56:08.573 回答