psql: FATAL: Peer-Authentifizierung für Benutzer "dev" fehlgeschlagen


198

wenn ich einen neuen Benutzer erstelle, der sich aber nicht in der Datenbank anmelden kann.
Ich mache das so:

postgres@Aspire:/home/XXX$ createuser dev
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) y

Erstellen Sie dann eine Datenbank:

postgres@Aspire:/home/XXX$ createdb -O dev test_development

psql -U dev -W test_developmentDanach versuche ich mich anzumelden, erhalte aber den Fehler:

psql: FATAL:  Peer authentication failed for user "dev"

Ich habe versucht, das Problem zu lösen, bin aber gescheitert.



--interactivecreateuser --interactive joe
Um

Antworten:


310

Versuchen:

psql -U user_name  -h 127.0.0.1 -d db_name

wo

  • -U ist der Benutzername der Datenbank
  • -h ist der Hostname / die IP des lokalen Servers, wodurch Unix-Domain-Sockets vermieden werden
  • -d ist der Datenbankname, zu dem eine Verbindung hergestellt werden soll

Dies wird dann von Postgresql als "Netzwerk" -Verbindung und nicht als Unix-Domain-Socket-Verbindung ausgewertet und daher nicht als "lokale" Verbindung ausgewertet, wie Sie möglicherweise in pg_hba.conffolgenden Abschnitten sehen :

local   all             all                                     peer

15
Ich brauchte (Version 9.4): psql -U Benutzername -h 127.0.0.1 -d Datenbankname
Gregor

9
Was für ein Ornery-Tool. Das Handbuch sagt psql [option...] [dbname [username]], so würde man denken, psql dbname usernamewürde einfach funktionieren ..
Djeikyb

2
Hat auch für mich gearbeitet. Ich denke auch, dass dies ein viel bevorzugterer Weg ist als das Ändern von Konfigurationsdateien, insbesondere wenn Sie keine Ahnung haben, was Sie tun, und einfach der SO-Antwort folgen, um Ihr Problem zu lösen.
Borisano

1
Das hat bei mir funktioniert, vielen Dank, obwohl ich nachforsche, warum es die richtige Lösung war. Trotzdem würde ich mich in einer Konfiguration auf einem anderen Computer als psql -U Benutzername -d Datenbank anmelden. Ich denke also, dass die akzeptierte Lösung vom Fall abhängt.
Lazarus

2
Gute Antwort. Ich kam aus der Datenbank heraus, nachdem ich mich als Postgres angemeldet hatte und es \c glossary john FATAL: Peer authentication failed for user "john"dann \c glossary john localhost Password for user john: SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) You are now connected to database "glossary" as user "john" on host "localhost" at port "5432".funktionierte.
Schauen Sie

215

Ihre Verbindung ist fehlgeschlagen, da standardmäßig eine psqlVerbindung über UNIX-Sockets mithilfe der peerAuthentifizierung hergestellt wird. Daher muss der aktuelle UNIX-Benutzer denselben Benutzernamen wie haben psql. Sie müssen also den UNIX-Benutzer erstellen devund sich dann als anmelden devoder sudo -u dev psql test_developmentfür den Zugriff auf die Datenbank verwenden (und psqlsollten dies nicht tun) nach einem Kennwort fragen).

Wenn Sie den UNIX-Benutzer nicht erstellen können oder möchten, z. B. wenn Sie nur für Ad-hoc- Abfragen eine Verbindung zu Ihrer Datenbank herstellen möchten , wird das Erzwingen einer Socket-Verbindung mit psql --host=localhost --dbname=test_development --username=dev(wie in der Antwort von @meyerson angegeben) Ihr sofortiges Problem lösen.

Wenn Sie jedoch die Kennwortauthentifizierung über Unix-Sockets anstelle der Peer-Methode erzwingen möchten, ändern Sie Folgendes pg_hba.conf * Zeile:

von

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

zu

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
  • peerbedeutet, dass es der Identität (Authentizität) des UNIX-Benutzers vertraut. Also nicht nach einem Passwort fragen.

  • md5 bedeutet, dass es immer nach einem Passwort fragt und es nach dem Hashing mit validiert MD5 .

