在Python中通过SSH连接到Postgres DB的问题

时间:2020-05-21 10:07:16

标签: python postgresql ssh

在我的uni项目中,我获得了一个postgres数据库,在该数据库中,我必须通过SSH进入网络,然后才能从该网络访问该数据库。我已经使用SSH选项卡在DBeaver中设置了连接,并且运行正常。但是,使用Python,我可以很好地连接到SSH,但是不能连接到数据库本身。我已经检查了另一个不需要SSH且可以正常运行的数据库。这是我的代码。注意:我也已经尝试使用SSHTunnel,但无济于事。另外,请不要理会我的快速破解来匿名化SSH登录数据,因为昨天深夜我没找到如何在paramiko中使用正确的配置文件...

import os
from psycopg2 import connect, Error
from paramiko import SSHClient
from config import config

with open("ssh_config.txt", "r") as f:
    lines = f.readlines()
    hostname = lines[0].strip()
    username = lines[1].strip()
    password = lines[2].strip()

ssh = SSHClient()
ssh.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
ssh.connect(hostname=hostname, username=username, password=password)
print("SSH connected.")

try:
    params = config()
    conn = connect(**params)
    cursor = conn.cursor()
    print("DB connected.")
    # Print PostgreSQL connection properties.
    print(conn.get_dsn_parameters(), "\n")

    # Print PostgreSQL version.
    cursor.execute("SELECT version();")
    record = cursor.fetchone()
    print("You are connected to - ", record, "\n")

except (Exception, Error) as error:
    print("Error while connecting to PostgreSQL", error)

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我自己弄清楚了。这是更新的代码。基本上,我必须将远程地址转发到localhost,然后连接到localhost而不是数据库地址。

from psycopg2 import connect, Error
from sshtunnel import SSHTunnelForwarder
from config import config

with open("ssh_config.txt", "r") as f:
    lines = f.readlines()
    hostname = lines[0].strip()
    username = lines[1].strip()
    password = lines[2].strip()
    remote_bind_address = lines[3].strip()

try:
    with SSHTunnelForwarder(
        (hostname, 22),
        ssh_username=username,
        ssh_password=password,
        remote_bind_address=(remote_bind_address, 5432),
        local_bind_address=("localhost", 8080)) \
            as tunnel:

        tunnel.start()
        print("SSH connected.")

        params = config()
        conn = connect(**params)
        cursor = conn.cursor()
        print("DB connected.")
        # Print PostgreSQL connection properties.
        print(conn.get_dsn_parameters(), "\n")

        # Print PostgreSQL version.
        cursor.execute("SELECT version();")
        record = cursor.fetchone()
        print("You are connected to - ", record, "\n")
        cursor.close()
        conn.close()
        tunnel.close()
        print("DB disconnected.")
except (Exception, Error) as error:
    print("Error while connecting to DB", error)