Postgresql: scripting esecuzione psql con password


274

Come posso chiamare psql in modo che non richieda una password ?

Questo è quello che ho:

psql -Umyuser < myscript.sql

Tuttavia, non sono riuscito a trovare l'argomento che passa la password, quindi psql lo richiede sempre.


4
Ho finito per cercare la variabile d'ambiente PGPASSWORD. Questo si adatta perfettamente alla mia custodia. Semplice e autonomo nella sceneggiatura.
Axel Fontaine,

Ho appena trovato questo postgresguide.com/utilities/psql.html
D_C

Risposte:


315

Esistono diversi modi per autenticarsi su PostgreSQL. Potresti voler esaminare alternative all'autenticazione con password su https://www.postgresql.org/docs/current/static/client-authentication.html .

Per rispondere alla tua domanda, ci sono alcuni modi per fornire una password per l'autenticazione basata su password. Il modo ovvio è tramite la richiesta della password. Invece, puoi fornire la password in un file pgpass o attraverso la PGPASSWORDvariabile d'ambiente. Vedi questi:

Non è possibile fornire la password come argomento della riga di comando poiché tali informazioni sono spesso disponibili a tutti gli utenti e quindi non sono sicure. Tuttavia, negli ambienti Linux / Unix è possibile fornire una variabile di ambiente per un singolo comando come questo:

PGPASSWORD=yourpass psql ...

11
Penso che PGPASSWORD sia deprecato ma funziona ancora, a proposito. Cordiali saluti
Scott Marlowe,

35
Sì, è deprecato (e così notato in uno dei collegamenti). Dal momento che è emerso, probabilmente vale anche la pena notare che la deprecazione è fortemente contestata perché è estremamente utile per molte persone ma può essere utilizzata in alcune circostanze senza gravi problemi di sicurezza. Mi sembra che non sia peggio che archiviare .pgpass su un filesystem NFS, per esempio. Uso PGPASSWORD regolarmente.
Reece,

1
l'idea che le informazioni della riga di comando siano "disponibili per tutti gli utenti" si basa su presupposti antiquati sui sistemi multiutente e non si applica nella maggior parte degli ambienti moderni in cui i sistemi eseguono solo una singola applicazione ed è tutto automatizzato
Alex R

159
PGPASSWORD=[your password] psql -Umyuser < myscript.sql

1
funziona anche in terraform. tu, amico mio, sei un
vero toccasana

67

Puoi aggiungere questa riga di comando all'inizio del tuo script:

set PGPASSWORD=[your password]

24
nel mio caso il comando set non ha funzionato ma export PGPASSWORD=[password]ha funzionato
Can Kavaklıoğlu

non funziona nello script di shell. Lo sto usando #!/bin/sh set PGPASSWORD = postgres psql -h 192.168.3.200 -U postgres incx_um << EOF DELETE FROM usrmgt.user_one_time_codes WHERE time < NOW() - INTERVAL '30 minute' EOF
Govind Gupta,

2
Prova a non usare spazi, ad es. PGPASSWORD=password.
Ariejan,

48

Se si intende disporre di più connessioni host / database, il file ~ / .pgpass è la strada da percorrere.

passi:

  1. Crea il file usando vim ~/.pgpasso simili. Immettere le informazioni nel seguente formato: hostname:port:database:username:passwordnon aggiungere virgolette attorno ai valori dei campi. È inoltre possibile utilizzare * come carattere jolly per i campi della porta / del database.
  2. Devi fare chmod 0600 ~/.pgpassin modo che non venga silenziosamente ignorato da psql.
  3. Crea un alias nel tuo profilo bash che esegue il comando psql per te. Ad esempio: alias postygresy='psql --host hostname database_name -U username'i valori devono corrispondere a quelli immessi nel file ~ / .pgpass.
  4. Sorgente il tuo profilo bash con . ~/.bashrco simili.
  5. Digita il tuo alias dalla riga di comando.

Notare che se si imposta una variabile PGPASSWORD = '' di esportazione, avrà la precedenza sul file.


1
Devi fare un chmod 600file, altrimenti psqllo ignorerai silenziosamente (secondo i documenti).
RichVel,

33

Questa potrebbe essere una vecchia domanda, ma c'è un metodo alternativo che puoi usare che nessuno ha menzionato. È possibile specificare la password direttamente nell'URI di connessione. La documentazione è disponibile qui , in alternativa qui .

È possibile fornire nome utente e password direttamente nell'URI di connessione fornito a psql:

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb

2
Postrgres 9.3 ignora la variabile d'ambientePGPASSWORD
david.perez il

14

Se hai problemi con Windows come me (sto usando Windows 7 64-bit) e set PGPASSWORD=[Password]non ha funzionato.

Quindi, come ha detto Kavaklioglu in uno dei commenti,

export PGPASSWORD=[password]

Dovrai salvarlo nella parte superiore del file o prima di qualsiasi utilizzo, quindi impostalo prima di essere chiamato.

Certamente funziona su Windows :)


1
export PGPASSWORD=[password]non funziona affatto con la riga di comando (cmd.exe). Sei sicuro di non utilizzare Cygwin o qualcosa di simile?
Devin Snyder,