Natürlich können Sie auch spezifischere Regeln für eine bestimmte Datenbank oder einen bestimmten Benutzer erstellen, wobei einige Benutzer peerKennwörter haben und andere Kennwörter benötigen.

Nach dem Wechsel pg_hba.conf ob PostgreSQL ausgeführt wird, müssen Sie die Konfiguration durch erneutes Laden ( pg_ctl reload) oder Neustarten ( sudo service postgresql restart) erneut lesen .

* Die Datei pg_hba.conf wird höchstwahrscheinlich bei sein/etc/postgresql/9.x/main/pg_hba.conf

Bearbeitet: Anmerkungen von @Chloe, @JavierEH, @Jonas Eicher, @fccoelho, @Joanis, @Uphill_Welche Kommentare wurden in die Antwort aufgenommen?


5
Wie erlaubst du peer UND md5 ? Wenn ich einstelle md5, kann ich mich nicht mehr mit dem postgresBenutzer anmelden ! Ich habe versucht, mehrere Zeilen hinzuzufügen und die Methode durch Kommas zu trennen, aber sie haben nicht funktioniert. Ok, ich habe mgoldwasserdie Antwort gefunden und das hat funktioniert. Ich habe gerade eine weitere Zeile für Benutzer postgresmit Methode hinzugefügt peer!
Chloe

3
Keine Sorge, Sie können die Peer-Authentifizierung für bestimmte Benutzer festlegen (z. B. Ihren Benutzernamen oder Postgres). Es scheint, dass bestimmte Regeln allgemeine Regeln außer Kraft setzen
JavierIEH

1
Auf einigen Distributionen kann die Datei auch hier gefunden werden:/var/lib/pgsql/9.4/data/pg_hba.conf
Jonas Eicher

2
können Sie dies nicht tun, ohne postgresql neu zu starten? Können Sie die Authentifizierungsmethode nicht einfach in der Tabelle pg_user angeben?
Fccoelho

2
Sie können neu laden, anstatt neu zu starten. Dadurch wird die Tabelle pg_hba neu geladen. Hat für mich gearbeitet.
Joanis

29

Peer-Authentifizierung bedeutet, dass postgres das Betriebssystem nach Ihrem Anmeldenamen fragt und diesen zur Authentifizierung verwendet. Um sich als Benutzer "dev" mithilfe der Peer-Authentifizierung auf Postgres anzumelden, müssen Sie auch der Benutzer "dev" auf dem Betriebssystem sein.

Details zu den Authentifizierungsmethoden finden Sie in der Postgresql-Dokumentation .

Hinweis: Wenn keine Authentifizierungsmethode mehr funktioniert, trennen Sie den Server vom Netzwerk und verwenden Sie die Methode "trust" für "localhost" (und überprüfen Sie, ob Ihr Server nicht über das Netzwerk erreichbar ist, während die Methode "trust" aktiviert ist).


1
devXXX
Vielen

2
stefans antwort ist richtig. Ich habe gerade einen Link zur Dokumentation hinzugefügt, in dem die einzelnen Authentifizierungsmethoden erläutert werden, der sichtbar wird, wenn meine Bearbeitung überprüft wird.
dsh

25

Wenn Sie angeben:

psql -U user

Die Verbindung wird über UNIX Socket hergestellt, das standardmäßig die peerAuthentifizierung verwendet, sofern nicht pg_hba.confanders angegeben.

Sie können angeben:

host    database             user             127.0.0.1/32       md5
host    database             user             ::1/128            md5

um eine TCP / IP-Verbindung über die Loopback-Schnittstelle (sowohl IPv4 als auch IPv6) für die angegebenen databaseund zu erhalten user.

Nach Änderungen müssen Sie postgres neu starten oder die Konfiguration neu laden. Neustart, der in modernen RHEL / Debian-basierten Distributionen funktionieren sollte:

service postgresql restart

Das Neuladen sollte folgendermaßen funktionieren:

