【问题标题】:sshtunnel.BaseSSHTunnelForwarder Could not establish session to SSH gatewaysshtunnel.BaseSSHTunnelForwarder 无法建立到 SSH 网关的会话
【发布时间】:2019-05-27 18:55:13
【问题描述】:

我正在使用 django 和 mysql 数据库来开发 api。现在我有了一个新的要求,将 mongodb 数据库与 django 连接起来。我使用了以下解决方案

from sshtunnel import SSHTunnelForwarder
import pymongo
import pprint

MONGO_HOST = "REMOTE_IP_ADDRESS"
MONGO_DB = "DATABASE_NAME"
MONGO_USER = "LOGIN"
MONGO_PASS = "PASSWORD"

server = SSHTunnelForwarder(
MONGO_HOST,
ssh_username=MONGO_USER,
ssh_password=MONGO_PASS,
remote_bind_address=('127.0.0.1', 27017)
)

server.start()

client = pymongo.MongoClient('127.0.0.1', server.local_bind_port) # 
server.local_bind_port is assigned local port
db = client[MONGO_DB]

现在我开始关注了

sshtunnel.BaseSSHTunnelForwarderError: 无法建立到 SSH 网关的会话

django poject中连接mongodb的方法好吗?

【问题讨论】:

    标签: django python-3.x mongodb


    【解决方案1】:

    我认为与您连接它的方式无关。该消息意味着您的 SSH 配置中的某些内容不正确。

    SSHTunnelForwarder 应该使用 SSH 主机、端口、用户和密码进行实例化,因为您首先需要访问可以连接到 Mongo 主机的主机(运行 sshd 的位置)。我也看不到您将密钥传递到何处进行身份验证。确保根据您拥有的密钥类型定义<your-key-instance-here>(例如,对于使用paramiko 的RSA 类型密钥:paramiko.RSAKey.from_private_key_file('/path/to/your/ssh/key/file'))。之后,在客户端你需要指定 Mongo 用户和密码:

    @contextmanager
    def _tunnel():
        with SSHTunnelForwarder((ssh_host, 22),
                                 ssh_username=SSH_USER,
                                 ssh_pkey=<your-key-instance-here>,
                                 remote_bind_address=(MONGO_HOST, MONGO_PORT)
                                ) as tunneled_conn:
            yield pymongo.MongoClient('mongodb://%s:%s@127.0.0.1' % (MONGO_USR, MONGO_PWD),
                                      port=tunneled_conn.local_bind_port
                                      )
    

    然后在你的代码中使用它

    
    with _tunnel() as mongo_client:
        ...
    

    【讨论】:

      【解决方案2】:

      我收到了这个问题,因为我的 SSH 密钥不是开放的 ssh 格式。单步执行 SSHTunnelForwarder 代码,失败部分与使用 paramiko 库加载 SSH 密钥有关,该库加载以下类型的 SSH 密钥:

      • paramiko.RSAKey
      • paramiko.DSSKey
      • paramiko.ECDSAKey
      • paramiko.Ed25519Key

      我写了一个助手来直接测试这个(见下文)。 另一个问题是路径中可能找不到 SSH 密钥。

      解决关键问题。使用 PuttyGen: PuttyGen -> 加载私钥 -> 转换 -> 导出 Open SSH。

      if not (path.exists(SSH_file_full_path)):   
          raise Exception("SSH file not found!")
      
      import paramiko
      try:
          k = paramiko.RSAKey.from_private_key_file(SSH_file_full_path,key_file_password)                                                                                                                                                                                                                                                                 
      except paramiko.ssh_exception.PasswordRequiredException as e:
          print(sys.exc_info()[0])
          raise Exception("Problem with SSH key. Probably the password is wrong.")
      except paramiko.ssh_exception.SSHException:
          print(sys.exc_info()[0])
          raise Exception("Problem with SSH key. Most probably not open SSH format.")
      except Exception as e:
          print(sys.exc_info()[0])
          raise Exception("Unknown SSH key load problem.")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-13
        • 1970-01-01
        • 2015-12-11
        • 2014-11-12
        • 2017-04-27
        • 1970-01-01
        • 1970-01-01
        • 2012-11-23
        相关资源
        最近更新 更多