【问题标题】:access mySql via multiple ssh in java在java中通过多个ssh访问mySql
【发布时间】:2016-11-29 11:49:49
【问题描述】:

我是 ssh 新手,我有一个问题。 我必须通过 ssh 连接到网关,并且在 ssh 会话中我必须通过 ssh 连接到另一台服务器。 只有这样我才能连接到 mySQL 服务器。

  1. ssh <gateway>
  2. ssh -L3306:db02:3306 username@db02

然后我可以配置 Putty 和 HeidySQL 来访问 mySQL 数据库。 到目前为止,一切顺利。

但现在我想通过 java 代码访问 mySQL 数据库。 我google了一下,找到了一些使用Jsch的代码。

所以,下面是代码的结果。 但是当我运行代码时,会话没问题,端口转发也没问题。

但这部分给了我一个错误:

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:"+nLocalPort, strDbUser, strDbPassword);

这是错误:java.sql.SQLException: Access denied for user 'dbUser'@'gateway.appl.local'(使用密码:YES)

似乎端口转发未完成,因为它显示连接到网关的错误:'dbUser'@'gateway.appl.local'

成功完成端口转发后,它应该显示如下内容:dbUser'@'**db02**.appl.local

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class MySqlConnOverSSH {
    private static void doSshTunnel( String strSshUser, String strSshPassword, String strSshHost, int nSshPort, String strRemoteHost, int nLocalPort, int nRemotePort ) throws JSchException
    {
        final JSch jsch = new JSch();
        Session session = jsch.getSession( strSshUser, strSshHost, 22 );
        session.setPassword( strSshPassword );

        final Properties config = new Properties();
        config.put( "StrictHostKeyChecking", "no" );
        session.setConfig( config );
        session.connect();
        session.setPortForwardingL(nLocalPort, strRemoteHost, nRemotePort);
    }

    /**
     * Java Program to connect to remote database through SSH using port forwarding
     * @throws SQLException
     */
    public static void main(String[] args) throws SQLException {
        try
        {
            String strSshUser = "sshUserName";                           // SSH loging username
            String strSshPassword = "sshPassWord";               // SSH login password
            String strSshHost = "10.20.0.234";          // hostname or ip or SSH server
            int nSshPort = 22;                                    // remote SSH host port number
            String strRemoteHost = "db02";  // hostname or ip of your database server
            int nLocalPort = 3307;                                // local port number use to bind SSH tunnel
            int nRemotePort = 3306;                               // remote port number of your database
            String strDbUser = "dbUser";                    // database loging username
            String strDbPassword = "dbUserPW";                    // database login password

            MySqlConnOverSSH.doSshTunnel(strSshUser, strSshPassword, strSshHost, nSshPort, strRemoteHost, nLocalPort, nRemotePort);

            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:"+nLocalPort, strDbUser, strDbPassword);
            con.close();
        }
        catch( Exception e )
        {
            e.printStackTrace();
        }
        finally
        {
            System.exit(0);
        }
    }
}

【问题讨论】:

  • 你不想这样做,它会非常慢
  • 如果两个人想要做你在第二步中描述的端口转发会发生什么?
  • 伙计们,我对 shh 完全陌生。所以,请提供一个替代方案,我可以如何实现这一点。我很感谢以正确的方式提供的每一个小帮助。

标签: java mysql ssh jsch


【解决方案1】:

这会很慢,但如果您必须这样做,请在两个连接之间设置隧道:

on your local host: ssh -L3306:localhost:3306 user@host1
on host1:           ssh -L3306:localhost:3306 user@db02

然后您应该能够连接到本地系统上的 3306,并通过隧道连接到 db02 上的 3306。如果host1 也在运行 mysql 并且您不想干扰它,请使用不同的中间端口,如

on your local host: ssh -L3306:localhost:3316 user@host1
on host1:           ssh -L3316:localhost:3306 user@db02

【讨论】:

  • 嗨 Jim,我应该如何在 java 代码中运行这些 ssh 命令?或者我应该使用 Putty 执行此操作,然后通过 localhost 访问 db02 上的 mySql 服务器?顺便说一句:mySql 没有在 host1 上运行
  • 在 putty 中运行这些以设置隧道,然后您的 Java 代码将访问位于 localhost:3306 的数据库。
  • 好吧..我会试试这个。谢谢,我会告诉你的。
  • 我运行这两个命令,在我的 Java 代码中我得到这个错误: java.sql.SQLException: Access denied for user 'eric'@'localhost' (using password: YES) 这是 java代码:Class.forName("com.mysql.jdbc.Driver");连接 con = DriverManager.getConnection("jdbc:mysql://localhost:"+nLocalPort, strDbUser, strDbPassword); con.close();
  • 该消息来自远程 MySQL 服务器。您在数据库中是否拥有正确的权限?对于 MySQL,登录看起来像是源自服务器本身,因此您需要在 localhost 上拥有用户 eric 的权限。
猜你喜欢
  • 1970-01-01
  • 2016-09-08
  • 2014-05-06
  • 2014-01-28
  • 2022-11-03
  • 1970-01-01
  • 2012-01-21
  • 2016-08-13
  • 1970-01-01
相关资源
最近更新 更多