Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;本地端口。。。“不能绑定”;在Java中使用JSch转发端口时_Java_Mongodb_Ssh_Jsch_Portforwarding - Fatal编程技术网

&引用;本地端口。。。“不能绑定”;在Java中使用JSch转发端口时

&引用;本地端口。。。“不能绑定”;在Java中使用JSch转发端口时,java,mongodb,ssh,jsch,portforwarding,Java,Mongodb,Ssh,Jsch,Portforwarding,我需要通过SSH隧道连接到MongoDB,JSch端口转发抛出错误: 无法绑定本地端口127.0.0.1:27017 我必须通过SSH隧道连接到MongoDB。我在stackoverflow上找到了代码,它解决了我的问题。但几周后,同样的代码停止了工作。我无法确定原因。另外,使用Java代码中使用的相同凭据,我还尝试使用SSH-L命令通过CMD连接到相同的凭据,并且工作正常。我还可以使用NoSQLBrowser提供的相同凭据连接到MongoDB。我在谷歌上搜索了所有东西,但问题仍然没有解决。以下

我需要通过SSH隧道连接到MongoDB,JSch端口转发抛出错误:

无法绑定本地端口127.0.0.1:27017

我必须通过SSH隧道连接到MongoDB。我在stackoverflow上找到了代码,它解决了我的问题。但几周后,同样的代码停止了工作。我无法确定原因。另外,使用Java代码中使用的相同凭据,我还尝试使用
SSH-L
命令通过CMD连接到相同的凭据,并且工作正常。我还可以使用NoSQLBrowser提供的相同凭据连接到MongoDB。我在谷歌上搜索了所有东西,但问题仍然没有解决。以下是其代码:

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(27017, "localhost", 22);

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());```
java.util.Properties config=new java.util.Properties();
配置放置(“检查”、“否”);
JSch JSch=新的JSch();
SSH_SESSION=null;
SSH\u SESSION=jsch.getSession(SSH\u用户、SSH\u主机、SSH\u端口);
SSH_SESSION.setPassword(SSH_密码);
SSH_SESSION.setConfig(config);
SSH_SESSION.connect();
SSH_SESSION.setPortForwardingL(27017,“localhost”,22);
MongoClient MongoClient=新的MongoClient(本地\u主机、本地\u端口);
setReadPreference(ReadPreference.nearest());
MongoCursor dbNames=mongoClient.listDatabaseNames().iterator();
while(dbNames.hasNext()){
System.out.println(dbNames.next())```
我在端口转发线路上收到以下错误:-

com.jcraft.jsch.JSchException:PortForwardingL:localport 127.0.0.1:27017无法绑定。
在com.jcraft.jsch.PortWatcher上(PortWatcher.java:158)
位于com.jcraft.jsch.PortWatcher.addPort(PortWatcher.java:110)
位于com.jcraft.jsch.Session.setPortForwardingL(Session.java:1847)
位于com.jcraft.jsch.Session.setPortForwardingL(Session.java:1828)
位于com.jcraft.jsch.Session.setPortForwardingL(Session.java:1809)
位于com.jcraft.jsch.Session.setPortForwardingL(Session.java:1792)
位于com.schenker.boot.bootdemo.controller.TestMongoAgain.main(TestMongoAgain.java:35)
原因:java.net.BindException:地址已在使用中:JVM\u Bind
位于java.net.DualStackPlainSocketImpl.bind0(本机方法)
位于java.net.DualStackPlainSocketImpl.socketBind(未知源)
位于java.net.AbstractPlainSocketImpl.bind(未知源)
位于java.net.PlainSocketImpl.bind(未知源)
位于java.net.ServerSocket.bind(未知源)
位于java.net.ServerSocket。(未知源)
在com.jcraft.jsch.PortWatcher上(PortWatcher.java:150)
…还有6个
com.jcraft.jsch.JSchException:PortForwardingL:local port 127.0.0.1:27017未注册。
位于com.jcraft.jsch.PortWatcher.delPort(PortWatcher.java:118)
位于com.jcraft.jsch.Session.delPortForwardingL(Session.java:1876)
位于com.jcraft.jsch.Session.delPortForwardingL(Session.java:1865)

另外,一件非常奇怪的事情是,如果我使用
PortForwardingR
而不是
PortForwardingL
,它不会抛出任何错误,但在下一行它会连接到我的本地MongoDB。有人能帮我吗?

端口27017可能被本地机器上运行的某个应用程序/服务使用-可能是您当地的Mongo DB

不管怎样,只需选择任何其他端口号。它可以是任何端口号

但是,如果您在没有应用程序的情况下仅将端口用于内部使用,则不应依赖固定的端口号。您永远不知道其他应用程序何时会阻止该端口。让JSch自动选择一个空闲端口:

int forwardedPort = SSH_SESSION.setPortForwardingL(0, "localhost", 22);
MongoClient mongoClient = new MongoClient(LOCAL_HOST, forwardedPort);
虽然一般来说,您的代码似乎是错误的。您将端口转发到22,而您可能应该将其转发到远程Mongo DB端口

请参阅完整的工作示例(对于MySQL,对于MongoDB是相同的,只是有一个不同的端口):


强制性警告:不要使用
StrictHostKeyChecking=no
盲目接受所有主机密钥。这是一个安全漏洞。您将失去对主机密钥的保护

有关正确(安全)的方法,请参阅:

端口27017可能被本地机器上运行的某些应用程序/服务使用–可能是本地Mongo DB

不管怎样,只需选择任何其他端口号。它可以是任何端口号

但是,如果您在没有应用程序的情况下仅将端口用于内部使用,则不应依赖固定的端口号。您永远不知道其他应用程序何时会阻止该端口。让JSch自动选择一个空闲端口:

int forwardedPort = SSH_SESSION.setPortForwardingL(0, "localhost", 22);
MongoClient mongoClient = new MongoClient(LOCAL_HOST, forwardedPort);
虽然一般来说,您的代码似乎是错误的。您将端口转发到22,而您可能应该将其转发到远程Mongo DB端口

请参阅完整的工作示例(对于MySQL,对于MongoDB是相同的,只是有一个不同的端口):


强制性警告:不要使用
StrictHostKeyChecking=no
盲目接受所有主机密钥。这是一个安全漏洞。您将失去对主机密钥的保护

有关正确(安全)的方法,请参阅:

嘿,马丁,非常感谢。这很有效。我在你共享的链接上查看了你的答案,我理解了你的观点。谢谢。我想现在我更好地理解了SSH的工作原理。嘿,马丁,非常感谢。这很有效。我在你共享的链接上查看了你的答案,我理解了你的观点。谢谢。我想现在我更好地理解了SSH是如何工作的。