python - 使用 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
解决方案
以下是上述问题的工作代码,在上述代码中,问题是本地绑定端口以及 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
推荐阅读
- swift - 如何将按钮添加到 Xcode 编辑器
- jquery - 如何使用 jQuery 制作动态进度条
- oracle - 哪个 Oracle 11g 有 DBCA?
- ionic3 - 打字稿错误找不到名称'cordova'
- ios - 将 TableView 作为子视图控制器嵌入到容器视图中时为空
- scala - 在具有多个模块的 scala 项目中,在哪里定义可在同一项目中的所有 build.sbt 中全局访问的值
- javascript - 从组件访问 Vuex Store 中的 Mutators 会产生未知的变异类型错误
- c# - 随着时间的推移,我将如何让更多实体产生,从而使其变得更加困难
- javascript - Node EJS - 提交后无法将数据保留在表单上
- typescript - 双向绑定2个子组件