PyMongo含@字符密码认证失败问题求助
解决SSH隧道连接MongoDB时含@密码的认证失败问题(错误码18)
优先避免手动转义密码,改用pymongo自动处理
不要用parse.quote处理密码,改用urllib.parse.quote_plus(专门适配URL编码的完整实现),或者直接通过参数传入MongoClient,让库内部处理转义逻辑:# 方式1:通过参数直接传入,无需转义 from pymongo import MongoClient client = MongoClient( host="localhost", port=27017, username="your_username", password="p@ssw0rd", authSource="admin" # 替换为你的用户所属认证库 ) # 方式2:用quote_plus生成标准URI from urllib.parse import quote_plus user = quote_plus("your_username") pwd = quote_plus("p@ssw0rd") uri = f"mongodb://{user}:{pwd}@localhost:27017/?authSource=admin" client = MongoClient(uri)原因:
parse.quote不会处理所有URI要求的转义字符,而quote_plus更贴合MongoDB URI的编码规范。检查SSH隧道的端口映射准确性
确认本地转发端口和连接字符串中的端口完全一致,比如SSH命令是ssh -L 27017:mongodb_host:27017 ssh_user@ssh_server,那么连接字符串的host必须是localhost,端口是27017。
可以用telnet localhost 27017或nc -zv localhost 27017测试端口是否能正常连通,排除隧道未建立或端口被占用的问题。确认SSH隧道的目标主机配置
注意SSH隧道中-L参数的目标主机是相对于SSH服务器的地址:- 如果MongoDB和SSH服务器在同一机器,目标主机写
localhost - 如果MongoDB在其他机器,要写SSH服务器能访问的MongoDB主机IP/域名
避免因目标主机写错,导致隧道转发到了错误的服务。
- 如果MongoDB和SSH服务器在同一机器,目标主机写
再次核对认证源与用户权限
即使Compass能连接,也要确认代码中authSource参数和用户所属的数据库完全匹配:- 比如用户是在
admin库创建的,authSource必须设为admin,不能用业务数据库 - 可以在Compass中查看用户的
db字段,确认认证源是否正确
- 比如用户是在
内容的提问来源于stack exchange,提问作者RevealYourPuss
相关产品推荐
相关产品推荐

