使用 ssh-tunnel 和 pymongo 客户端连接到远程 mongoDB 的 Python 脚本失败并出现错误

问题描述 投票:0回答:3

我正在尝试连接到远程mongodb,这里ssh访问有不同的用户名和密码,并且mongodb有不同的用户名和密码。

我尝试在 ssh 隧道服务器中传递 ssh 的用户名和密码,以及在客户端中传递 mongodb 凭据,但收到错误消息:

pymongo.errors.ServerSelectionTimeoutError: 127.0.0.1:27017: [Errno 111] Connection refused

这里发生了 ssh 连接,而 mongodb 没有连接

 def Collect_Pid_DB():

     MONGO_DB = "mydatabasename"

     server = SSHTunnelForwarder(
     (MONGO_HOST,22),
     ssh_username=username,
     ssh_password=password,
     remote_bind_address=('127.0.0.1', 27017)
 )
 server.start()
 #print (server)
 uri = "mongodb://admin:" + urllib.quote("p@ssW0$3") + "@127.0.0.1:27017"
 client = pymongo.MongoClient(uri,server.local_bind_port)
 db = client[MONGO_DB]
 print (db)
 print(json.dumps(db.collection_names(), indent=2))
 server.stop()

实际结果:

Database(MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True), u'MissingPatches')
 Traceback (most recent call last):
   File "duplicate.py", line 7, in <module>
class MyClass:
  File "duplicate.py", line 41, in MyClass
Collect_Pid_DB('192.142.123.142','root','password','mydatabasename')
   File "duplicate.py", line 35, in Collect_Pid_DB
print(json.dumps(db.collection_names(), indent=2))
   File "/usr/local/lib/python2.7/dist-packages/pymongo/database.py", line 787, in collection_names
nameOnly=True, **kws)]
   File "/usr/local/lib/python2.7/dist-packages/pymongo/database.py", line 722, in list_collections
read_pref) as (sock_info, slave_okay):
   File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
   File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 1135, in _socket_for_reads
server = topology.select_server(read_preference)
   File "/usr/local/lib/python2.7/dist-packages/pymongo/topology.py", line 226, in select_server
address))
   File "/usr/local/lib/python2.7/dist-packages/pymongo/topology.py", line 184, in select_servers
selector, server_timeout, address)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/topology.py", line 200, in _select_servers_loop
self._error_message(selector))
  pymongo.errors.ServerSelectionTimeoutError: 127.0.0.1:27017: [Errno 111] Connection refused
python database automation pymongo ssh-tunnel
3个回答
5
投票

以下是上述问题的工作代码,在上面的代码中,问题是本地绑定端口和 url 未解析为正确的格式,因此在验证端口时无法验证连接。 因此,在问题中提到的上述代码不起作用。

当 ssh 和 mongo 都有不同的凭据时,连接到 mongodb 的工作代码:

  def Collect_Pid_DB(hostname,user,password,accountid):
  server = SSHTunnelForwarder(
    (MONGO_HOST,22),
    ssh_username=MONGO_USER,
    ssh_password=MONGO_PASS,
    remote_bind_address=('127.0.0.1', 27017)
  )
  host_name="'primary_host_name': 'win-3auvcutkp34'"
  patch_name="'patch_name': '[\\& A-Za-z0-9+.,\\-]+'"

  server.start()
  client = pymongo.MongoClient(host='127.0.0.1',
      port=server.local_bind_port,
      username='admin',
      password='P@ssW0Rd')
  db = client[MONGO_DB]
  print (db)
  print(json.dumps(db.collection_names(), indent=2))

希望上述答案对某人有帮助,因为当我需要时我找不到任何地方:P


2
投票

尝试

pip install ssh-pymongo
,然后:

from ssh_pymongo import MongoSession
session = MongoSession(MONGO_HOST)
db = session.connection['mydatabasename']

# perform your queries #

session.stop()

如果您有更复杂的设置,请检查docs以了解案例,例如:

from ssh_pymongo import MongoSession

session = MongoSession(
    MONGO_HOST,
    port=22,
    user='ssh_username',
    password='ssh_password',
    uri='mongodb://admin:p@[email protected]:27017')

db = session.connection['mydatabasename']

print(db.collection_names())

session.stop()

0
投票

“Mindey I”的答案。对我不起作用。 它说:ModuleNotFoundError:没有名为“ssh_pymongo”的模块 我确保使用 pip 安装该模块,但不知何故它没有这样做。有什么想法吗?

© www.soinside.com 2019 - 2024. All rights reserved.