我在远程主机上有一个数据库。当我使用putty和SSH时,我能够访问它。数据库本身没有密码。只有SSH连接有密码。但是,当我尝试使用Python连接它时,它会要求输入密码。我是postgres和paramiko的新手。
以下是我尝试的内容:
import psycopg2
import paramiko
import time
t = paramiko.Transport(('xxx.com', 22))
t.connect(username="xxx", password='xxx')
c = paramiko.Channel(t)
conn = psycopg2.connect("dbname='xxx'")
curs = conn.cursor()
sql = "select * from xxx"
curs.execute(sql)
rows = curs.fetchall()
print(rows)
我试过的其他方法是:
import os, psycopg2
os.system("ssh xxx@xxx.com -fNL 5432:localhost:5432 -p 22")
while True:
try:
conn = psycopg2.connect("dbname='xxx'")
curs = conn.cursor()
sql = "select * from xxx"
curs.execute(sql)
rows = curs.fetchall()
print(rows)
except:
print "I am unable to connect to the database"
这使我无法请求本地转发'错误。
还有其他方法可以解决这个问题吗? 我有一台装有Python 2.7的Windows 7(x64)机器。请帮我。感谢。
答案 0 :(得分:1)
您应该连接到远程服务器并将远程PostgreSQL的端口转发到本地端口。
没有paramiko,就是这样的:
# start port forwarding
$ ssh -L PGSQL_LOCAL_PORT:localhost:PGSQL_REMOTE_PORT user@xxx.com
# in python
psycopg.connect("dbname='xxx' host='localhost' port='PGSQL_LOCAL_PORT'")
以下是使用paramiko执行此操作的示例 https://code.ros.org/trac/wg-ros-pkg/browser/pkg/trunk/paramiko/demos/forward.py?rev=30
注意:端口转发是阻止操作。因此,您必须在单独的线程/进程中启动端口转发。