You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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/域名
      避免因目标主机写错,导致隧道转发到了错误的服务。
  • 再次核对认证源与用户权限
    即使Compass能连接,也要确认代码中authSource参数和用户所属的数据库完全匹配:

    • 比如用户是在admin库创建的,authSource必须设为admin,不能用业务数据库
    • 可以在Compass中查看用户的db字段,确认认证源是否正确

内容的提问来源于stack exchange,提问作者RevealYourPuss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:40:59