postgresql 开启远程访问、postgre设置开机自启动、psql: error: FATAL: Peer authentication failed for user “postgres“

一、psql: error: FATAL: Peer authentication failed for user “postgres”

背景:
执行 psql -U postgres
报错 psql: error: FATAL: Peer authentication failed for user “postgres”

问题分析:
原因:安装完 PostgresQL 后, PostgresQL 连接时的默认认证方式为 peer。官方的解释:
 The peer authentication method works by obtaining the client’s operating system user name from the kernel and using it as the allowed database user name (with optional user name mapping). This method is only supported on local connections.
 大概意思就是使用 peer 方式的认证方式, PostgresQL 会从操作系统内核中获取当前的用户名并且作为允许连接的用户名进行认证,这种方式仅仅适用于本地连接。

由于我们这里的登录名并不是对应的用户名, 因此出现了以上认证失败的信息。

psql的连接建立于Unix Socket上默认使用peer authentication,所以必须要用和 数据库用户 相同的 系统用户 进行登录。

这是默认只有切换postgres用户才可以登录pgsql 的原因

解决方案:

# find / -name pg_hba.conf
/etc/postgresql/12/main/pg_hba.conf
vim /etc/postgresql/12/main/pg_hba.conf

把本地的认证方式从 peer 改为 trust
在这里插入图片描述
/etc/init.d/postgresql restart

这样就可以在其他用户下使用pgsql -U 了
使用示例:

创建数据库,数据库mydb创建成功。
createdb mydb -U postgres

二、postgresql 开启远程访问

安 装PostgreSQL数据库之后,默认是只接受本地访问连接。

如果想在其他主机上配置远程连接PostgreSQL,需要修改pg_hba.conf和postgresql.conf

修改pg_hba.conf文件,开通局域网的访问权限,注意IP地址改为自己所在网络的IP。

1.修改pg_hba.conf文件,配置用户的访问权限


root@sheservice:~# find / -name pg_hba.conf
/etc/postgresql/12/main/pg_hba.conf
root@sheservice:~# vi /etc/postgresql/12/main/pg_hba.conf
  host    all       all         192.168.1.1/32      md5 --/32代表只允许192.168.1.1访问

 host    all       all         192.168.1.0/24     md5 --/24代表192.168.1.1~192.168.1.255都允许访问

 host    all       all         192.168.0.0/16      md5 --/16代表192.168.1.1~192.168.255.255都允许访问

 host    all       all         192.0.0.0/8          md5 --/8代表192.1.1.1~192.255.255.255都允许访问

 host    all       all         0.0.0.0/0          md5 --/0代表所有ip地址都允许访问

加入一行允许内网IP访问

2.修改postgresql.conf文件,将数据库服务器的监听模式修改为监听所有主机发出的连接请求。

定位到#listen_addresses=’localhost’。PostgreSQL安装完成后,默认是只接受来在本机localhost的连接请 求。

编辑配置文件postgresql.conf,去掉前面的#,修改为listen_addresses = ‘*’

root@sheservice:~# find / -name postgresql.conf
/usr/lib/tmpfiles.d/postgresql.conf
/etc/postgresql/12/main/postgresql.conf
root@sheservice:~# vi /etc/postgresql/12/main/postgresql.conf

listen_addresses = ‘*’

认证方式

  • trust:凡是能连接到服务器的,都是可信任的。只需要提供数据库用户名,可以没有对应的操作系统同名用户;
  • md5:password 和 md5:对于外部访问,需要提供 psql 用户名和密码。对于本地连接,提供 psql 用户名密码之外,还需要有操作系统访问权(用操作系统同名用户验证)。password 和 md5 的区别就是外部访问时传输的密码是否用 md5 加密;
  • peer:通过客户端操作系统内核来获取当前系统登录的用户名,并作为psql用户名进行登录。

三、postgre设置开机自启动

systemctl status postgresql

# 设置开机自启动
systemctl enable postgresql

# 启动
systemctl start postgresql
<think> 我们遇到了一个关于PostgreSQL连接的问题,错误信息是:连接尝试失败,因为使用了peer认证方式,但是认证失败。错误信息明确提到了"Peer authentication failed for user 'postgres'"。根据引用[3]和[4],我们知道这是peer认证失败的问题。peer认证方式通常用于本地连接,它使用操作系统用户进行身份验证,而不需要密码。 解决这个问题的思路是修改PostgreSQL的配置文件,改变认证方式。具体来说,我们需要编辑`pg_hba.conf`文件(HBA代表host-based authentication),该文件通常位于PostgreSQL的数据目录中,或者在某些系统上位于`/etc/postgresql/<版本>/main/`目录下。 以下是解决步骤: 1. **找到pg_hba.conf文件**: 我们可以通过多种方式找到该文件,例如: ```bash sudo find / -name pg_hba.conf ``` 或者,如果我们知道数据目录,可以在其中寻找。在Ubuntu上,通常位于: ``` /etc/postgresql/<version>/main/pg_hba.conf ``` 2. **修改pg_hba.conf文件**: 使用文本编辑器(如nano)打开该文件: ```bash sudo nano /etc/postgresql/14/main/pg_hba.conf ``` 注意:版本号(如14)可能因安装的PostgreSQL版本而异。 在该文件中,找到以下行(可能位于文件末尾附近): ``` local all postgres peer ``` 或者可能是: ``` local all all peer ``` 我们需要将`peer`认证方式改为`trust`(仅用于本地开发环境)或者`md5`(需要密码认证)。 例如,如果我们想允许postgres用户通过本地连接且不需要密码(仅建议用于本地开发环境),我们可以改为: ``` local all postgres trust ``` 或者,如果我们想使用密码认证,则改为: ``` local all postgres md5 ``` 另外,我们也可以将所有的本地连接认证方式改为md5,例如: ``` local all all md5 ``` 3. **重新加载PostgreSQL服务**: 修改配置文件后,需要重新加载服务使配置生效: ```bash sudo systemctl reload postgresql ``` 4. **尝试连接**: 现在,我们再次尝试连接: ```bash psql -U postgres ``` 如果我们将认证方式改为了`trust`,则无需密码即可连接。如果改为了`md5`,则需要输入密码。 **注意**:如果之前没有设置过密码,我们可以使用以下步骤设置postgres用户的密码: - 使用sudo命令以postgres用户身份登录(因为我们可能已经修改了认证方式,无法直接通过psql登录): ```bash sudo -u postgres psql ``` - 然后在psql设置密码: ```sql ALTER USER postgres PASSWORD 'new_password'; ``` - 退出psql(输入`\q`)。 然后,我们可以使用密码登录: ```bash psql -U postgres -h localhost ``` 注意:如果使用`-h localhost`,则连接方式会使用TCP/IP而不是Unix域套接字,因此我们需要确保pg_hba.conf中针对IPv4或IPv6的配置也允许密码认证(如md5)。 5. **如果仍然有问题**: 如果我们修改了pg_hba.conf文件并重新加载后仍然遇到问题,请检查: - 修改的行是否在文件中(确保没有注释掉)。 - 确保修改的行没有被后面的规则覆盖(规则是从上到下匹配的)。 - 检查PostgreSQL日志文件以获取更多信息。通常在`/var/log/postgresql/`目录下。 另外,引用[2]提到了密码认证失败的问题,如果我们已经修改为md5认证并且设置了密码,但仍然失败,请确认输入的密码是否正确。 总结:解决peer认证失败的关键是修改配置文件,将认证方式改为trust(无需密码)或md5(需要密码),然后重新加载服务。 --- ### 步骤总结: 1. 找到并编辑`pg_hba.conf`文件。 2. 将针对本地连接(local)和postgres用户的认证方法从`peer`改为`trust`或`md5`。 3. 重新加载PostgreSQL服务。 4. 如果需要,设置postgres用户的密码。 5. 再次尝试连接。 --- ### 相关问题 1. PostgreSQL中`pg_hba.conf`文件的作用是什么?[^1] 2. 如何设置和修改PostgreSQL用户的密码?[^2] 3. 在Ubuntu系统上如何启动、停止和重新加载PostgreSQL服务?[^3] 4. 除了peer认证,PostgreSQL还支持哪些认证方式?[^4] [^1]: 参考了peer认证失败的错误信息以及配置文件的修改。 [^2]: 参考了设置密码的步骤。 [^3]: 参考了重新加载服务的命令。 [^4]: 参考了pg_hba.conf文件中认证方式的修改。 </think> ### 解决 PostgreSQL "Peer authentication failed" 错误的方法 #### 问题原因分析 该错误是由于 PostgreSQL 的 `peer` 认证方式导致的,它要求操作系统用户名与数据库用户名必须匹配[^3][^4]。当使用 `psql -U postgres` 连接时,系统会检查当前操作系统用户是否为 `postgres`,否则拒绝连接[^1][^4]。 --- ### 解决方法(分步操作) #### 方法一:切换为 postgres 系统用户(推荐) ```bash # 1. 切换到postgres系统用户 sudo -i -u postgres # 2. 无需密码直接连接 psql # 3. 退出连接 \q ``` #### 方法二:修改认证方式(需管理员权限) ```bash # 1. 编辑配置文件 sudo nano /etc/postgresql/[版本号]/main/pg_hba.conf # 2. 找到以下行(通常在文件末尾) local all postgres peer ➜ 改为 md5 # 3. 修改后内容示例 local all postgres md5 # 4. 重启服务 sudo systemctl restart postgresql # 5. 设置数据库密码 sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'your_password';" # 6. 使用密码连接 psql -U postgres -h localhost ``` #### 方法三:创建匹配用户名(多用户环境) ```bash # 1. 创建同名系统用户 sudo useradd -m postgres # 若不存在 sudo su - postgres # 2. 设置数据库密码 psql -c "ALTER USER postgres PASSWORD 'your_password';" # 3. 直接连接 psql ``` --- ### 关键配置说明 在 `pg_hba.conf` 文件中: - **`peer`认证**:要求系统用户 == 数据库用户 - **`md5`认证**:使用密码验证(需设置密码) - **`trust`认证**:无需验证(仅限测试环境)[^2] --- ### 验证成功的连接 ```bash # 成功连接的特征 psql (14.5) Type "help" for help. postgres=# ``` --- ### 常见问题排查 1. **配置文件位置错误** 使用查找命令:`sudo find / -name pg_hba.conf` 2. **服务未启动** ```bash sudo systemctl status postgresql sudo systemctl start postgresql ``` 3. **端口冲突** 检查端口占用:`sudo netstat -tulpn | grep 5432` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值