2016-01-23 142 views
0

我试图连接到远程连接到服务器,然后访问它与蟒蛇本地数据库。我成功地连接到服务器,但我似乎无法连接到服务器上的数据库。我的代码如下:通过SSH隧道连接到PostgreSQL数据库的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密钥(正常工作)将隧道连接到远程服务器,然后我需要连接到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

我不知道这可能是有益的,但我不得不通过SSH隧道来连接到PostgreSQL数据库以及。我succeded使用你的代码进行一些修改连接:

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()