通过dockerauthentication错误pymongo
我试图连接到Docker容器内的一个数据库,然后在我的家用计算机的远程服务器内部。 docker集装箱端口27017
绑定到服务器机器的端口27017
。
现在,我有一个Python3脚本,其目标是从我的家用计算机连接到这个数据库:
from pymongo import MongoClient client=MongoClient('mongodb://myserverusername:myserverpass@server.dir.com:27017') database=client["my_collection"] cursor=database["my_collection"].find({}) print(next(cursor))
如果我执行我的脚本停在line 4
,它工作正常,但是当我释放line 5
,我得到以下错误:
Traceback (most recent call last): File "testDatabase.py", line 9, in <module> print(next(cursor)) File "[...]/lib/python3.5/site-packages/pymongo/cursor.py", line 1132, in next if len(self.__data) or self._refresh(): File "[...]/lib/python3.5/site-packages/pymongo/cursor.py", line 1055, in _refresh self.__collation)) File "[...]/lib/python3.5/site-packages/pymongo/cursor.py", line 892, in __send_message **kwargs) File "[...]/lib/python3.5/site-packages/pymongo/mongo_client.py", line 950, in _send_message_with_response exhaust) File "[...]/lib/python3.5/site-packages/pymongo/mongo_client.py", line 961, in _reset_on_error return func(*args, **kwargs) File "[...]/lib/python3.5/site-packages/pymongo/server.py", line 99, in send_message_with_response with self.get_socket(all_credentials, exhaust) as sock_info: File "/usr/lib/python3.5/contextlib.py", line 59, in __enter__ return next(self.gen) File "[...]/lib/python3.5/site-packages/pymongo/server.py", line 168, in get_socket with self.pool.get_socket(all_credentials, checkout) as sock_info: File "/usr/lib/python3.5/contextlib.py", line 59, in __enter__ return next(self.gen) File "[...]/lib/python3.5/site-packages/pymongo/pool.py", line 852, in get_socket sock_info.check_auth(all_credentials) File "[...]/lib/python3.5/site-packages/pymongo/pool.py", line 570, in check_auth auth.authenticate(credentials, self) File "[...]/lib/python3.5/site-packages/pymongo/auth.py", line 486, in authenticate auth_func(credentials, sock_info) File "[...]/lib/python3.5/site-packages/pymongo/auth.py", line 466, in _authenticate_default return _authenticate_scram_sha1(credentials, sock_info) File "[...]/lib/python3.5/site-packages/pymongo/auth.py", line 209, in _authenticate_scram_sha1 res = sock_info.command(source, cmd) File "[...]/lib/python3.5/site-packages/pymongo/pool.py", line 477, in command collation=collation) File "[...]/lib/python3.5/site-packages/pymongo/network.py", line 116, in command parse_write_concern_error=parse_write_concern_error) File "[...]/lib/python3.5/site-packages/pymongo/helpers.py", line 210, in _check_command_response raise OperationFailure(msg % errmsg, code, response) pymongo.errors.OperationFailure: Authentication failed.
我做错了什么?
Thans提前!
我回答我自己的问题,如果有人有同样的问题!
首先,你需要通过ssh
连接到服务器,所以你必须从sshtunnel
,当然还有pymongo
导入pymongo
。
from sshtunnel import SSHTunnelForwarder import pymongo
接下来,修复你的参数,一方面,服务器连接,另一方面,为了mongodb
连接
SERVER_HOST = "your.server.host.com" SERVER_USER = "yourserverusername" SERVER_PASS = "yourseverpassword" MONGO_DB = "your_database_name" MONGO_PORT = 27017
现在您必须通过ssh
login到服务器。
ssh_connection = SSHTunnelForwarder( SERVER_HOST, ssh_username=SERVER_USER, ssh_password=SERVER_PASS, remote_bind_address=("localhost", MONGO_PORT) #localhost:27017 is mongodb url into server ) ssh_connection.start() #Start connection, you now are connected to server via ssh.
一旦通过ssh
连接,您必须创build连接到mongodb
到泊坞窗。 值得说的是,尽pipe服务器中的27017
端口绑定到了27017
容器中的27017
端口,但是仍然要将您的一台主机端口绑定到27017
服务器端口。 对象ssh_connection
为您提供了一个本地端口,该端口绑定了您在remote_bind_address
参数中作为MONGO_PORT
实现的端口。 这可以让你一路解锁到mongodb
地址到docker中。
print(ssh_connection.local_bind_port) #When you start, mongodb is assigned to a local port for this connection, so this is the port you must use client = pymongo.MongoClient('127.0.0.1:{}'.format(ssh_connection.local_bind_port))
现在,你可以做任何你想要的数据库。 在这种情况下,我执行原始post的例子类似的行为。
db = client[MONGO_DB] cursor=db[MONGO_DB].find({}) for r in cursor: print(r) print(cursor.count())
一旦你完成了所有的任务到数据库中,你必须closuresssh
会话。
ssh_connection.stop() #End ssh connection
这就是所有人!