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.
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.
Risposte:
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 PGPASSWORD
variabile 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 ...
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
Puoi aggiungere questa riga di comando all'inizio del tuo script:
set PGPASSWORD=[your password]
export PGPASSWORD=[password]
ha funzionato
#!/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
PGPASSWORD=password
.
Se si intende disporre di più connessioni host / database, il file ~ / .pgpass è la strada da percorrere.
passi:
vim ~/.pgpass
o simili. Immettere le informazioni nel seguente formato:
hostname:port:database:username:password
non aggiungere virgolette attorno ai valori dei campi. È inoltre possibile utilizzare * come carattere jolly per i campi della porta / del database.chmod 0600 ~/.pgpass
in modo che non venga silenziosamente ignorato da psql.alias postygresy='psql --host hostname database_name -U username'
i valori devono corrispondere a quelli immessi nel file ~ / .pgpass.. ~/.bashrc
o simili.Notare che se si imposta una variabile PGPASSWORD = '' di esportazione, avrà la precedenza sul file.
chmod 600
file, altrimenti psql
lo ignorerai silenziosamente (secondo i documenti).
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
PGPASSWORD
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 :)
export PGPASSWORD=[password]
non funziona affatto con la riga di comando (cmd.exe). Sei sicuro di non utilizzare Cygwin o qualcosa di simile?
Devi creare un file di password: vedi http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html per maggiori informazioni.
Date le preoccupazioni di sicurezza sull'uso della variabile d'ambiente PGPASSWORD, penso che la migliore soluzione complessiva sia la seguente:
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
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 chmod
comando 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 -h
myserver , il -p
myport o il flag -U
jdoe 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!
mktemp
per creare un file temporaneo invece di elaborare il proprio schema di denominazione. Crea un nuovo file temporaneo (chiamato in modo simile /tmp/tmp.ITXUNYgiNh
a Linux e /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4
su MacOS X) e stampa il suo nome su stdout.
chmod 600
dopo 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 trap
gestore shell lo risolverà. Dato che non è banale scrivere uno script sicuro come questo, consiglio export PGPASSWORD
invece di usarlo .
PGPASSWORD
è stato deprecato in 9.3.
Un'alternativa all'utilizzo PGPASSWORD
della variabile d'ambiente è usare la conninfo
stringa 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=>
Questo potrebbe essere utile: riga di comando PSQL di Windows: esiste un modo per consentire l'accesso senza password?
8 anni dopo ...
Sul mio mac, ho dovuto inserire una riga nel file
~/.pgpass
come:
<IP>:<PORT>:<dbname>:<user>:<password>
Vedi anche:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
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.