PostgreSQL: Scripting PSQL-uitvoering met wachtwoord

Hoe kan ik psql bellen, zodat het niet vraagt ​​om een ​​wachtwoord ?

Dit is wat ik heb:

psql -Umyuser < myscript.sql

Ik kon echter niet het argument vinden dat het wachtwoord passeert, en dus prompt PSQL er altijd voor.


Antwoord 1, Autoriteit 100%

Mogelijk wilt u een samenvatting lezen van de manieren om te authenticeren aan PostgreSQL .

Om uw vraag te beantwoorden, zijn er verschillende manieren om een ​​wachtwoord te bieden voor wachtwoordgerichte authenticatie:

  1. Via het wachtwoord Prompt . Voorbeeld:

    psql -h uta.biocommons.org -U foo
    Password for user foo: 
    
  2. in een PGPass-bestand . Zie libpq-pgpass . Formaat:

    <host>:<port>:<database>:<user>:<password>
    
  3. met de PGPASSWORDMilieuvariabele . Zie libpq-envars . Voorbeeld:

    export PGPASSWORD=yourpass
    psql ...
    # Or in one line for this invocation only:
    PGPASSWORD=yourpass psql ...
    
  4. In de verbindingsreeksHet wachtwoord en andere opties kunnen worden opgegeven in de verbindingsreeks/URI. Zie app-psql. Voorbeeld:

    psql postgresql://username:password@dbmaster:5433/mydb?sslmode=require
    

Antwoord 2, autoriteit 48%

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

Antwoord 3, autoriteit 19%

U kunt deze opdrachtregel aan het begin van uw script toevoegen:

set PGPASSWORD=[your password]

Antwoord 4, autoriteit 14%

Dit is misschien een oude vraag, maar er is een alternatieve methode die niemand heeft genoemd. Het is mogelijk om het wachtwoord rechtstreeks in de verbindings-URI op te geven. De documentatie is hierte vinden, of hier.

U kunt uw gebruikersnaam en wachtwoord rechtstreeks opgeven in de verbindings-URI die is verstrekt aan psql:

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

Antwoord 5, autoriteit 14%

Als u van plan bent meerdere hosts/database-verbindingen te hebben, kunt u de ~/ .pgpass-bestandis de juiste keuze.

Stappen:

  1. Maak het bestand met vim ~/.pgpassof vergelijkbaar. Voer uw informatie in het volgende formaat in:
    hostname:port:database:username:passwordVoeg geen stringcitaten toe rond uw veldwaarden. U kunt ook * als een jokerteken voor uw poort / databasevelden gebruiken.
  2. U moet chmod 0600 ~/.pgpassom niet stil te worden genegeerd door PSQL.
  3. Maak een alias in uw BASH-profiel dat uw PSQL-opdracht voor u uitvoert. Bijvoorbeeld: alias postygresy='psql --host hostname database_name -U username'De waarden moeten overeenkomen met die die u hebt ingevoerd naar het ~ / .pgpass-bestand.
  4. Bron uw bashprofiel met . ~/.bashrcof vergelijkbaar.
  5. Typ uw alias van de opdrachtregel.

Merk op dat als u een Variable Set van PGPassword = ” ” ” ‘hebt over het bestand.


Antwoord 6, Autoriteit 4%

Als u problemen ondervindt op Windows zoals ME (ik gebruik Windows 7 64-bit) en set PGPASSWORD=[Password]Werkte niet.

Toen, zoals Kavaklioglu zei in een van de opmerkingen,

export PGPASSWORD=[password]

U moet dit bovenaan het bestand opslaan of vóór elk gebruik, zodat het is ingesteld voordat u wordt genoemd.

werkt zeker op Windows 🙂


Antwoord 7, Autoriteit 3%

U moet een wachtwoordbestand maken: zie http: // www .postgresql.org / docs / 9.0 / interactief / libpq-pgpass.html voor meer informatie.


Antwoord 8, Autoriteit 3%

Een alternatief voor het gebruik van PGPASSWORDMilieuvariabele is het gebruik conninfostring volgens de Documentatie

