如何在Python中通过SSH公钥免密连接MongoDB
解决通过SSH免密连接MongoDB的pymongo问题
核心思路:建立SSH本地端口转发
你的远程MongoDB应该仅允许服务器本地(localhost)无密码访问,所以需要通过SSH隧道把远程MongoDB的端口映射到本地,让pymongo通过本地映射端口间接访问远程数据库,同时利用公钥免密完成SSH登录。
步骤1:安装依赖库
推荐使用sshtunnel库来快速实现SSH隧道,执行以下命令安装:
pip install sshtunnel
步骤2:编写Python连接代码
from sshtunnel import SSHTunnelForwarder from pymongo import MongoClient # SSH配置 ssh_host = '111.222.333.444' ssh_user = 'myuser' # 若私钥不在默认路径(Windows默认路径:C:\Users\<你的用户名>\.ssh\id_rsa),则指定路径 ssh_private_key = r'C:\Users\YourName\.ssh\id_rsa' # 建立隧道:远程27017端口(MongoDB默认端口)映射到本地27018 with SSHTunnelForwarder( (ssh_host, 22), ssh_username=ssh_user, ssh_pkey=ssh_private_key, remote_bind_address=('127.0.0.1', 27017), local_bind_address=('127.0.0.1', 27018) ) as tunnel: # 连接本地映射端口,等效于访问远程MongoDB client = MongoClient('mongodb://127.0.0.1:27018') # 测试连接 db = client.mydb print(db.list_collection_names())
如果私钥在默认路径,可省略ssh_pkey参数,sshtunnel会自动读取。
报错原因说明
你之前的pymongo代码直接连接远程IP的27017端口,但远程MongoDB的配置大概率限制了仅localhost可无密码访问,直接远程连接会触发认证要求,所以抛出密码缺失的错误。
解决SSH直接执行MongoDB命令的问题
你之前的命令失败是因为mongo默认进入交互式Shell,分号分隔的命令无法被正确解析,需用以下两种方式执行:
方法1:使用--eval参数执行指定命令
ssh myuser@111.222.333.444 "mongo mydb --eval 'show collections'"
多条命令可合并在一个字符串内:
ssh myuser@111.222.333.444 "mongo mydb --eval 'db.mycol.find().limit(1); show collections'"
方法2:通过管道传递命令
echo "use mydb; show collections" | ssh myuser@111.222.333.444 mongo
注意事项
若远程服务器安装的是MongoDB 4.4及以上版本,mongo命令已被废弃,需替换为mongosh:
ssh myuser@111.222.333.444 "mongosh mydb --eval 'show collections'"
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

