我正试图通过ssh隧道连接到PostgreSQL数据库。它被设置为在端口3333上侦听,并在带有数据库的机器上转发到端口5432。我可以使用psql命令通过隧道进行密码身份验证,但由于某种原因,当我试图通过隧道使用psycopg2连接时,我会得到错误的FATAL: password authentication failed for user database_user。我试过把引号放在用户名和密码周围,但没有效果。
成功的psql命令:
psql -h localhost -p 3333 -U database_name database_user
#This command brings up password prompt失败的pscyopg2命令:
psycopg2.connect("dbname='database_name' user='database_user' host='localhost' password='database_password' port=3333")
输出:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/database_user/.local/share/virtualenvs/project-QNhT-Vzg/lib/python3.7/site-packages/psycopg2/__init__.py", line 126, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL: password authentication failed for user "database_user"
FATAL: password authentication failed for user "database_user"以下是我的pg_hba.conf的一部分,供参考:
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 md5
host replication all ::1/128 md5发布于 2020-02-17 10:26:31
在调试连接问题时,始终值得记住在到达服务之前我们必须经历哪些层。当您连接PostgreSQL服务时,至少有三个层:
Forwarding
重要的是要了解导致问题的是哪一层,PostgreSQL客户端(在您的场景中包装在psycopg2中)错误将通过发出一条临时错误消息来帮助您解决这个问题:
Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?,这意味着您根本没有成功连接PostgreSQL服务,问题依赖于服务之前;No pg_hba.conf entry for host <hostname>, user <username>, database <database>,这意味着您确实连接了PostgreSQL服务,但是连接在ACL中并不有效;password authentication failed for user "<user>",这意味着您确实连接了PostgreSQL服务,并且连接符合ACL条目,但身份验证失败。H 217F 218在后一种场景中,重要的是知道触发了哪些条目,因为它定义了身份验证模式。在您的示例中,它是一个md5条目(因为在peer模式中没有密码,并且您的SSH隧道应该映射本地主机,因此对于postgreSQL透视图来说,您被看作是host而不是local ):
host all all 127.0.0.1/32 md5显然,你的密码不是你所期望的那样。为解决这一问题,确保:
concepts);
psycopg2连接中有不同的
)
阅读您的评论,它似乎您可能有'引号在您的密码以及。因此,连接中的密码可能是:
psycopg2.connect("dbname='database_name' user='database_user' host='localhost' password="'database_password'" port=3333")或者,如果需要引号,它可能表明您使用了一些需要转义的特殊字符。您还可以尝试使用更简单的密码进行调试,然后对更强的密码进行回退。
https://stackoverflow.com/questions/60252712
复制相似问题