用户 postgres 的 Psycopg2 对等身份验证
Posted
技术标签:
【中文标题】用户 postgres 的 Psycopg2 对等身份验证【英文标题】:Psycopg2 peer authentication for user postgres 【发布时间】:2017-03-25 01:05:19 【问题描述】:我似乎已经正确安装了 PostgreSQL 9.5.5。和 Psycopg2 在 Ubuntu 16.04 上,并且可以通过以下方式登录:
sudo -u postgres psql
如果我随后发出\conninfo
,我会得到以下信息:
You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".
当然,我应该能够通过 psycopg2 以与 here 相同的方式连接,但是脚本:
#!/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”正确使用对等身份验证?
【问题讨论】:
您是否使用sudo -u postgres
来运行您的Python 脚本?
谢谢,以sudo -u postgres
运行可以解决所有问题。您可以将此作为答案发布,以便我接受吗?
【参考方案1】:
您需要提供主机
conn = psycopg2.connect("dbname='template1' user='dbuser' host='localhost' password='dbpass'")
【讨论】:
问题指定PEER
身份验证。
这不是用户“postgres”的正确答案,但在 django 的 settings.py 中明确添加“localhost”(而不是空字符串)作为主机对我来说有所不同。
对我来说,添加host='localhost'
也有所不同,现在它正在工作。另一个答案是“使用sudo -u postgres
运行您的python 脚本”不是我的首选解决方案,因为我希望在python 脚本中进行此身份验证,甚至能够在jupyter notebook 或iPython 中以交互方式运行它。【参考方案2】:
对等身份验证通过将连接字符串中的 Postgres 用户名与运行脚本的 Linux 用户名进行比较来工作。
尝试使用sudo -u postgres
运行您的 Python 脚本。
【讨论】:
如果您的脚本也需要将一些文件(例如日志文件)写入到 $USER(已登录用户,而非postgres
用户)拥有的目录中怎么办?因为使用sudo -u postgres
运行脚本时,您会遇到以下错误:PermissionError: [Errno 13] Permission denied: /home/$USER/.../my_log_file
。
@s.k:如果您创建了一个名为$USER
的数据库用户,那么您可以在没有sudo
的情况下使用对等身份验证。您还可以将文件写入和数据库访问分开(例如,编写一个记录到stdout
的子脚本,使用sudo
调用脚本并重定向输出)。如果您确实需要以postgres
身份连接,但不能以postgres
身份运行脚本的其余部分,那么您将需要启用不同的身份验证方法(尽管这涉及的安全问题有点多)厘米)。【参考方案3】:
这就是你打电话的样子。
!/usr/bin/python
import psycopg2
conn = psycopg2.connect(database="postgres", user="postgres", password="postgres", port=5432)
conn.close()
【讨论】:
这给了我FATAL: password authentication failed for user "postgres"
,我认为密码意味着 TCP 身份验证。如何设置本地主机?
现在我回到psycopg2.OperationalError: FATAL: Peer authentication failed for user "postgres"
您可以启用无密码登录并从连接中删除 pw 字段吗? sudo -u postgres psql postgres
查看这里更改 postgres pw - ***.com/questions/12720967/…
我已经读到在默认 postgres 用户上设置密码会更改身份验证,我想避免这种情况。谢谢【参考方案4】:
这些是postgresql的一些认证方法
peer 表示它将信任 UNIX 用户的身份(真实性)。所以不要求输入密码。
md5 表示它总是会要求输入密码,并在使用 MD5 散列后进行验证。
信任意味着它永远不会要求输入密码,并且始终信任任何连接。
你的情况你必须像这样改变:
托管所有 127.0.0.1/32 ident
到
托管所有 127.0.0.1/32 md5
和
托管所有所有 ::1/128 ident
到
全部托管 ::1/128 md5
【讨论】:
以上是关于用户 postgres 的 Psycopg2 对等身份验证的主要内容,如果未能解决你的问题,请参考以下文章
遇到致命问题:使用 ruby on rails 对用户“postgres”进行对等身份验证失败
Python/postgres/psycopg2:获取刚刚插入的行的 ID
Psycopg2 在 postgres 数据库中插入 python 字典
Postgres:使用psycopg2或附近未终止的引用字符串