Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过EC2 SSH隧道从本地JAVA程序连接到RDS_Java_Mysql_Ssh_Amazon Rds_Jsch - Fatal编程技术网

如何通过EC2 SSH隧道从本地JAVA程序连接到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

我正试图通过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 = 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
部分后面必须跟一个