首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于SSH隧道的PostgreSQL/psycopg2 2密码认证

基于SSH隧道的PostgreSQL/psycopg2 2密码认证
EN

Stack Overflow用户
提问于 2020-02-16 20:05:31
回答 1查看 1.4K关注 0票数 1

我正试图通过ssh隧道连接到PostgreSQL数据库。它被设置为在端口3333上侦听,并在带有数据库的机器上转发到端口5432。我可以使用psql命令通过隧道进行密码身份验证,但由于某种原因,当我试图通过隧道使用psycopg2连接时,我会得到错误的FATAL: password authentication failed for user database_user。我试过把引号放在用户名和密码周围,但没有效果。

成功的psql命令:

代码语言:javascript
复制
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")

输出:

代码语言:javascript
复制
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的一部分,供参考:

代码语言:javascript
复制
# 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
EN

Stack Overflow用户

回答已采纳

发布于 2020-02-17 10:26:31

在调试连接问题时,始终值得记住在到达服务之前我们必须经历哪些层。当您连接PostgreSQL服务时,至少有三个层:

Forwarding

  • PostgreSQL

  • 网络:防火墙、NAT、端口 ACL
  • PostgreSQL登录

重要的是要了解导致问题的是哪一层,PostgreSQL客户端(在您的场景中包装在psycopg2中)错误将通过发出一条临时错误消息来帮助您解决这个问题:

  • 网络问题通常会引发一个典型的问题:Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?,这意味着您根本没有成功连接PostgreSQL服务,问题依赖于服务之前;
  • ACL问题通常会引发一个典型问题:No pg_hba.conf entry for host <hostname>, user <username>, database <database>,这意味着您确实连接了PostgreSQL服务,但是连接在ACL中并不有效;
  • Login问题通常会引发您所得到的错误:password authentication failed for user "<user>",这意味着您确实连接了PostgreSQL服务,并且连接符合ACL条目,但身份验证失败。H 217F 218

在后一种场景中,重要的是知道触发了哪些条目,因为它定义了身份验证模式。在您的示例中,它是一个md5条目(因为在peer模式中没有密码,并且您的SSH隧道应该映射本地主机,因此对于postgreSQL透视图来说,您被看作是host而不是local ):

代码语言:javascript
复制
host    all             all             127.0.0.1/32            md5

显然,你的密码不是你所期望的那样。为解决这一问题,确保:

concepts);

  • you

  • 您已经将密码设置为postgreSQL用户并检查了登录权限(而不是unix/SSH用户,在psycopg2连接中有不同的

  • 使用相同的密码,那么您必须能够连接;

)

阅读您的评论,它似乎您可能有'引号在您的密码以及。因此,连接中的密码可能是:

代码语言:javascript
复制
psycopg2.connect("dbname='database_name' user='database_user' host='localhost' password="'database_password'" port=3333")

或者,如果需要引号,它可能表明您使用了一些需要转义的特殊字符。您还可以尝试使用更简单的密码进行调试,然后对更强的密码进行回退。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60252712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档