我无法使用 java 通过 ssh-tunnel 连接到数据库。

Posted

技术标签:

【中文标题】我无法使用 java 通过 ssh-tunnel 连接到数据库。【英文标题】:I can't to connect to DB with ssh-tunnel using java. 【发布时间】:2019-04-05 18:36:47 【问题描述】:

我有带有 ssh-tunnel 的 sql-BD。我想使用 Java 连接到这个 BD

我使用的代码:

    Connection con = null;
    JSch jsch = new JSch();

    int localPort = 1234;

    Session session = jsch.getSession(proxyUser, proxyHost, 22);
    java.util.Properties config = new java.util.Properties();
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);
    session.setPassword(proxyPassword);

    session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
    session.connect();
    session.setPortForwardingL(localPort, proxyHost, 3306);


    Properties properties = new Properties();
    properties.setProperty("user", user);
    properties.setProperty("password", password);
    properties.setProperty("useUnicode", "true");
    properties.setProperty("characterEncoding", "UTF-8");
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    con = DriverManager.getConnection(
            "jdbc:mysql://" + url + ":3306/" + nameBD + "?autoReconnect=true", properties);

错误行“无法创建与数据库服务器的连接。尝试重新连接 3 次。放弃”

执行此操作时出错: "con = DriverManager.getConnection(...)"

请帮帮我

【问题讨论】:

【参考方案1】:

这样的调试最好使用wireshark 来完成,它可以让您查看线路上实际发生的情况,并快速找出不太正确的地方(tm)。如果您不熟悉该工具,有很多 tutorials 可供选择。

我认为大多数情况下你只需要让事情匹配就可以了:

LocalPort 当前设置为 1234,但 DriverManager.getConnection 正在尝试连接到3306。 脚本sn-p不完整,所以我假设url设置为 其他地方的 localhost/127.0.0.1 ... jsch.getSessionsession.setPortForwardingL 都使用 proxyHost 作为目标:我假设您的主机上有防火墙(这就是您使用 ssh 的原因),因此尝试在本地连接到外部接口地址也可能会被阻止。这意味着session.setPortForwardingL 也应该是 localhost/127.0.0.1。

【讨论】:

我在 DriverManager.getConnection 中更改端口("jdbc:mysql://" + url + ":" + localPort + "/"+ nameBD + "?autoReconnect=true", properties),和在 session.setPortForwardingL 中使用 url 代替 proxyHost,但错误仍然存​​在 我有另一种解决方案吗? 您是否手动检查过一切正常:SSH 连接建立正常(检查代理主机上的日志);本地重定向端口已打开并正在侦听(netstat);并且到本地端口的连接到达远程 mysql 实例(telnet 可以正常工作)

以上是关于我无法使用 java 通过 ssh-tunnel 连接到数据库。的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 重命名文件后,一些文件在 linux 系统上或通过 Java 无法访问

SSH 连接隧道被拒绝

无法通过 Java 执行 Snowflake COPY 命令

无法使用 Impala JDBC 驱动程序通过 Java 应用程序连接到 Impala

突然无法通过VSCode启动配置运行Java [重复]

无法通过java代码向kafka主题发送消息