Skip to content

Instantly share code, notes, and snippets.

@JinhaiZ
Created November 19, 2017 16:39
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save JinhaiZ/3ad536870b9853dbff11ab4241380c0d to your computer and use it in GitHub Desktop.
Save JinhaiZ/3ad536870b9853dbff11ab4241380c0d to your computer and use it in GitHub Desktop.
connect to MongoDB via ssh tunnel
from sshtunnel import SSHTunnelForwarder
import pymongo
MONGO_HOST = "IP_ADDRESS"
MONGO_USER = "USERNAME"
MONGO_PASS = "PASSWORD"
MONGO_DB = "DATABASE_NAME"
MONGO_COLLECTION = "COLLECTION_NAME"
# define ssh tunnel
server = SSHTunnelForwarder(
MONGO_HOST,
ssh_username=MONGO_USER,
ssh_password=MONGO_PASS,
remote_bind_address=('127.0.0.1', 27017)
)
# start ssh tunnel
server.start()
connection = pymongo.MongoClient('127.0.0.1', 27017)
db = connection[MONGO_DB]
collection = db[MONGO_COLLECTION]
# close ssh tunnel
server.stop()
@lmingzhi
Copy link

connection = pymongo.MongoClient('127.0.0.1', 27017) does not work!

try:

pymongo.MongoClient('127.0.0.1', server.local_bind_port) # server.local_bind_port is assigned local port

@jwz-ecust
Copy link

Before the close of ssh tunnel, it would be blocked because mongo db is not closed.
add:
connection.close()
before
server.stop()

@mindey
Copy link

mindey commented Oct 28, 2020

That works, but a bit lengthy, a shortcut: pip install ssh-pymongo, and:

from ssh_pymongo import MongoSesion

session = MongoSesion(
    "IP_ADDRESS",
    user="USERNAME",
    password="PASSWORD"
    to_host="127.0.0.1",
    to_port=27017
)

db = session.connection("DATABASE_NAME")
collection = db["COLLECTION_NAME"]

session.stop()

More info: https://github.com/mindey/ssh-pymongo

@Thevakajan
Copy link

Thevakajan commented Feb 11, 2022

12:25:26.594 [main] WARN org.mongodb.driver.uri - Unsupported option 'directconnection' in the connection string 'mongodb://admin:mgoadmin418@172.16.0.4:27017/spades-user-service?authSource=admin&readPreference=primary&appname=MongoDB%20Compass&directConnection=true&ssl=false'.
12:25:26.598 [main] WARN org.mongodb.driver.uri - Unsupported option 'appname' in the connection string 'mongodb://admin:mgoadmin418@172.16.0.4:27017/spades-user-service?authSource=admin&readPreference=primary&appname=MongoDB%20Compass&directConnection=true&ssl=false'.
12:25:26.926 [main] INFO org.mongodb.driver.cluster - Cluster created with settings {hosts=[172.16.0.4:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
12:25:27.019 [main] DEBUG org.mongodb.driver.cluster - Updating cluster description to {type=UNKNOWN, servers=[{address=172.16.0.4:27017, type=UNKNOWN, state=CONNECTING}]
12:25:27.052 [main] INFO org.mongodb.driver.cluster - No server chosen by ReadPreferenceServerSelector{readPreference=primary} from cluster description ClusterDescription{type=UNKNOWN, connectionMode=SINGLE, serverDescriptions=[ServerDescription{address=172.16.0.4:27017, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing out
12:25:47.034 [cluster-ClusterId{value='6206085e556d8424d0cb8e49', description='null'}-172.16.0.4:27017] DEBUG org.mongodb.driver.connection - Closing connection connectionId{localValue:1}
12:25:47.059 [cluster-ClusterId{value='6206085e556d8424d0cb8e49', description='null'}-172.16.0.4:27017] INFO org.mongodb.driver.cluster - Exception in monitor thread while connecting to server 172.16.0.4:27017
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.connection.SocketStream.open(SocketStream.java:63) ~[mongodb-driver-core-3.3.0.jar:na]
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115) ~[mongodb-driver-core-3.3.0.jar:na]
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:116) ~[mongodb-driver-core-3.3.0.jar:na]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_311]
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_311]
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81) ~[na:1.8.0_311]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476) ~[na:1.8.0_311]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218) ~[na:1.8.0_311]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200) ~[na:1.8.0_311]
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162) ~[na:1.8.0_311]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394) ~[na:1.8.0_311]
at java.net.Socket.connect(Socket.java:606) ~[na:1.8.0_311]
at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:50) ~[mongodb-driver-core-3.3.0.jar:na]
at com.mongodb.connection.SocketStream.open(SocketStream.java:58) ~[mongodb-driver-core-3.3.0.jar:na]
... 3 common frames omitted
12:25:47.067 [cluster-ClusterId{value='6206085e556d8424d0cb8e49', description='null'}-172.16.0.4:27017] DEBUG org.mongodb.driver.cluster - Updating cluster description to {type=UNKNOWN, servers=[{address=172.16.0.4:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.SocketTimeoutException: connect timed out}}]
com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=172.16.0.4:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.SocketTimeoutException: connect timed out}}]
at com.mongodb.connection.BaseCluster.createTimeoutException(BaseCluster.java:375)
at com.mongodb.connection.BaseCluster.selectServer(BaseCluster.java:104)
at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.(ClusterBinding.java:75)
at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.(ClusterBinding.java:71)
at com.mongodb.binding.ClusterBinding.getReadConnectionSource(ClusterBinding.java:63)
at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:212)
at com.mongodb.operation.FindOperation.execute(FindOperation.java:483)
at com.mongodb.operation.FindOperation.execute(FindOperation.java:80)
at com.mongodb.Mongo.execute(Mongo.java:818)
at com.mongodb.Mongo$2.execute(Mongo.java:805)
at com.mongodb.OperationIterable.iterator(OperationIterable.java:47)
at com.mongodb.FindIterableImpl.iterator(FindIterableImpl.java:143)
at DBConnecter.MongoDBSSh.main(MongoDBSSh.java:67)
Exception in thread "main" com.jcraft.jsch.JSchException: PortForwardingL: local port 127.0.0.1:0 is not registered.
at com.jcraft.jsch.PortWatcher.delPort(PortWatcher.java:118)
at com.jcraft.jsch.Session.delPortForwardingL(Session.java:1876)
at com.jcraft.jsch.Session.delPortForwardingL(Session.java:1865)
at DBConnecter.MongoDBSSh.main(MongoDBSSh.java:95)
12:26:07.575 [cluster-ClusterId{value='6206085e556d8424d0cb8e49', description='null'}-172.16.0.4:27017] DEBUG org.mongodb.driver.connection - Closing connection connectionId{localValue:2}
12:26:37.598 [cluster-ClusterId{value='6206085e556d8424d0cb8e49', description='null'}-172.16.0.4:27017] DEBUG org.mongodb.driver.connection - Closing connection connectionId{localValue:3}
12:27:07.619 [cluster-ClusterId{value='6206085e556d8424d0cb8e49', description='null'}-172.16.0.4:27017] DEBUG org.mongodb.driver.connection - Closing connection connectionId{localValue:4}
12:27:37.632 [cluster-ClusterId{value='6206085e556d8424d0cb8e49', description='null'}-172.16.0.4:27017] DEBUG org.mongodb.driver.connection - Closing connection connectionId{localValue:5}

@Thevakajan
Copy link

how can resolve mongo DB connection issues

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment