我收到了错误:
FATAL: Peer authentication failed for user "postgres"
当我尝试使用Rails进行postgres时。
这是我的pg_hba.conf
,我的database.yml
和dump of the full trace。
我在pg_hba中将身份验证更改为md5并尝试了不同的操作,但似乎都没有。
我还尝试按照Rails 3.2, FATAL: Peer authentication failed for user (PG::Error)
创建新用户和数据库但是他们没有出现在pgadmin上,甚至没有出现在sudo -u postgres psql -l
上。
知道我哪里出错了?
答案 0 :(得分:854)
问题仍然是你的pg_hba.conf
文件(/etc/postgresql/9.1/main/pg_hba.conf*)。这一行:
local all postgres peer
应该是
local all postgres md5
*如果找不到此文件,则运行locate pg_hba.conf
会显示该文件的位置。
更改此文件后,请不要忘记重新启动PostgreSQL服务器。如果你在Linux上,那将是sudo service postgresql restart
。
这些是根据official PostgreSQL docs on authentication methods对这两个选项的简要说明。
对等身份验证方法通过获取客户端来工作 来自内核的操作系统用户名并将其用作允许的 数据库用户名(带有可选的用户名映射)。这个方法是 仅在本地连接上受支持。
基于密码的身份验证方法是md5和密码。这些 除了密码发送的方式之外,方法的操作类似 跨越连接,分别是MD5-hashed和clear-text。
如果你在关注密码“嗅探”攻击那么md5 是优选的。如果可能,应始终避免使用普通密码。 但是,md5不能与db_user_namespace功能一起使用。如果 连接受SSL加密保护,然后可以使用密码 安全(尽管SSL证书认证可能是更好的选择 如果一个人依赖于使用SSL)。
pg_hba.conf
/etc/postgresql/9.1/main/pg_hba.conf
答案 1 :(得分:285)
安装Postgresql后,我做了以下步骤。
pg_hba.conf
,它将在/etc/postgresql/9.x/main
中并更改此行:local all postgres peer
到
local all postgres trust
sudo service postgresql restart
psql -U postgres
ALTER USER postgres with password 'your-pass';
pg_hba.conf
local all postgres trust
到
local all postgres md5
重新启动postgresql服务器后,您可以使用自己的密码访问它
身份验证方法详情:
信任 - 任何可以连接到服务器的人都有权访问数据库
peer - 使用客户端的操作系统用户名作为数据库用户名来访问它。
md5 - 基于密码的身份验证
供进一步参考check here
答案 2 :(得分:163)
如果您通过localhost(127.0.0.1)连接,则不应该遇到该特定问题。我不会用pg_hba.conf来解决问题,而是调整你的连接字符串:
psql -U someuser -h 127.0.0.1 database
其中某个用户是您的用户,您正在连接,而数据库是您的用户有权连接的数据库。
以下是我在Debian上设置postgres的方法:
http://www.postgresql.org/download/linux/debian/ (Wheezy 7.x)
as root …
root@www0:~# echo "deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main" >> /etc/apt/sources.list
root@www0:~# wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
root@www0:~# apt-get update
root@www0:~# apt-get install postgresql-9.4
root@www0:~# su - postgres
postgres@www0:~$ createuser --interactive -P someuser
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
postgres@www0:~$ createdb -O someuser database
postgres@www0:~$ psql -U someuser -h 127.0.0.1 database
享受!
答案 3 :(得分:27)
这对我有用!!
sudo -u postgres psql
答案 4 :(得分:14)
如果您遇到问题,则需要找到pg_hba.conf
。命令是:
find / -name 'pg_hba.conf' 2>/dev/null
然后更改配置文件:
Postgresql 9.3
Postgresql 9.4
下一步是:重新启动数据库实例:
service postgresql-9.3 restart
如果您有任何问题,则需要再次设置密码:
ALTER USER db_user with password 'db_password';
答案 5 :(得分:12)
最简单的解决方案,无需更改配置。 (ubuntu) 更改用户,然后连接到数据库cli。
sudo -i -u postgres
psql
取自https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-18-04
答案 6 :(得分:10)
我遇到了同样的问题。
depa的解决方案绝对正确。
请确保您已将用户配置为使用PostgreSQL。
检查文件:
$ ls /etc/postgresql/9.1/main/pg_hba.conf -l
此文件的权限应授予您已使用。
注册psql的用户此外。如果你到现在为止都很好..
根据@ depa的说明进行更新。
即
$ sudo nano /etc/postgresql/9.1/main/pg_hba.conf
然后进行更改。
答案 7 :(得分:7)
如果您想保留默认配置但希望对一个特定用户/数据库连接使用套接字连接进行md5身份验证,请在“本地所有/所有”行之前添加“本地”行:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local username dbname md5 # <-- this line
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all all ::1/128 ident
答案 8 :(得分:6)
我在克隆服务器上移动数据目录,并且以postgres身份登录时遇到麻烦。重置像这样的postgres密码对我有用。
root# su postgres
postgres$ psql -U postgres
psql (9.3.6)
Type "help" for help.
postgres=#\password
Enter new password:
Enter it again:
postgres=#
答案 9 :(得分:6)
上面的编辑对我有用,因为我发现我需要在制作后重新启动postgres服务器。 对于ubuntu:
sudo /etc/init.d/postgresql restart
答案 10 :(得分:6)
连接使用host=localhost
。
PGconn *conn = PQconnectdb(
"host=localhost user=postgres dbname=postgres password=123"
);
答案 11 :(得分:5)
在pg_hba.conf(/etc/postgresql/9.1/main/pg_hba.conf |第85行)中将METHOD peer 更改为 trust 解决了这个问题。添加md5要求输入密码,因此如果要求避免使用密码,请使用信任而不是 md5 。
答案 12 :(得分:4)
以下命令对我有用:
psql -d myDb -U username -W
答案 13 :(得分:4)
大多数解决方案都建议编辑pg_hba.conf
。
对于不想编辑配置文件的你,基本上只需要登录postgres
用户即可。如果你正在使用/在 Linux 服务器中,请使用此命令
sudo -i -u postgres
它将创建用户 postgres
,然后登录该用户。现在再次尝试您的 psql 命令。
您还可以使用以下命令为 postgres
用户添加密码:(您应该是 root 用户)
passwd postgres
这是有效的,因为根据这个PostgreSQL's Documentation,
对等身份验证
<块引用>对等身份验证方法通过获取客户端的 内核中的操作系统用户名并将其用作允许的 数据库用户名(带有可选的用户名映射)。这种方法是 仅支持本地连接。
答案 14 :(得分:3)
许多其他答案与各种配置文件中的设置有关,与pg_hba.conf
相关的答案适用且100%正确。但是,请确保您修改正确的配置文件。
正如其他人所提到的,可以使用主配置文件中的各种设置覆盖配置文件位置,以及使用-D
选项在命令行上提供主配置文件的路径。
您可以在psql会话中使用以下命令来显示正在读取配置文件的位置(假设您可以启动psql)。这只是一个可以帮助某些人的故障排除步骤:
select * from pg_settings where setting~'pgsql';
您还应确保postgres用户的主目录符合您的预期目的。我这样说是因为很容易忽略这一点,因为你的提示会显示&#39; ~
&#39;而不是你的主目录的实际路径,使它不那么明显。许多安装将postgres用户主目录默认为/var/lib/pgsql
。
如果未将其设置为预期,请以root身份登录时停止postgresql服务并使用以下命令。还要确保postgres用户没有登录到另一个会话:
usermod -d /path/pgsql postgres
最后输入echo $PGDATA
确保您的PGDATA变量设置正确,输出类似于:
/path/pgsql/data
如果未设置,或显示与预期不同的内容,请检查启动或RC文件,例如.profile或.bash.rc - 这将根据您的操作系统和shell而有很大差异。确定机器的正确启动脚本后,可以插入以下内容:
export PGDATA=/path/pgsql/data
对于我的系统,我将其放在/etc/profile.d/profile.local.sh
中,以便所有用户都可以访问。
您现在应该像往常一样初始化数据库,所有的psql路径设置都应该正确!
答案 15 :(得分:3)
您只需将METHOD设置为信任。
#TYPE DATABASE USER ADDRESS METHOD
local all all trust
重新加载postgres服务器。
# service postgresql-9.5 reload
pg_hba.conf中的更改不需要RESTART postgres服务器。只是RELOAD。
答案 16 :(得分:3)
sudo psql --host=localhost --dbname=database-name --username=postgres
这解决了我的问题
答案 17 :(得分:2)
我的问题是我没有输入任何服务器。我认为这是一个默认因为占位符,但是当我键入localhost时它确实有效。
答案 18 :(得分:2)
如果您尝试在Cloud 9中找到此文件,则可以执行
<android.support.design.widget.CoordinatorLayout
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:theme="@style/AppTheme.AppBarOverlay"
app:expanded="true">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsingToolbarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll|exitUntilCollapsed|enterAlways"
app:statusBarScrim="?attr/colorPrimaryDark">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_marginTop="?attr/actionBarSize"
android:background="@color/colorAccent"
android:orientation="vertical"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.0">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is line #1 of the sliding layout..." />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is line #2 of the sliding layout..." />
</LinearLayout>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="example.com.myapp.ScrollingActivity"
tools:showIn="@layout/activity_scrolling">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/text_margin"
android:text="@string/large_text" />
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
按sudo vim /var/lib/pgsql9/data/pg_hba.conf
进行编辑/插入,按I
3次,然后输入ESC
将保存文件并退出
答案 19 :(得分:1)
如果您在使用rails时遇到此问题,并且您知道已经使用密码创建了该用户名以及正确的权限,那么您只需要将以下内容放在database.yml文件的末尾。
host: localhost
整体文件如下所示
development:
adapter: postgresql
encoding: unicode
database: myapp_development
pool: 5
username: root
password: admin
host: localhost
您根本不需要触摸pg_hba.conf
文件。快乐的编码
答案 20 :(得分:0)
pg_config用于提供编译信息,以帮助扩展和客户端程序针对PostgreSQL进行编译和链接。它对计算机上活动的PostgreSQL实例一无所知,仅对二进制文件一无所知。
pg_hba.conf可以出现在许多其他地方,具体取决于安装Pg的方式。标准位置是数据库的data_directory中的pg_hba.conf(可以位于/ home,/ var / lib / pgsql,/ var / lib / postgresql / [version] /,/ opt / postgres /等)中。但是用户和打包者可以将其放置在任意位置。不幸的是。
找到pg_hba.conf的唯一有效方法是询问正在运行的PostgreSQL实例pg_hba.conf所在的位置,或询问sysadmin位置。您甚至不必依靠询问datadir的位置并解析postgresql.conf,因为启动Pg时初始化脚本可能会传递-c hba_file = / some / other / path之类的参数。
您要做的是询问PostgreSQL:
SHOW hba_file;
此命令必须在超级用户会话上运行,因此对于shell脚本编写,您可能会编写如下内容:
psql -t -P format=unaligned -c 'show hba_file';
并设置环境变量PGUSER,PGDATABASE等,以确保连接正确。
是的,这有点像个鸡和蛋的问题,因为如果用户无法连接(例如,在修改pg_hba.conf进行编辑之后),则无法找到pg_hba.conf进行修复
另一种选择是查看ps命令的输出,并查看其中是否可以看到postmaster数据目录参数-D
ps aux | grep 'postgres *-D'
因为pg_hba.conf将位于数据目录中(除非您使用的是Debian / Ubuntu或某些衍生产品,并使用其软件包)。
如果您要专门针对从Debian / Ubuntu软件包安装了PostgreSQL的Ubuntu系统,它会变得容易一些。您不必处理手工从源代码编译的Pg,该Pg是某人的initdb在其主目录中为其指定的datadir,也无需处理在/ opt中安装的EnterpriseDB Pg等。您可以询问pg_wrapper,Debian / Ubuntu multi版本的Pg管理器,其中PostgreSQL使用pg_wrapper的pg_lsclusters命令。
如果无法连接(Pg未运行,或者需要编辑pg_hba.conf进行连接),则必须在系统中搜索pg_hba.conf文件。在Mac和Linux上,诸如sudo find / -type f -name pg_hba.conf之类的东西会起作用。然后检查同一目录中的PG_VERSION文件,以确保它是正确的PostgreSQL版本(如果有多个版本)。 (如果pg_hba.conf在/ etc /中,请忽略它,它是父目录名)。如果同一PostgreSQL版本有多个数据目录,则必须查看数据库大小,请从ps检查正在运行的postgres的命令行,以查看其数据目录-D参数是否与您编辑的位置匹配,等等。 。 https://askubuntu.com/questions/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711
答案 21 :(得分:0)
请按照以下步骤操作
1)。首先,导航到/ etc / postgresql / {您的pg版本} /主目录。
我的版本是10然后:
cd /etc/postgresql/10/main
2)。此处驻留pg_hba.conf文件,需要在此处进行一些更改 sudo访问。
sudo nano pg_hba.conf
3)。向下滚动文件,直到找到它–
# Database administrative login by Unix domain socket
local all postgres peer
4)。在此将对等方更改为md5,如下所示。
# Database administrative login by Unix domain socket
local all all md5
peer表示它将信任UNIX用户的真实性,因此不信任
提示输入密码。 md5表示它将始终要求输入密码, 并在使用MD5进行哈希处理后对其进行验证。
5)。现在保存文件并重新启动Postgres服务器。
sudo service postgresql restart
现在应该可以了。
答案 22 :(得分:0)
在 CentOS 7、PG 10 上,文件路径为
/var/lib/pgsql/10/data/pg_hba.conf