如何通过EC2 SSH隧道从本地JAVA程序连接到RDS
我正试图通过SSH隧道从本地JAVA程序连接到RDS数据库,并连接到EC2实例以进行调试。我试图通过SSH隧道进入EC2实例,然后将端口转发到RDS数据库。这是我的密码如何通过EC2 SSH隧道从本地JAVA程序连接到RDS,java,mysql,ssh,amazon-rds,jsch,Java,Mysql,Ssh,Amazon Rds,Jsch,我正试图通过SSH隧道从本地JAVA程序连接到RDS数据库,并连接到EC2实例以进行调试。我试图通过SSH隧道进入EC2实例,然后将端口转发到RDS数据库。这是我的密码 final int localPort = 9999; // Create BaiscDataSource. final String databaseURL = "jdbc:mysql://localhost:" + localPort + "/database"; // SSH Tunnel. final JSch jsch
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我了解了您的工作内容,但没有使用jcraft jsch库。我能够在单独的线程上从java应用程序内部执行终端命令。以下是终端命令:
ssh -i /path/to/pem/ -L -N localport:remotehost:remoteport remoteuser@remotetunnelserver.com
然后在java jdbc适配器代码中,使用上面的localport连接127.0.0.1
:
jdbc.mysql://127.0.0.1:1345/databasename/user=user&password=pass
我认为命令中的问题是-N选项只创建了一个无法通过隧道执行远程命令的隧道,这在jcraft的jsch Librarray中默认是正确的,我无法在执行远程命令时将默认设置为false。我使用了Bastion主机并使用了本地端口转发
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是巴斯蒂安东道主的IP
最后,我使用AWS Secrets Manager连接到localhost:3306。但您还应该能够使用数据库用户名和密码。您还需要从Java设置隧道吗?在程序外部设置它,然后将db URL指向
localhost:9999
不会切断它?否则,这里有一个我曾经使用过的工作示例。你可能想在一个单独的线程中运行它,我不记得它是否阻塞了。实际上我两个都试过了。在这两种情况下,执行查询都会挂起。如果您在java程序之外设置一个隧道,然后只需telnet到该端口,您会看到mysql吐出数据吗?也就是说,你确定你的隧道工作正常吗?是的。这确实有效。所以我想这证实了隧道是好的。jdbc。mysql://127.0.0.1:1345/databasename/user=user&password=pass'不正确
。jdbc
部分后面必须跟一个: