Come usare psql senza richiesta di password?


70

Ho scritto uno script per gli REINDEXindici in un database. Eccone uno:

echo -e "\nreindex for unq_vbvdata_vehicle started at: `date "+%F %T"`" >> ${LOG_FILE}
psql -U ${USERNAME} -h ${HOSTNAME} -d ${DBNAME} -c "REINDEX INDEX scm_main.unq_vbvdata_vehicle;"
if [[ ${?} -eq 0 ]]; then
    echo "reindex for unq_vbvdata_vehicle finished at: `date "+%F %T"`" >> ${LOG_FILE}
else
    echo "reindex for unq_vbvdata_vehicle failed" >> ${LOG_FILE}
    exit 1
fi

Il problema è che non riesco a eseguire questo script in modalità autonoma. psqlrichiede la password ogni volta che viene eseguito. Vi sono anche due limitazioni:

  1. Non riesco a creare un utente sul database senza password.

  2. Perché REINDEXblocca le tabelle, dovrei usarle sleep <num>tra ciascuna REINDEX.

C'è qualche soluzione automatica?

Risposte:


111

Sono disponibili quattro opzioni per la richiesta della password:

  1. imposta la variabile d'ambiente PGPASSWORD. Per i dettagli, consultare il manuale:
    http://www.postgresql.org/docs/current/static/libpq-envars.html
  2. utilizzare un file .pgpass per memorizzare la password. Per i dettagli, consultare il manuale:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. usa "autenticazione sicura" per quell'utente specifico:
    http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. utilizzare un URI di connessione che contenga tutto:
    http://www.postgresql.org/docs/current/static/libpq-connect.html#AEN42532

4
Da PostgreSQL 9.1 esiste anche il peermetodo di autenticazione per le connessioni locali. Attualmente solo per Linux, BSD, OS X o Solaris (non Windows).
Erwin Brandstetter,

1
Una nota .pgpasssull'opzione, devi ancora specificare nome utente, database e nome host (se avresti normalmente) nel psqlcomando
raphael

rispetto a 3, è necessario modificare il metodo. è spiegato qui: gist.github.com/p1nox/4953113
FuzzyAmi

Usa facilmente la export PGPASSWORD="your_pw"versione 1
gies0r

18

Un semplice esempio con PGPASSWORDsarà qualcosa del tipo:

PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME

Spero che sia d'aiuto.


4
Ciao Ian_H, grazie per i tuoi commenti e sono tutti d'accordo con i tuoi punti. La risposta accettata è molto completa e questo ha risolto il mio problema. Il motivo per cui ho dato la mia risposta a questo vecchio post è perché non è ancora semplice per me, poiché credo che gli altri possano avere la stessa sensazione.
pdm,

Questa è stata sicuramente una buona aggiunta alla risposta accettata - utile promemoria che non è necessario impostare in modo permanente i parametri ENV.
kevlarr,

1

A seconda delle autorizzazioni dell'account, l'esempio senza specificare il database potrebbe non riuscire, poiché le autorizzazioni utente vengono verificate rispetto al database a cui ci si connette. È meglio specificare esplicitamente anche il database.

# this can fail.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME    

# this is more likely to work, assuming given account has permissions to that database.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME -d YOUR_DATABASE  

0

Risposte molto utili in questa discussione. Sto solo aggiungendo questo per Ubuntu 18.04:

sudo PGPASSWORD=yourpasswordHere -u postgres psql

Questo ti porterà nei postgres senza la richiesta della password, senza dover impostare alcuna variabile d'ambiente. Questa non è un'impostazione permanente.


Non farlo: la password sarà visibile nell'output di ps -ef.
Colin 't Hart,
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.