psql: FATAL: autenticazione peer non riuscita per l'utente "dev"


198

quando creo un nuovo utente, ma non riesco ad accedere al database.
Lo faccio così:

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

quindi creare un database:

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

dopo quello, provo psql -U dev -W test_developmentad accedere, ma ottengo l'errore:

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

Ho provato a risolvere il problema ma non ci sono riuscito.



ora, per ricevere le risposte alle domande precedenti è necessario aggiungere --interactiveal comando:createuser --interactive joe
user3791372

Risposte:


310

Provare:

psql -U user_name  -h 127.0.0.1 -d db_name

dove

  • -U è il nome utente del database
  • -h è il nome host / IP del server locale, evitando così socket di dominio Unix
  • -d è il nome del database a cui connettersi

Questo viene quindi valutato come una connessione "di rete" da Postgresql piuttosto che una connessione socket di dominio Unix, quindi non valutato come una connessione "locale" come si potrebbe vedere in pg_hba.conf:

local   all             all                                     peer

15
Avevo bisogno (ver 9.4): psql -U nome-utente -h 127.0.0.1 -d nome-db
Gregor

9
che strumento aristocratico. dice il manuale psql [option...] [dbname [username]], quindi penseresti psql dbname usernameche funzionerebbe ..
djeikyb,

2
Ha funzionato anche per me. Penso anche che questo sia un modo molto più preferibile rispetto alla modifica dei file di configurazione, specialmente quando non hai idea di cosa stai facendo e semplicemente seguendo la risposta SO per risolvere il tuo problema.
Borisano,

1
questo ha funzionato per me, grazie mille, anche se sto facendo una ricerca sul perché fosse la soluzione corretta. nondimeno, in una configurazione in un'altra macchina, accederei come database psql -U username -d. quindi immagino che la soluzione accettata dipende dal caso.
Lazzaro che sorge il

2
Buona risposta. Stavo arrivando dall'interno del database dopo aver effettuato l'accesso come Postgres \c glossary john FATAL: Peer authentication failed for user "john"e con \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".esso ha funzionato.
guarda il

215

La connessione non è riuscita perché, per impostazione predefinita, si psqlconnette tramite socket UNIX mediante l' peerautenticazione, il che richiede all'utente UNIX corrente di avere lo stesso nome utente psql. Quindi dovrai creare l'utente UNIX deve quindi accedere come devo utilizzare sudo -u dev psql test_developmentper accedere al database (e nonpsql dovresti chiedere una password).

Se non è possibile o non si desidera creare l'utente UNIX, come se si desidera semplicemente connettersi al database per query ad hoc , forzare una connessione socket utilizzando psql --host=localhost --dbname=test_development --username=dev(come sottolineato dalla risposta di @meyerson) risolverà il problema immediato.

Ma se si intende forzare l'autenticazione della password sui socket Unix anziché sul metodo peer, provare a modificare la seguente pg_hba.conf* linea:

a partire dal

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

per

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
  • peersignifica che si fiderà dell'identità (autenticità) dell'utente UNIX. Quindi non chiedere una password.

  • md5significa che chiederà sempre una password e la convaliderà dopo aver eseguito l'hashing con MD5.

Naturalmente, puoi anche creare regole più specifiche per un determinato database o utente, con alcuni utenti che hanno peere altri che richiedono password.

Dopo aver modificato pg_hba.confse PostgreSQL è in esecuzione, dovrai farlo rileggere la configurazione ricaricando ( pg_ctl reload) o riavviando ( sudo service postgresql restart).

* Il file pg_hba.confsarà probabilmente su/etc/postgresql/9.x/main/pg_hba.conf

A cura di: commenti da @Chloe, @JavierEH, @Jonas Eicher, @fccoelho, @Joanis, @Uphill_Quali commenti integrati nella risposta.


5
Come si consente peer AND md5 ? Quando imposto md5, non posso più accedere con l' postgresutente! Ho provato ad aggiungere più righe e a separare il metodo con virgole, ma non hanno funzionato. Ok ho trovato mgoldwasserla risposta e ha funzionato. Ho appena aggiunto un'altra riga per l'utente postgrescon il metodo peer!
Chloe,

3
Non preoccuparti, puoi impostare l'autenticazione peer per utenti specifici (ad esempio, il tuo nome utente o postgres). Sembra che regole specifiche
prevalgano sulle

1
Su alcune distribuzioni il file potrebbe anche essere trovato qui:/var/lib/pgsql/9.4/data/pg_hba.conf
Jonas Eicher

2
non puoi farlo senza riavviare postgresql? non puoi semplicemente specificare il metodo di autenticazione nella tabella pg_user?
fccoelho,