Een alternatieve manier om verbindingsparameters op te geven, is in een Conninfo
string of een URI, die wordt gebruikt in plaats van een database-naam. Dit
Mechanisme geeft u een zeer brede controle over de verbinding.

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

Antwoord 9, Autoriteit 2%

Gezien de beveiligingsproblemen over het gebruik van de Variabele PGPassword-omgeving, denk ik dat de beste algemene oplossing als volgt is:

  1. Schrijf uw eigen tijdelijke PGPASS-bestand met het wachtwoord dat u wilt gebruiken.
  2. Gebruik de variabele PGPASSFILE-omgeving om PSQL te vertellen om dat bestand te gebruiken.
  3. Verwijder het tijdelijke PGPASS-bestand

Er zijn hier een paar punten van opmerking. Stap 1 is er om mucking te voorkomen met het ~ / .pgpass-bestand van de gebruiker. U moet ook ervoor zorgen dat het bestand machtigingen 0600 of minder heeft.

Sommigen hebben voorgesteld gebruik te maken van BASH om dit te snellen als volgt:

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

Hiermee gebruikt u de syntaxis van & LT; () om te voorkomen dat u de gegevens naar een feitelijk bestand kunt schrijven. Maar het werkt niet omdat PSQL controleert welk bestand wordt gebruikt en zal een fout gooien als volgt:

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

Antwoord 10, Autoriteit 2%

het kan eenvoudig worden gedaan met behulp van PGPassword. Ik gebruik PSQL 9.5.10. In uw geval zou de oplossing

zijn

PGPASSWORD=password psql -U myuser < myscript.sql


Antwoord 11

Voortbouwend op mightybyte’s antwoordvoor degenen die niet vertrouwd zijn met *nixshell-scripting , hier is een werkend script:

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

Het dubbele dollarteken ($$) in /tmp/pgpasswd$$op regel 2 voegt het proces-ID-nummer toe aan de bestandsnaam, zodat dit script meer dan eens worden uitgevoerd, zelfs gelijktijdig, zonder bijwerkingen.

Let op het gebruik van het chmod-commando op regel 4 – net als de “not a plain file“-fout die mightybytebeschreef, is er ook een “permissions“-fout als dit niet wordt gedaan.

Op regel 7 hoeft u de -hmijnserver, de -pmijnpoort, of -Ujdoevlag als u de standaardinstellingen gebruikt (localhost: 5432) en slechts één database heeft gebruiker. Wijzig voor meerdere gebruikers (maar de standaardverbinding) die regel in

psql mydb jdoe

Vergeet niet om het script uitvoerbaarte maken met

chmod +x runpsql(of hoe je het scriptbestand ook hebt genoemd)

UPDATE:

Ik heb het advies van RichVelopgevolgd en het bestand onleesbaar gemaakt voordathet wachtwoord erin heeft gezet. Dat sluit een klein veiligheidsgat.
Bedankt!


Antwoord 12

U kunt dit nuttig vinden: Windows PSQL-opdrachtregel: is er een manier om wachtwoordloze aanmelding toe te staan?


Antwoord 13

8 jaar later …

Op mijn Mac moest ik een regel in het bestand plaatsen
~/.pgpasszoals:

<IP>:<PORT>:<dbname>:<user>:<password>

Zie ook:
https://www.postgresql.org/docs/current/libpq-pgpass. html
https://wiki.postgresql.org/wiki/pgpass


Antwoord 14

Dit werkt ook voor andere PostGresql CLI’s, bijvoorbeeld kunt u PGBEch in niet-interactieve modus uitvoeren.

export PGPASSWORD=yourpassword
/usr/pgsql-9.5/bin/pgbench -h $REMOTE_PG_HOST -p 5432 -U postgres -c 12 -j 4 -t 10000 example > pgbench.out 2>&1 &

Antwoord 15

Ik vind, dat PSQL-wachtwoordprompt weergeeft, zelfs u definieert PGPASSWORD-variabele, maar u kunt -W-optie voor PSQL opgeven om het wachtwoord aan te laten.


Antwoord 16

Gebruik -W in de opdracht:
PSQL -H Localhost-P 5432 -U-gebruiker -W

Other episodes