Come posso specificare una password per 'psql' in modo non interattivo?


337

Sto cercando di automatizzare il processo di creazione del database con uno script di shell e una cosa che ho colpito un blocco stradale con il passaggio di una password a psql . Ecco un po 'di codice dallo script della shell:

psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"

Come faccio a passare una password psqlin modo non interattivo?


1
È possibile utilizzare un URL di connessione. Controlla queste risposte in stackoverflow.com/questions/3582552/postgres-connection-url .
paulodiovani,

Risposte:


141

Dalla documentazione ufficiale :

È anche conveniente avere un file ~ / .pgpass per evitare di dover digitare regolarmente le password. Vedere la Sezione 30.13 per ulteriori informazioni.

...

Questo file dovrebbe contenere righe del seguente formato:

hostname:port:database:username:password

Verrà utilizzato il campo password della prima riga che corrisponde ai parametri di connessione correnti.


29
Grazie, sono a conoscenza di pgpass, ma questo non risolve il problema: ho bisogno di uno script bash autonomo per operare sul database, quindi la mia domanda sul passaggio di informazioni a psql tramite riga di comando.
Alex N.

6
Penso che la tua unica opzione sia quella di impostare un file .pgpass a cui il tuo script bash abbia accesso. Oppure non utilizzare affatto le password: potresti impostare un'altra forma di autenticazione, come ident, o utilizzando certificati SSL.
Flimzy,

Questo è quello che temevo :) Grazie per le informazioni!
Alex N.

Un'altra opzione potrebbe essere quella di utilizzare prevede. Ma odio davvero aspettarmi :)
Flimzy,

1
Non dimenticare di rimuovere l'autorizzazione di gruppo e di altri utenti per leggere, scrivere, eseguire il file .pgpass! Corrichmod go-rwx .pgpass
Vladislavs Dovgalecs il

611

Impostare la variabile d'ambiente PGPASSWORD all'interno dello script prima di chiamare psql

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

Per riferimento, consultare http://www.postgresql.org/docs/current/static/libpq-envars.html


modificare

Da Postgres 9.2 esiste anche l'opzione per specificare una stringa di connessione o un URI che può contenere nome utente e password.

L'uso di questo è un rischio per la sicurezza perché la password è visibile in chiaro quando si osserva la riga di comando di un processo in esecuzione, ad esempio utilizzando ps(Linux), ProcessExplorer (Windows) o strumenti simili, da altri utenti.

Vedi anche questa domanda sugli amministratori del database


32
Ad esempio in una riga puoi fare qualcosa del tipo: PGPASSWORD = pass1234 psql -u MyUsername myUserName
andyortlieb

3
Penso che questo sia il modo più conveniente per eseguire semplicemente uno script SQL.
zr870,

2
Posso solo aggiungere - aggiungi a spacenella riga di comando prima del primo carattere e il comando non verrà memorizzato nella cronologia di bash. Funziona con Ubuntu / Bash.
Baldr

5
BONUS: Funziona per Docker:docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
Bilal Akil,

3
Fai attenzione e assicurati di aggiungere sempre uno spazio precedente, altrimenti verrà visualizzato nella tua cronologia di bash ~ / .bash_history file ...
rogerdpack

102
  • in una riga:

    export PGPASSWORD='password'; psql -h 'server name' -U 'user name' -d 'base name' -c 'command'

    con comando un comando sql come"select * from schema.table"

  • o più leggibile:

    export PGPASSWORD='password'
    psql -h 'server name' -U 'user name' -d 'base name' \
         -c 'command' (eg. "select * from schema.table")

18
L'unica riga può essere leggermente semplificata in: il PGPASSWORD='password' psql .... che ha anche il vantaggio che la variabile non è accessibile dopo l'esecuzione del comando.
Garrett,

3
export PGPASSWORD=YourNewPasswordha lavorato per me rispetto ad altre varianti.
Mikeumus,

7
export PGPASSWORDsembra una pessima idea
hasen

1
Ciò salverà la password nel file bash history ~ / .bash_history (a meno che non si aggiunga sempre con attenzione uno spazio precedente) e si esporti anche la password nell'ambiente corrente FWIW: |
rogerdpack,

68

Tendo a preferire il passaggio di un URL a psql :

psql "postgresql://$DB_USER:$DB_PWD@$DB_SERVER/$DB_NAME"

Questo mi dà la libertà di nominare le variabili di ambiente come desidero ed evita di creare file non necessari.

Questo richiede libpq. La documentazione è disponibile qui .


puoi usare qualcosa del genere con pg_restore? Grazie!
the_ccalderon

1
@ ccalderon911217 Apparentemente puoi: stackoverflow.com/a/28359470/1388292
Jacques Gaudin

@JacquesGaudin sì, mi sono messo alla prova! Grazie!
the_ccalderon,

26

Su Windows:

  1. Assegna valore a PGPASSWORD: C:\>set PGPASSWORD=pass

  2. Esegui comando: C:\>psql -d database -U user

Pronto

O in una riga,

set PGPASSWORD=pass&& psql -d database -U user

Nota la mancanza di spazio prima di &&!


1
L'ho provato e non ha funzionato. Viene ancora richiesta una password.
antipattern

1
@antipattern È necessario passare -wanche l' opzione .
mljrg,

1
PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"lavori.
Steve Shipway,

21

Questo può essere fatto creando un .pgpassfile nella home directory dell'utente (Linux). .pgpass formato del file:

<databaseip>:<port>:<databasename>:<dbusername>:<password>

Puoi anche usare i caratteri jolly *al posto dei dettagli.

Supponiamo che volessi correre tmp.sqlsenza richiedere una password.

Con il seguente codice è possibile nel file * .sh

echo "192.168.1.1:*:*:postgres:postgrespwd" > $HOME/.pgpass
echo "` chmod 0600 $HOME/.pgpass `"

echo " ` psql -h 192.168.1.1 -p 5432  -U postgres  postgres  -f tmp.sql `        

11
Qual è il punto di eco "` chmod 0600 $ HOME / .pgpass `"? Che ne dici di chmod 0600 $ HOME / .pgpass?
Vlad Patryshev,

12

Un'alternativa all'utilizzo della PGPASSWORDvariabile d'ambiente è usare la conninfostringa secondo la documentazione :

Un modo alternativo per specificare i parametri di connessione è in una stringa conninfo o in un URI, che viene utilizzato al posto del nome di un database. Questo meccanismo offre un controllo molto ampio sulla connessione.

$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"

postgres=>

4

Aggiunto contenuto di pg_env.sh al mio .bashrc:

cat /opt/PostgreSQL/10/pg_env.sh

#!/bin/sh
# The script sets environment variables helpful for PostgreSQL

export PATH=/opt/PostgreSQL/10/bin:$PATH
export PGDATA=/opt/PostgreSQL/10/data
export PGDATABASE=postgres
export PGUSER=postgres
export PGPORT=5433
export PGLOCALEDIR=/opt/PostgreSQL/10/share/locale
export MANPATH=$MANPATH:/opt/PostgreSQL/10/share/man

con aggiunta di (secondo il suggerimento user4653174)

export PGPASSWORD='password'
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.