2
È possibile ricaricare invece di riavviare. Ciò ricarica la tabella pg_hba. Ha funzionato per me.
Joanis,

29

Autenticazione peer significa che Postgres richiede al sistema operativo il proprio nome di accesso e lo utilizza per l'autenticazione. Per accedere come utente "dev" usando l'autenticazione peer su postgres, devi anche essere l'utente "dev" sul sistema operativo.

Puoi trovare i dettagli dei metodi di autenticazione nella documentazione di Postgresql .

Suggerimento: se nessun metodo di autenticazione funziona più, scollegare il server dalla rete e utilizzare il metodo "trust" per "localhost" (e ricontrollare che il server non sia raggiungibile attraverso la rete mentre il metodo "trust" è abilitato).


1
grazie per le tue risposte, ma non funziona ancora se cambio devutente di sistemaXXX
hsming

2
la risposta di stefan è corretta. Ho appena aggiunto un link, che sarà visibile quando la mia modifica viene esaminata, alla documentazione in cui sono spiegati ciascuno dei metodi di autenticazione.
DSH

25

Quando si specifica:

psql -U user

si collega tramite UNIX Socket, che per impostazione predefinita utilizza l' peerautenticazione, se non pg_hba.confdiversamente specificato .

Puoi specificare:

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

per ottenere la connessione TCP / IP sull'interfaccia di loopback (sia IPv4 che IPv6) per specificato databasee user.

Dopo le modifiche devi riavviare Postgres o ricaricare la sua configurazione. Riavvia che dovrebbe funzionare nelle moderne distribuzioni basate su RHEL / Debian:

service postgresql restart

Il ricaricamento dovrebbe funzionare nel modo seguente:

pg_ctl reload

ma il comando potrebbe differire in base alla configurazione del PERCORSO - potrebbe essere necessario specificare il percorso assoluto, che potrebbe essere diverso, a seconda del modo in cui è stato installato Postgres.

Quindi puoi usare:

psql -h localhost -U user -d database

per accedere con quello userspecificato databasesu TCP / IP. md5sta per password crittografata, mentre è anche possibile specificare passwordpassword in testo normale durante l'autorizzazione. Queste 2 opzioni non dovrebbero essere importanti se il server di database è accessibile solo localmente, senza accesso alla rete.

Nota importante: ordine delle definizioni in pg_hba.confmateria: le regole vengono lette dall'alto verso il basso, come iptables, quindi probabilmente si desidera aggiungere le regole proposte sopra la regola:

host    all             all             127.0.0.1/32            ident

re la Nota importante: - l'ordine è importante +1
falco

23

Mentre la risposta di @ flaviodesousa funzionerebbe, è anche obbligatorio inserire una password per tutti gli utenti (tutti gli altri).

A volte ha senso mantenere l'autenticazione peer per tutti gli altri, ma fare un'eccezione per un utente del servizio. In tal caso, si desidera aggiungere una riga a pg_hba.conf che assomigli a:

local   all             some_batch_user                         md5

Consiglierei di aggiungere questa riga proprio sotto l'intestazione commentata:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5

Dovrai riavviare PostgreSQL usando

sudo service postgresql restart

Se stai usando 9.3, il tuo pg_hba.conf sarebbe molto probabilmente:

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


12

Questo funziona per me quando ci incontro:

sudo -u username psql

funziona solo se si crea un nuovo utente sul sistema e in Postgres - hsming vuole solo la connessione a postgres con l'utente postgres appena creato, dev.
Kenneth,

8

La soluzione più semplice:

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

Ho semplicemente dovuto aggiungere -h localhost


Il mio problema era usare Postgres su un Raspberry. ^^^ ha funzionato per me !! Grazie!
Tidydee,

2

Nel mio caso stavo usando una porta diversa. L'impostazione predefinita è 5432. Stavo usando 5433. Questo ha funzionato per me:

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

Ciò può accadere automaticamente quando hai più di un'installazione di Postgres.
Galigator,

1

Per le persone in futuro vedendo questo, postgresè /usr/lib/postgresql/10/binsul mio server Ubuntu.

L'ho aggiunto al PERCORSO nel mio file .bashrc e alla fine ho aggiunto questa riga

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

quindi dalla riga di comando

$> source ./.bashrc

Ho rinfrescato il mio ambiente bash. Ora posso usare postgres -D /whereverda qualsiasi directory


1

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


A quale domanda risponde? Perché potrebbe -U postgresessere fondamentale? Che cosa sono tutte quelle trattini , comunque?
greybeard

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.