Psycopg2用户postgres的对等身份验证

20

我似乎已经在Ubuntu 16.04上正确安装了PostgreSQL 9.5.5和Psycopg2,并且可以通过以下方式登录:

sudo -u postgres psql

如果我执行\conninfo,我会得到以下结果:

You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".

我应该能够像这里展示的那样通过psycopg2连接,但脚本是:

#!/usr/bin/python
import psycopg2
conn = psycopg2.connect("dbname=postgres user=postgres") 
conn.close()

给了我:

psycopg2.OperationalError: FATAL:  Peer authentication failed for user "postgres"

我只需要用PostgreSQL进行个人用途,所以我不想启用TCP身份验证。

在Psycopg2中如何正确使用用户"postgres"的对等身份验证?


2
你是否在运行Python脚本时使用了sudo -u postgres命令? - Nick Barnes
谢谢,以 sudo -u postgres 运行可以解决所有问题。您能将此作为答案发布,以便我可以接受吗? - Yuri Lifanov
4个回答

27

您需要提供主机信息

conn = psycopg2.connect("dbname='template1' user='dbuser' host='localhost' password='dbpass'")

1
问题指定了“PEER”身份验证。 - user1071847
1
这不是针对用户“postgres”的正确答案,但在django的settings.py中明确添加“localhost”(而不是空字符串)作为主机对我很有帮助。 - mightypile
1
对我来说,只需添加 host='localhost' 就有了区别,现在它可以工作了。另一个答案说“使用 sudo -u postgres 运行你的 Python 脚本”不是我首选的解决方案,因为我希望这个认证过程发生在 Python 脚本内部,甚至能够在 Jupyter 笔记本或 iPython 中交互地运行它。 - Andreas L.

21

点对点身份验证是通过将连接字符串中的Postgres用户名与运行脚本的Linux用户的名称进行比较来完成的。

尝试使用sudo -u postgres运行您的Python脚本。


如果您的脚本还需要将一些文件(例如日志文件)写入由$USER拥有的目录,即登录用户,而不是postgres用户,则会发生什么情况?因为当使用sudo -u postgres运行脚本时,您将遇到以下错误:PermissionError: [Errno 13] Permission denied: /home/${USER}/.../my_log_file - swiss_knight
@s.k:如果您创建了一个名为 $USER 的数据库用户,则可以在不使用 sudo 的情况下使用对等身份验证。您还可以分离文件写入和数据库访问(例如编写一个将日志记录到 stdout 的子脚本,使用 sudo 调用该脚本并重定向输出)。如果您确实需要连接为 postgres,但无法将其余部分作为 postgres 运行,则需要启用不同的身份验证方法(尽管这方面的安全性问题有点复杂,无法在注释中涵盖)。 - Nick Barnes

3

这就是你的调用应该是什么样子。

!/usr/bin/python
import psycopg2
conn = psycopg2.connect(database="postgres", user="postgres", password="postgres", port=5432)

conn.close()

这给了我`FATAL:用户“postgres”的密码身份验证失败”,我认为密码意味着TCP身份验证。我如何设置本地主机? - Yuri Lifanov
1
现在我又遇到了 psycopg2.OperationalError: FATAL: Peer authentication failed for user "postgres" 的错误。 - Yuri Lifanov
你能否启用无密码登录并从连接中移除密码字段?sudo -u postgres psql postgres - Illusionist
请查看此处以更改PostgreSQL密码 - https://dev59.com/72cs5IYBdhLWcg3wmlEK - Illusionist
我已经阅读过了,在默认的postgres用户上设置密码会改变身份验证,我想避免这种情况。谢谢。 - Yuri Lifanov
问题指定了“PEER”身份验证。 - user1071847

2
以下是关于PostgreSQL的几种身份验证方法:
- peer:它会信任UNIX用户的身份(真实性),因此不需要密码。 - md5:它始终会要求密码,并在使用MD5进行哈希后进行验证。 - trust:它永远不会要求密码,并始终信任任何连接。
在您的情况下,您需要进行以下更改:
host all all 127.0.0.1/32 ident 更改为 host all all 127.0.0.1/32 md5 并将 host all all ::1/128 ident 更改为 host all all ::1/128 md5 请注意,这些更改涉及到修改HTML标签中的内容,因此请确保按照格式要求进行操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接