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

时间:2018-12-31 06:01:16

标签: django python-3.x mongodb

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

// say that we are in "About Us" page

this.$nuxt.$route.name // returns 'about-us'
this.$nuxt.$route.path // returns '/about-us'

现在我正在关注

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

在Django项目中连接mongodb的好方法吗?

2 个答案:

答案 0 :(得分:0)

我认为与您的连接方式无关。该消息表示您的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:
    ...

答案 1 :(得分:0)

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

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

我写了一个助手来直接测试它(见下文)。 另一个要注意的是,路径中可能找不到SSH密钥。

解决关键问题。使用PuttyGen: PuttyGen->加载私钥->转换-​​>导出打开的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.")