Funziona solo con cl, l'hai aggiunto al file giusto? Ora lo hai appena digitato al comando?
Jamie Hutber,

va bene usarlo in ambiente Linux / Mac, per Windows, penso che dovresti trovare un modo per esportare questa variabile d'ambiente.
Pengfei.X

Quindi aggiungi una password globale ... Anche questa è un'idea interessante
Jamie Hutber


7

Date le preoccupazioni di sicurezza sull'uso della variabile d'ambiente PGPASSWORD, penso che la migliore soluzione complessiva sia la seguente:

  1. Scrivi il tuo file pgpass temporaneo con la password che desideri utilizzare.
  2. Utilizzare la variabile d'ambiente PGPASSFILE per dire a psql di usare quel file.
  3. Rimuovere il file pgpass temporaneo

Ci sono un paio di punti di nota qui. Il passaggio 1 è lì per evitare confusione con il file ~ / .pgpass dell'utente che potrebbe esistere. È inoltre necessario assicurarsi che il file disponga di autorizzazioni 0600 o meno.

Alcuni hanno suggerito di sfruttare bash per scorciatoia come segue:

PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb

Questo utilizza la sintassi <() per evitare di dover scrivere i dati in un file reale. Ma non funziona perché psql controlla quale file viene utilizzato e genererà un errore del genere:

WARNING: password file "/dev/fd/63" is not a plain file

Un esempio funzionante di questo approccio appare in stackoverflow.com/a/40614592/3696363 - un'altra risposta a questa domanda.
Eliyahu Skoczylas,

Anche se questo utente non ha davvero chiesto la stessa cosa che sto cercando, direi che l'approccio non corrisponde. Quando si utilizza la sintassi PGPASSFILE = <(qualunque), è possibile eseguire operazioni come la decrittografia di un file e averlo presente solo nel descrittore di file creato. Scrivendo un file temporaneo, non stai fondamentalmente risolvendo il problema di avere un file su disco con credenziali. Non è divertente avere a che fare con regole del settore arbitrarie del genere, ma è una cosa che molte persone affrontano.
Desidero,

7

Può essere fatto semplicemente usando PGPASSWORD. Sto usando psql 9.5.10. Nel tuo caso la soluzione sarebbe

PGPASSWORD=password psql -U myuser < myscript.sql


5

Basandosi sulla risposta di mightybyte per coloro che non si sentono a proprio agio con lo scripting della shell * nix , ecco uno script funzionante:

#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE

Il doppio simbolo del dollaro ( $$) in/tmp/pgpasswd$$ riga 2 aggiunge il numero ID del processo al nome del file, in modo che questo script possa essere eseguito più di una volta, anche simultaneamente, senza effetti collaterali.

Nota l'uso del chmodcomando alla riga 4 - proprio come l' errore " non un file semplice " che potrebbe essere descritto, c'è anche un " permesso errore " se questo non viene fatto.

Alla riga 7, non dovrai usare il -hmyserver , il -pmyport o il flag -Ujdoe se usi i valori predefiniti ( localhost : 5432 ) e si dispone di un solo utente del database. Per più utenti, (ma la connessione predefinita) cambia quella linea in

psql mydb jdoe

Non dimenticare di creare la sceneggiatura eseguibile con

chmod +x runpsql ( o come hai chiamato il file di script )

AGGIORNARE:

Ho seguito il consiglio di RichVel e ho reso illeggibile il file prima di inserire la password. Ciò chiude una leggera falla di sicurezza. Grazie!


4
È possibile utilizzare mktempper creare un file temporaneo invece di elaborare il proprio schema di denominazione. Crea un nuovo file temporaneo (chiamato in modo simile /tmp/tmp.ITXUNYgiNha Linux e /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4su MacOS X) e stampa il suo nome su stdout.
Ivan Kolmychek,

1
Problema di sicurezza È consigliabile eseguire la procedura chmod 600dopo aver creato il file, ma prima di scrivere la password. Come scritto, uno script dannoso sul server potrebbe continuamente cercare di leggere file di questo formato e talvolta riuscire a ottenere la password. Inoltre, se questo script viene interrotto per qualche motivo, il file verrebbe lasciato sul disco - la scrittura di un trapgestore shell lo risolverà. Dato che non è banale scrivere uno script sicuro come questo, consiglio export PGPASSWORDinvece di usarlo .
RichVel,

Grazie, @RichVel per aver sottolineato quella piccola falla di sicurezza. Toccare per creare e rendere privato il file prima di inserire la password è un netto miglioramento. Questo tipo di soluzione è necessaria perché PGPASSWORDè stato deprecato in 9.3.
Eliyahu Skoczylas,

Alcuni dei documenti affermano che è deprecato, ma come menzionato in un commento in queste domande e
risposte

5

Un'alternativa all'utilizzo PGPASSWORDdella variabile 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=>



-1

Trovo che psql mostri il prompt della password anche se definisci la variabile PGPASSWORD, ma puoi specificare l'opzione -w affinché psql ometta il prompt della password.


-6

Utilizzare -w nel comando: psql -h localhost -p 5432 -U utente -w

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.