2016-01-23 2 views
0

Я пытаюсь подключиться к удаленному подключению к серверу, а затем получить доступ к его локальной базе данных с помощью python. Я успешно подключаюсь к серверу, хотя я не могу подключиться к базе данных на сервере. Мой код ниже:Подключение к базе данных Postgresql через туннелирование SSH в Python

import psycopg2 
from sshtunnel import SSHTunnelForwarder 

try: 

    with SSHTunnelForwarder(
     ('<server ip address>', 22), 
     ssh_private_key="</path/to/private/ssh/key>", 
     ssh_username="<server username>", 
     remote_bind_address=('localhost', 5432)) as server: 

     print "server connected" 

     conn = psycopg2.connect(database="<dbname>",port=server.local_bind_port) 
     curs = conn.cursor() 
     print "database connected 

except: 
    print "Connection Failed" 

Это фрагменты кода, который я нашел в Интернете. Я также попытался заявление соединения ниже вместо Соединит те выше:

params = { 
    'database': '<dbname>', 
    'user': '<dbusername>', 
    'password': '<dbuserpass>', 
    'host': 'localhost', 
    'port': 5432 
} 
conn = psycopg2.connect(**params) 

Я знаю, что может подключиться к базе данных, потому что на моей машине; Я могу использовать sqlectron для туннелирования и подключения соответствующим образом.

На всякий случай непонятно, что я пытаюсь сделать сверху, мне нужно, чтобы ssh туннель на моем удаленном сервере, используя приватный ключ ssh на моем компьютере (правильно работает), а затем мне нужно подключиться к База данных PostgreSQL, которая находится на localhost в порту 5432.

В настоящее время я получаю текущее сообщение об ошибке для обоих способов пытается соединиться:

2016-01-23 11:16:10,978 | ERROR | Tunnel: 0.0.0.0:49386 <> localhost:5432 error: (9, 'Bad file descriptor') 

ответ

1

Я не знаю, если это может быть полезным, но я должен был подключиться к базе данных Postgresql через SSH туннелирования также. Я преуспел подключиться, используя код с некоторыми изменениями:

import psycopg2 
from sshtunnel import SSHTunnelForwarder 

try: 

    with SSHTunnelForwarder(
     ('<server ip address>', 22), 
     #ssh_private_key="</path/to/private/ssh/key>", 
     ### in my case, I used a password instead of a private key 
     ssh_username="<server username>", 
     ssh_password="<mypasswd>", 
     remote_bind_address=('localhost', 5432)) as server: 

     server.start() 
     print "server connected" 

     params = { 
      'database': '<dbname>', 
      'user': '<dbusername>', 
      'password': '<dbuserpass>', 
      'host': 'localhost', 
      'port': local_bind_port 
      } 

     conn = psycopg2.connect(**params) 
     curs = conn.cursor() 
     print "database connected" 

except: 
    print "Connection Failed" 

После добавления server.start(), код работал хорошо. Кроме того, после «подключения к базе данных» отсутствовали перевернутые запятые. Я надеюсь, что это может быть полезно для вас, спасибо за обмен кодом!

+0

Я попробовал код выше, но я вижу следующее сообщение об ошибке 'HandlerSSHTunnelForwarderError: В # 1 <- ('127.0.0.1', 53281) в ('10 .160.1.24' , 5432) не удалось: ChannelException (2, «Не удалось подключиться»). Любая идея, что я могу делать неправильно? –

0

Оба эти примера были очень полезными. У меня возникла проблема с привязкой локального порта вручную в соединении db. Наверное, у нас есть динамический порт на нашем сервере? Я объединил элементы двух примеров. Использование sever.local_bind_port может быть более надежным и динамичным.

from sshtunnel import SSHTunnelForwarder #Run pip install sshtunnel 
from sqlalchemy.orm import sessionmaker #Run pip install sqlalchemy 

with SSHTunnelForwarder(
    ('<remote server ip>', 22), #Remote server IP and SSH port 
    ssh_username = "<username>", 
    ssh_password = "<password>", 
    remote_bind_address=('<local server ip>', 5432)) as server: #PostgreSQL server IP and sever port on remote machine 

    server.start() #start ssh sever 
    print 'Server connected via SSH' 

    #connect to PostgreSQL 
    local_port = str(server.local_bind_port) 
    engine = create_engine('postgresql://<username>:<password>@127.0.0.1:' + local_port +'/database_name') 

    Session = sessionmaker(bind=engine) 
    session = Session() 

    print 'Database session created' 

    #test data retrieval 
    test = session.execute("SELECT * FROM database_table") 
    for row in test: 
     print row['id'] 

    session.close() 

 Смежные вопросы

  • Нет связанных вопросов^_^