首页 > 解决方案 > 使用 ssh-tunnel 和 pymongo 客户端连接到远程 mongoDB 的 Python 脚本失败并出现错误

问题描述

我正在尝试连接到远程 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

标签: pythondatabaseautomationpymongossh-tunnel

解决方案


以下是上述问题的工作代码,在上述代码中,问题是本地绑定端口以及 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


推荐阅读