当前位置: 首页 > 知识库问答 >
问题:

通过ssh(java)连接到mysql DB

西门智
2023-03-14

我需要通过ssh连接连接到Mysql RDS DB,我尝试过的是打开一个ssh隧道,然后连接到那个DB,但是没有工作。

下面是我的代码:

 int lport = 3306;
    String host = "10.254.64.135";
     String rhost = "localhost";
     int rport = 8000;
    String user = "ubuntu";
    String dbuserName = "someusername";
     String dbpassword = "somepassword";
    String dburl = "jdbc:mysql://somedbhost.us-east-1.rds.amazonaws.com:3306";
     String driverName = "com.mysql.jdbc.Driver";
     String driverName2 = "org.gjt.mm.mysql.Driver";

    Session session = null;

   try {

       final java.util.Properties config = new java.util.Properties();
       config.put("StrictHostKeyChecking", "no");
       final JSch jsch = new JSch();
       session = jsch.getSession(user, host, 22);
       jsch.addIdentity("C:\\Users\\rop\\workspace\\awskey.pem");
       session.setConfig(config);
       session.connect();
       System.out.println("Connected through SSH");
       final int assinged_port = session.setPortForwardingL(rport, host,lport );
       System.out.println("localhost:" + assinged_port + " -> " + rhost + ":" + rport);
       System.out.println("Port Forwarded");

       //mysql database connectivity
       Class.forName("com.mysql.jdbc.Driver").newInstance();
       //String url = "jdbc:mysql://localhost:" + rport + "/" + db;
       con = DriverManager.getConnection(dburl, dbuserName, dbpassword);
       System.out.println("Mysql Database connection established");
       System.out.println("DONE");

上述代码崩溃,但有以下例外情况,并在“con=drivermanager.getconnection(dburl,dbuserName,dbpassword);”行中崩溃:

请注意,ssh主机ip与db主机ip不同

多谢了。

共有1个答案

冯通
2023-03-14

您需要将JDBC url中的主机名和端口替换为localhost和您转发的本地端口,您将其称为rport:

dburl=“jdbc:mysql://localhost:”+rport;

另外,我不确定MySQL JDBC驱动程序是否支持在不指定数据库名称的情况下连接到数据库服务器:

dburl=“jdbc:mysql:/localhost:”+rport+“/YourDatabaseName”;

另外,如果MySQL服务器与SSH服务器不在同一台机器上运行,请确保您可以从SSH服务器连接到数据库服务器。默认情况下,MySQL不允许远程连接。

 类似资料:
  • 要从Java连接到MongoDB,我使用: 它运行良好。现在我想连接到机器上的MongoDB,我必须通过SSH登录。我尝试使用JSch,这是我的代码: 一切看起来都很好,我可以连接,但有一个问题: 错误是: 我应该设置更多的东西来连接吗?当我检查输出是时,我如何从程序连接的Java检查。当我使用PuTTY时,一切正常。

  • 我在某个主机上运行PostgreSQL服务器。此服务器不对外开放(只允许来自的连接)。我可以通过ssh(使用公钥)以身份登录该主机: 然后我可以对特定用户运行查询。 我需要在这里输入用户的sudo密码。我无法以用户身份连接,也不知道他的密码。我也不能作为用户访问数据库。 现在为了简化开发,我想设置从本地机器到pgserver的ssh隧道: 问题是,虽然可以访问服务器,但他没有访问数据库的权限

  • 问题内容: 我想创建以下基础结构流: 使用Docker如何实现? 问题答案: 首先,您需要在要ssh- in的映像中安装SSH服务器。您可以对安装了ssh服务器的所有容器使用基础映像。然后,您只需要运行每个容器,即可将ssh端口(默认为22)映射到主机端口(镜像中的远程服务器)到一个端口。即: 然后,如果可以从外部访问主机的端口52022和53022,则可以使用主机的ip(远程服务器)通过ssh在

  • 我有两台机器:machine foo()运行redis服务器,而machine bar()运行通过Jedis连接到foo的java应用程序。当给jedis提供地址时,一切都很好。 但是我不信任foo和bar之间的路由器,redis也不支持SSL。因此,我设置了一个从bar到foo:的ssh隧道 现在,从bar中,我可以直接在或通过隧道在成功地telnet到foo上的redis。对于jedis,如果

  • 代理的代码在这里 生成脚本在这里 我在远程计算机上启动应用程序时使用 主机上打开了两个端口6004和6005,如果jconsole是应用程序本地的,我可以通过jconsole连接到应用程序。 然后创建2个ssh隧道 ssh隧道ssh-l 6004:localhost:6004 foo@server ssh隧道ssh-l 6005:localhost:6005 foo@server 现在的问题是我无

  • 有谁能帮我找到这个命令吗?命令是 如果我错了,请纠正我,但正如我所看到的,这将压缩当前目录中的文件,同时它将其复制到目标位置,对吗?这是否意味着当前文件将是完整的(不会被压缩)?