Сценарий Python для подключения к удаленному mongoDB с использованием ssh-туннеля и клиента pymongo не работает с ошибками

Я пытаюсь подключиться к удаленному 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

person Bk.Neo    schedule 21.05.2019    source источник


Ответы (2)


Ниже приведен рабочий код для вышеуказанного вопроса. В приведенном выше коде проблема заключалась в том, что локальный порт привязки вместе с URL-адресом не был проанализирован в надлежащий формат, поэтому при аутентификации порт не мог быть аутентифицирован для подключения. Следовательно, в приведенном выше коде, упомянутом в вопросе, не работал.

Рабочий код для подключения к mongodb, когда ssh и mongo имеют разные учетные данные:

  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

person Bk.Neo    schedule 24.05.2019

Попробуйте 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()
person Mindey I.    schedule 28.10.2020