PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Esegui il file batch con il comando psql senza password

Continua a leggere, le le migliori opzioni vengono per ultime . Ma prima chiariamo un paio di cose.

Silenzia solo la richiesta della password

Se il tuo problema è solo la richiesta della password, puoi silenziarlo. Cito il manuale qui:

-w
--no-password

Non emettere mai una richiesta di password. Se il server richiede l'autenticazione della password e una password non è disponibile con altri mezzi come .pgpass file, il tentativo di connessione avrà esito negativo. Questa opzione può essere utile nei processi batch e negli script in cui non è presente alcun utente per immettere una password. (...)

Probabilmente non hai bisogno di una password

Normalmente questo non è necessario. Il superutente predefinito del database postgres di solito corrisponde all'utente di sistema con lo stesso nome. Esecuzione di psql da questo account non richiede una password se il metodo di autenticazione peer o ident sono impostati nel tuo pg_hba.conf file. Probabilmente hai una linea come questa:

local    all    postgres    peer

E di solito anche:

local    all    all         peer

Ciò significa che ogni locale l'utente può accedere a un tutti database come utente del database con lo stesso nome senza password.
Comunque , c'è un malinteso comune qui. Citando ancora:

Questo metodo è supportato solo su connessioni locali .

Enfasi in grassetto la mia.
Ti stai connettendo a localhost , che non è una "connessione locale" , anche se contiene la parola "locale". È una connessione TCP/IP a 127.0.0.1. Wikipedia su localhost:

Sui moderni sistemi informatici, localhost come nome host si traduce in un indirizzo IPv4 nel 127.0.0.0/8 (loopback) net block, solitamente 127.0.0.1 o ::1 in IPv6.

Soluzione semplice per le connessioni locali

Ometti il ​​parametro -h dal psql invocazione. Citando il manuale su psql ancora una volta:

Se ometti il ​​nome host, psql si connetterà tramite un socket di dominio Unix a un server sull'host locale o tramite TCP/IP a localhost su macchine che non hanno socket di dominio Unix.

Finestre

... non ha socket di dominio Unix, pg_hba.conf righe che iniziano con local non sono applicabili su Windows. Su Windows ti connetti tramite localhost di default, il che ci riporta all'inizio.

Se i tuoi requisiti di sicurezza sono permissivi, puoi semplicemente fidarti di tutte le connessioni tramite localhost :

host    all    all    127.0.0.1/32     trust

Lo farei solo per il debug con le connessioni remote disattivate. Per un po' di sicurezza in più puoi usare l'autenticazione SSPI su Windows. Aggiungi questa riga a pg_hba.conf per connessioni "locali":

host    all    all    127.0.0.1/32     sspi

Se hai effettivamente bisogno di una password

Potresti imposta una variabile d'ambiente , ma questo è scoraggiato , soprattutto per Windows. Il manuale:

PGPASSWORD si comporta come il parametro di connessione della password. L'uso di questa variabile d'ambiente non è raccomandato per motivi di sicurezza, poiché alcuni sistemi operativi consentono agli utenti non root di vedere le variabili d'ambiente di processo tramite ps; considera invece l'utilizzo di ~/.pgpass file (vedi Sezione 32.15).

Il manuale su psql :

Un conninfo string è un'alternativa per specificare i parametri di connessione:

 $ psql "user=myuser password=secret_pw host=localhost port=5432 sslmode=require"

O un URI , che viene utilizzato al posto del nome di un database:

 $ psql postgresql://myuser:[email protected]:5432/mydb?sslmode=require

File password

Ma di solito è preferibile impostare un .pgpass file piuttosto che inserire le password nei file di script.
Leggere attentamente il breve capitolo del manuale. In particolare, si noti che qui ...

Un nome host di localhost corrisponde a entrambi TCP (nome host localhost ) e socket di dominio Unix (pghost vuota o la directory socket predefinita) connessioni provenienti dalla macchina locale.

Il percorso esatto dipende dal sistema. Questo file può memorizzare le password per più combinazioni di ruolo e porta (cluster di database):

localhost:5432:*:myadmin:myadminPasswd
localhost:5434:*:myadmin:myadminPasswd
localhost:5437:*:myadmin:myadminPasswd
...

Su Windows le macchine cercano il file in:

%APPDATA%\postgresql\pgpass.conf

%APPDATA% in genere si risolve in:C:\Documents and Settings\My_Windows_User_Name\Application Data\ .