通过SSH隧道连接到PostgreSQL数据库的Python
问题描述:
我试图连接到远程连接到服务器,然后访问它与蟒蛇本地数据库。我成功地连接到服务器,但我似乎无法连接到服务器上的数据库。我的代码如下:通过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')
答
我不知道这可能是有益的,但我不得不通过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()
后,代码工作很好。此外,在“连接数据库”后,引号丢失。 我希望这可能对您有所帮助,感谢分享你的代码!
答
两个例子是非常有益的。我有一个在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()
我试图上面的代码,但我看到以下错误'HandlerSSHTunnelForwarderError:在#1