无法通过SSH

时间:2018-04-17 05:38:16

标签: mysql sql ssh

我知道已经有很多关于这个问题的问题了,相信我,我已经浏览了所有这些问题。

有些背景,我正在使用IntelliJ,我已经能够使用IntelliJ的数据源工具连接到数据库,并且我已经能够使用终端SSH到服务器本身。出于某种原因,即使我尝试用Java做同样的事情,它也行不通。这是我的代码:

String serverIP = "123.45.67.890"
String username = "root";
String password = "password";

// Establish SSH tunnel with server if not running locally
try {
    if (!Inet4Address.getLocalHost().getHostAddress().equals(ServerIP) {
        System.out.println("Remote connection detected.");
        System.out.println("Establishing SSH Tunnel...");
        JSch jSch = new JSch();
        Session session = jSch.getSession(username, ServerIP, 22);
        session.setConfig("StrictHostKeyChecking", "no");
        session.setPassword(password);
        System.out.printf("Connecting to remote server at %s...\n", ServerIP);
        session.connect();
        System.out.println("Connected!");
        session.setPortForwardingL(3306, ServerIP, 3306);
    }
} catch (Exception e) {
    e.printStackTrace();
}

// Load mySQL Driver
System.out.println("Loading driver...");
try {
    Class.forName("com.mysql.jdbc.Driver");
    System.out.println("Driver loaded!");
} catch (ClassNotFoundException e) {
    throw new IllegalStateException("Cannot find the driver in the classpath!", e);
}

String url = String.format("jdbc:mysql://%s:3306/db_name", ServerIP);

// Connect to database
System.out.println("Connecting to database...");

try (Connection connection = DriverManager.getConnection(url, username, password)) {
    System.out.println("Database connected!");
    this.connection = connection;
} catch (SQLException e) {
    this.connection = null;
    throw new IllegalStateException("Cannot connect to database!", e);
}

这是我得到的错误:

Remote connection detected.
Establishing SSH Tunnel...
Connecting to remote server at 123.45.67.890...
Connected!
Loading driver...
Driver loaded!
Connecting to database...

java.lang.IllegalStateException: Cannot connect to database!

    ...
    a bunch of crap
    ...
Caused by: java.sql.SQLException: null,  message from server: "Host 'my.personal.computer.local.hostname' is not allowed to connect to this MySQL server"
    ...
    a bunch more crap
    ...

在我看来,由于某种原因,Java代码没有使用SSH隧道,我花了很多精力来复制StackOverflow代码,而是粗暴地试图正常连接。我做错了什么?

更多信息:服务器本身配置为在0.0.0.0上侦听SQL,我还将防火墙设置为接受端口3306上的连接。

为了清晰起见编辑:我理解我可以通过在服务器上授予本地计算机权限来修复此问题,但我希望能够通过SSH进行连接。

2 个答案:

答案 0 :(得分:0)

OP解决方案。

SSH无法正常工作的原因是因为我需要使用本地开放端口,通过它连接到SQL,然后将其转发到远程端口3306.此外,我需要通过localhost向前移植,而不是服务器地址。 (即,将session.setPortForwardingL(3306, ServerIP, 3306);行更改为session.setPortForwardingL(some-open-port, "localhost", 3306);,将"jdbc:mysql://%s:3306/db_name"更改为"jdbc:mysql://%s:same-open-port/db_name"

答案 1 :(得分:-1)

我的理解是你想要访问在远程机器上运行的mysql服务器并通过SSH隧道监听端口3306。

要使用命令行ssh client从本地计算机上的端口1234到远程计算机上的端口3306创建此类隧道,您可以从本地计算机中键入以下命令:

ssh -L 1234:localhost:3306 mysql.server.remote

要从Java执行相同的操作,您可以使用JSL,这是SSH2的Java实现。从其网站:

  

JSch允许您连接到sshd服务器并使用端口转发,   X11转发,文件传输等,你可以整合它   功能到您自己的Java程序中。 JSch根据BSD获得许可   风格许可证。

举个例子,看看PortForwardingL.java。连接会话后,使用jdbc:mysql:// localhost:1234 / [database]等连接URL创建与MySQL的JDBC连接。