gpt4 book ai didi

java - 通过Java中的SSH隧道连接到Mongo数据库

转载 作者:行者123 更新时间:2023-12-03 10:03:22 25 4
gpt4 key购买 nike

(已修正代码,以反射(reflect)我所做的更改)

我正在尝试使用Java通过SSH隧道连接到Mongo数据库。

我正在使用Mongo驱动程序3.0.2和jcraft(JSch)创建SSH隧道。
我的想法是:

  • 通过SSH连接到托管MongoDB安装的计算机
  • 设置从本地端口到远程MongoDB端口的端口转发
  • 远程连接到MongoDB

  • 我的代码如下所示:
    // forwarding ports
    private static final String LOCAL_HOST = "localhost";
    private static final String REMOTE_HOST = "127.0.0.1";
    private static final Integer LOCAL_PORT = 8988;
    private static final Integer REMOTE_PORT = 27017; // Default mongodb port

    // ssh connection info
    private static final String SSH_USER = "<username>";
    private static final String SSH_PASSWORD = "<password>";
    private static final String SSH_HOST = "<remote host>";
    private static final Integer SSH_PORT = 22;

    private static Session SSH_SESSION;

    public static void main(String[] args) {
    try {
    java.util.Properties config = new java.util.Properties();
    config.put("StrictHostKeyChecking", "no");
    JSch jsch = new JSch();
    SSH_SESSION = null;
    SSH_SESSION = jsch.getSession(SSH_USER, SSH_HOST, SSH_PORT);
    SSH_SESSION.setPassword(SSH_PASSWORD);
    SSH_SESSION.setConfig(config);
    SSH_SESSION.connect();
    SSH_SESSION.setPortForwardingL(LOCAL_PORT, REMOTE_HOST, REMOTE_PORT);

    MongoClient mongoClient = new MongoClient(LOCAL_HOST, LOCAL_PORT);
    mongoClient.setReadPreference(ReadPreference.nearest());
    MongoCursor<String> dbNames = mongoClient.listDatabaseNames().iterator();
    while (dbNames.hasNext()) {
    System.out.println(dbNames.next());
    }
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    SSH_SESSION.delPortForwardingL(LOCAL_PORT);
    SSH_SESSION.disconnect();
    }
    }

    此代码在运行时不 编辑:有效。连接到SSH服务器可以正常工作,但是连接到它后面的Mongo数据库无效,并返回此错误:

    INFO: Exception in monitor thread while connecting to server localhost:8988
    com.mongodb.MongoSocketReadException: Prematurely reached end of stream
    at com.mongodb.connection.SocketStream.read(SocketStream.java:88)
    at com.mongodb.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:491)
    at com.mongodb.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:221)
    at com.mongodb.connection.CommandHelper.receiveReply(CommandHelper.java:134)
    at com.mongodb.connection.CommandHelper.receiveCommandResult(CommandHelper.java:121)
    at com.mongodb.connection.CommandHelper.executeCommand(CommandHelper.java:32)
    at com.mongodb.connection.InternalStreamConnectionInitializer.initializeConnectionDescription(InternalStreamConnectionInitializer.java:83)
    at com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:43)
    at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115)
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:127)
    at java.lang.Thread.run(Unknown Source)

    我尝试通过命令行执行以下操作:

    $ ssh <user>@<host> -p 22 -X -C
    $ <enter requested password>
    <user>@<host>$ mongo
    <user>@<host>$ MongoDB shell version: 2.6.10
    <user>@<host>$ connecting to: test

    所以这似乎可行。对于Java代码(应该做大致相同的事情)为什么不起作用,我感到茫然。

    最佳答案

    该代码已成功运行,但是主要问题是您的mongo数据库已停止。请检查mongo实例是否正在运行。

    sudo systemctl status mongod
    如果它没有运行
    sudo systemctl start mongod

    关于java - 通过Java中的SSH隧道连接到Mongo数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31161209/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com