pg_ctl reload

Der Befehl kann jedoch je nach PATH-Konfiguration unterschiedlich sein. Möglicherweise müssen Sie einen absoluten Pfad angeben, der je nach Art der Installation des Postgres unterschiedlich sein kann.

Dann können Sie verwenden:

psql -h localhost -U user -d database

zum Login mit der userangegebenen databaseüber TCP / IP. md5steht für verschlüsseltes Passwort, während Sie passwordwährend der Autorisierung auch Nur- Text-Passwörter angeben können . Diese beiden Optionen sollten keine große Rolle spielen, solange auf den Datenbankserver nur lokal zugegriffen werden kann und kein Netzwerkzugriff besteht.

Wichtiger Hinweis: Definitionsreihenfolge in pg_hba.confAngelegenheiten - Regeln werden wie iptables von oben nach unten gelesen, daher möchten Sie wahrscheinlich vorgeschlagene Regeln über der Regel hinzufügen:

host    all             all             127.0.0.1/32            ident

Zu dem wichtigen Hinweis: - Reihenfolge ist wichtig +1
Hawkeye

23

Während die Antwort von @ flaviodesousa funktionieren würde, ist es auch für alle Benutzer (alle anderen) obligatorisch, ein Passwort einzugeben.

Manchmal ist es sinnvoll, die Peer-Authentifizierung für alle anderen beizubehalten, für einen Dienstbenutzer jedoch eine Ausnahme zu machen. In diesem Fall möchten Sie der pg_hba.conf eine Zeile hinzufügen, die wie folgt aussieht:

local   all             some_batch_user                         md5

Ich würde empfehlen, dass Sie diese Zeile direkt unter der kommentierten Kopfzeile hinzufügen:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5

Sie müssen PostgreSQL mit neu starten

sudo service postgresql restart

Wenn Sie 9.3 verwenden, lautet Ihre pg_hba.conf höchstwahrscheinlich:

/etc/postgresql/9.3/main/pg_hba.conf


12

Das funktioniert bei mir, wenn ich darauf stoße:

sudo -u username psql

funktioniert nur, wenn Sie einen ganz neuen Benutzer auf dem System UND in postgres erstellen - hsming möchte nur mit dem neu erstellten postgres-Benutzer eine Verbindung zu postgres herstellen dev.
Kenneth

8

Die einfachste Lösung:

CREATE USER dev WITH PASSWORD 'dev';
CREATE DATABASE test_development;
GRANT ALL PRIVILEGES ON DATABASE test_development to dev;
ALTER ROLE dev CREATEROLE CREATEDB;

6

Ich musste einfach hinzufügen -h localhost


Mein Problem war die Verwendung von Postgres auf einer Himbeere. ^^^ hat bei mir gearbeitet !! Danke dir!
Tidydee

2

In meinem Fall habe ich einen anderen Port verwendet. Die Standardeinstellung ist 5432. Ich habe 5433 verwendet. Dies hat bei mir funktioniert:

$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433

Dies kann automatisch auftreten, wenn Sie mehr als eine Installation von Postgres haben.
Galigator

1

Für Menschen in der Zukunft postgresist dies in der/usr/lib/postgresql/10/bin auf meinem Ubuntu-Server.

Ich habe es dem PATH in meiner .bashrc-Datei hinzugefügt und diese Zeile am Ende hinzugefügt

PATH=$PATH:/usr/lib/postgresql/10/bin

dann in der Kommandozeile

$> source ./.bashrc

Ich habe meine Bash-Umgebung aktualisiert. Jetzt kann ich postgres -D /whereveraus jedem Verzeichnis verwenden


1

pg_dump -h localhost -U postgres -F c -b -v -f mydb.backup mydb


Welche Frage beantwortet diese? Warum könnte -U postgresentscheidend sein? Was sind überhaupt all diese Strichbuchstaben ?
Graubart

0

Versuchen:

psql -U Rollenname -d Datenbank -h Hostname..com -W


Bitte fügen Sie Ihrer Antwort etwas mehr Kontext hinzu.
Tod Waltz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.