如何使用pymongo连接远程mongodb

20

当我使用MongoChef连接远程Mongo数据库时,我使用以下参数:


服务器

  • 服务器: localhost
  • 端口: 27017

SSH隧道

  • SSH地址: 10.1.0.90

  • 端口: 25

  • SSH用户名: username

  • SSH密码: password


当我使用Pymongo连接时,我有以下代码:

import pymongo

MONGO_HOST = "10.1.0.90"
MONGO_PORT = 25
MONGO_DB = "db_name"
MONGO_USER = "username"
MONGO_PASS = "password"

con = pymongo.MongoClient(MONGO_HOST, MONGO_PORT)
db = con[MONGO_DB]
db.authenticate(MONGO_USER, MONGO_PASS)

print(db)

但我遇到了下一个错误:

pymongo.errors.ServerSelectionTimeoutError: 10.1.2.84:27017: [Errno 111] Connection refused
请问,你能帮我解决这个问题吗?我哪里做错了吗?

连接SSH > LOOPBACK = "localhost(127.0.0.1)" 如果限制了所有外部IP访问,则无法连接mongodb。 - dsgdfg
所以通过SSH连接并调用python IDLE,应用您的连接命令并获取输出(连接到本地主机)。 - dsgdfg
谢谢你的帮助! - Volodymyr Nazarenko
理想情况下,您可以通过使 MongoDB 在服务器外部可用来避免使用 ssh。这里有一种方法可以实现:http://incredulosanonimos.blogspot.co.uk/2018/04/making-mongodb-remotely-available.html - Rafael Valero
3个回答

43

适用于我的解决方案。

from sshtunnel import SSHTunnelForwarder
import pymongo
import pprint

MONGO_HOST = "REMOTE_IP_ADDRESS"
MONGO_DB = "DATABASE_NAME"
MONGO_USER = "LOGIN"
MONGO_PASS = "PASSWORD"

server = SSHTunnelForwarder(
    MONGO_HOST,
    ssh_username=MONGO_USER,
    ssh_password=MONGO_PASS,
    remote_bind_address=('127.0.0.1', 27017)
)

server.start()

client = pymongo.MongoClient('127.0.0.1', server.local_bind_port) # server.local_bind_port is assigned local port
db = client[MONGO_DB]
pprint.pprint(db.collection_names())

server.stop()

嗨@Володимир Назаренко,使用上述代码时,我能够连接到远程mongodb,而本地主机没有mongodb。如果本地主机(从中执行代码)有mongodb,则脚本将连接到本地mongodb而不是远程mongodb。有什么想法吗? - DD1
嗨@DebashishDas, 你能展示一下你的代码吗? - Volodymyr Nazarenko
嗨@Володимир Назаренко,我没有使用MongoClient('127.0.0.1',server.local_bind_port)。相反,我正在使用MongoClient('127.0.0.1:27018')。我的错。 - DD1

0

或者,您可以只需执行pip install ssh-pymongo

from ssh_pymongo import MongoSession

session = MongoSession('10.1.0.90',
    port=25,
    user='USERNAME',
    password='PASSWORD',
    uri='mongodb://127.0.0.1:27017'
)

db = session.connection['DATABASE_NAME']

print(db)

session.stop()

包中的更多示例:

示例1 -- 如果您的用户名相同,并且已配置了ssh密钥。

from ssh_pymongo import MongoSession

session = MongoSession('db.example.com')

db = session.connection['db-name']

例子 2 -- 如果您有自定义的本地身份验证。

from ssh_pymongo import MongoSession

session = MongoSession('db.example.com',
    uri='mongodb://user:password@127.0.0.1/?authSource=admin&authMechanism=SCRAM-SHA-256')

db = session.connection['db-name']

示例3 -- 如果您想使用不同的端口和密钥。

from ssh_pymongo import MongoSession

session = MongoSession(
    host='db.example.com',
    port=21,
    user='myuser',
    key='/home/myplace/.ssh/id_rsa2'
)

db = session.connection['db-name']

这个库只是使用了与上面相同的方法。 - JayTurnr

-2

这让我在 Python 中连接 pymongo 和 mLab 数据库变得轻松:

from pymongo import MongoClient

MONGO_HOST = "ds123456.mlab.com"
MONGO_PORT = 23456
MONGO_DB = "db name"
MONGO_USER = "Username"
MONGO_PASS = "password"
connection = MongoClient(MONGO_HOST, MONGO_PORT)
db = connection[MONGO_DB]
db.authenticate(MONGO_USER, MONGO_PASS)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接