【问题标题】:java SSH connection to mysql with error local port cannot be boundjava SSH连接到mysql,错误本地端口无法绑定
【发布时间】:2019-02-02 09:04:13
【问题描述】:

当我尝试从我的电脑通过 SSH 连接连接远程服务器中的 mysql 时,我收到以下错误消息。 我安装了所有必需的 ssh、Java jar 并且信任能够访问 SSH 但无法访问 mysql 数据库不知道我到底哪里出错了下面的代码显示端口和 Ssh 会话的变量:

错误信息如下:

   com.jcraft.jsch.JSchException: PortForwardingL: local port 127.0.0.1:3306 cannot be bound.
    at com.jcraft.jsch.PortWatcher.<init>(PortWatcher.java:158)
    at com.jcraft.jsch.PortWatcher.addPort(PortWatcher.java:110)
    at com.jcraft.jsch.Session.setPortForwardingL(Session.java:1847)
    at com.jcraft.jsch.Session.setPortForwardingL(Session.java:1828)
    at com.jcraft.jsch.Session.setPortForwardingL(Session.java:1809)
    at com.jcraft.jsch.Session.setPortForwardingL(Session.java:1792)
    at connectsshserver.CTestDriver.doSshTunnel(CTestDriver.java:29)
    at connectsshserver.CTestDriver.main(CTestDriver.java:47)
Caused by: java.net.BindException: Address already in use: JVM_Bind
    at java.net.DualStackPlainSocketImpl.bind0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
    at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
    at java.net.ServerSocket.bind(ServerSocket.java:375)
    at java.net.ServerSocket.<init>(ServerSocket.java:237)
    at com.jcraft.jsch.PortWatcher.<init>(PortWatcher.java:150)

我的代码是这样的: 包连接shserver;

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

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

public class CTestDriver {
    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, 21098);
        session.setPassword(strSshPassword);

        final Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect(30000);
     // String boundaddress ="0.0.0.0";
//t assinged_port=session.setPortForwardingL(boundaddress,lport, rhost, rport);
        session.setPortForwardingL(
                nLocalPort, strRemoteHost, nRemotePort);
    }

    public static void main(String[] args) {
        try {

            String strSshUser = "softeuab"; // SSH loging username
             String strSshPassword = "SP1234a1234b"; // SSH login password
            String strSshHost = "host47.registrar-servers.com";//me or ip or                                            // SSH server
            int nSshPort = 21098; // remote SSH host port number
            String strRemoteHost = "host47.registrar-servers.com"; // hostname or
                                                             // ip of
                         // your     // database server
            int nLocalPort =3306;//cal port number use to bind SSH tunnel
            int nRemotePort = 3306; // remote port number of your database
            String strDbUser = "softeuab_mohamed"; // database loging username
            String strDbPassword = "1234a1234b"; // database login password
            CTestDriver.doSshTunnel(strSshUser, strSshPassword, strSshHost, nSshPort, strRemoteHost, nLocalPort,
                     nRemotePort);
            Class.forName("com.mysql.jdbc.Driver");
             Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:" + nLocalPort, strDbUser,
               strDbPassword);

            con.close();
   //   Connection      con=Connect.ConnectDB();
    //  con.close();


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.exit(0);
        }
    }
}

这一行显示错误

session.setPortForwardingL(
                nLocalPort, strRemoteHost, nRemotePort);

【问题讨论】:

  • 您的 mysql 存在于另一台服务器上,对吧?我认为您不知道JSch 的工作原理,它使您能够连接到另一台服务器。您正在运行的代码在您的本地机器上。 DriverManager.getConnection("jdbc:mysql://127.0.0.1:" - 这行看起来你在建立远程连接后尝试连接到本地机器,这没有意义。跨度>
  • 谢谢@NicholasK 看起来你是对的,我如何显示连接远程服务器数据库的连接
  • 首先尝试建立从本地计算机到远程数据库的连接,然后您可以使用相同的详细信息通过代码进行连接。
  • @NicholasK 是的,我使用腻子通过 SSH 会话连接数据库,但我想知道我必须在上面输入什么连接字符串才能连接到远程服务器
  • 与您通过 putty 连接时使用的主机名相同

标签: java mysql ssh jsch


【解决方案1】:

我刚刚尝试了你的代码(除了注释掉在端口转发之后运行的 mysql 代码。)一切都对我有用 - 调用 session.setPortForwardingL 没有错误。

【讨论】:

  • 感谢@RBH 可以协助正确断开会话
猜你喜欢
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 2013-01-19
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2023-02-17
  • 2014-01-21
相关资源
最近更新 更多