2015-01-02 6 views
2

ssh 터널을 사용하여 원격 데이터베이스에 연결하는 데 문제가 있습니다 (이제는 paramiko로 시도하고 있습니다). 여기 내 코드 :파이썬을 사용하여 ssh 터널을 통해 원격 Postgresql 데이터베이스에 연결

#!/usr/bin/env python3 
import psycopg2 
import paramiko 
import time 

#ssh = paramiko.SSHClient() 
#ssh.load_system_host_keys() 
#ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
#ssh.connect('pluton.kt.agh.edu.pl', 22, username='aburban', password='pass') 

t = paramiko.Transport(('pluton.kt.agh.edu.pl', 22)) 
t.connect(username="aburban", password='pass') 
c = paramiko.Channel(t) 
conn = psycopg2.connect(database="dotest") 
curs = conn.cursor() 
sql = "select * from tabelka" 
curs.execute(sql) 
rows = curs.fetchall() 
print(rows) 

문제는 프로그램이 항상 로컬 데이터베이스에 연결을 시도한다는 것입니다. 나는 다른 ssh 터널과 함께 시도했고 같은 상황이 있었다. 원격 서버의 데이터베이스가 존재하며 터미널을 통한 "클래식"ssh 연결을 사용하여 정상적으로 작동합니다.

답변

0

paramiko와 python3과 호환되는 sshtunnel을 사용해보십시오.

바라건대 도움이 되길 바랍니다 ... 나는 잠시 동안 파이썬 코드 내에서 그것을 수행하고 ssh 외부 터널을 피하기 위해 머리를 긁었다. 복잡한 코드를 간단한 코드로 감싸는 개발자들에게 감사해야한다 !!

로컬 포트에서 원격 서버의 localhost에있는 포트 5432 로의 터널을 생성하고 로컬 호스트를 통해 원격 DB에 연결하는 데 사용합니다.

이 귀하의 요구에 대한 샘플 작업 코드가 될 것이다 :

#!/usr/bin/env python3 
import psycopg2 
from sshtunnel import SSHTunnelForwarder 
import time 

with SSHTunnelForwarder(
     ('pluton.kt.agh.edu.pl', 22), 
     ssh_password="password", 
     ssh_username="aburban", 
     remote_bind_address=('127.0.0.1', 5432)) as server: 

    conn = psycopg2.connect(database="dotest",port=server.local_bind_port) 
    curs = conn.cursor() 
    sql = "select * from tabelka" 
    curs.execute(sql) 
    rows = curs.fetchall() 
    print(rows)