Wie gebe ich ein Passwort für 'psql' nicht interaktiv an?

337

Ich versuche, den Datenbankerstellungsprozess mit einem Shell-Skript zu automatisieren, und eines habe ich mit der Übergabe eines Passworts an psql blockiert . Hier ist ein bisschen Code aus dem Shell-Skript:

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

Wie übergebe ich ein Passwort auf psqlnicht interaktive Weise?

Alex N.
quelle
1
Sie können eine Verbindungs-URL verwenden. Überprüfen Sie diese Antworten unter stackoverflow.com/questions/3582552/postgres-connection-url .
Paulodiovani

Antworten:

140

Aus der offiziellen Dokumentation :

Es ist auch praktisch, eine ~ / .pgpass-Datei zu haben, um zu vermeiden, dass regelmäßig Passwörter eingegeben werden müssen. Weitere Informationen finden Sie in Abschnitt 30.13 .

...

Diese Datei sollte Zeilen im folgenden Format enthalten:

hostname:port:database:username:password

Das Kennwortfeld aus der ersten Zeile, das den aktuellen Verbindungsparametern entspricht, wird verwendet.

Schwach
quelle
29
Vielen Dank, mir ist pgpass bekannt, aber das löst das Problem nicht. Ich benötige ein in sich geschlossenes Bash-Skript, um über die Datenbank zu arbeiten. Daher meine Frage zur Übergabe von Informationen an psql über die Befehlszeile.
Alex N.
6
Ich denke, Ihre einzige Möglichkeit besteht darin, eine .pgpass-Datei einzurichten, auf die Ihr Bash-Skript Zugriff hat. Oder verwenden Sie überhaupt keine Kennwörter - Sie können eine andere Form der Authentifizierung einrichten, z. B. ident, oder SSL-Zertifikate verwenden.
Flimzy
Das habe ich befürchtet :) Danke für die Info!
Alex N.
Eine andere Option könnte sein, zu erwarten. Aber ich hasse es wirklich zu erwarten :)
Flimzy
1
Vergessen Sie nicht, die Gruppen- und andere Benutzerberechtigung zum Lesen, Schreiben und Ausführen der .pgpass-Datei zu entfernen! Runchmod go-rwx .pgpass
Vladislavs Dovgalecs
609

Legen Sie die Umgebungsvariable PGPASSWORD im Skript fest, bevor Sie psql aufrufen

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

Eine Referenz finden Sie unter http://www.postgresql.org/docs/current/static/libpq-envars.html


Bearbeiten

Seit Postgres 9.2 besteht auch die Möglichkeit, eine Verbindungszeichenfolge oder einen URI anzugeben , der den Benutzernamen und das Kennwort enthalten kann .

Die Verwendung ist ein Sicherheitsrisiko, da das Kennwort im Klartext psangezeigt wird, wenn andere Benutzer die Befehlszeile eines laufenden Prozesses anzeigen , z. B. mit (Linux), ProcessExplorer (Windows) oder ähnlichen Tools.

Siehe auch diese Frage zu Datenbankadministratoren

ein Pferd ohne Name
quelle
32
Zum Beispiel können Sie in einer Zeile Folgendes tun: PGPASSWORD = pass1234 psql -u MyUsername myUserName
andyortlieb
3
Ich denke, dass dies der bequemste Weg ist, um einfach ein SQL-Skript auszuführen.
zr870
2
Ich kann nur hinzufügen - füge ein spacein der Befehlszeile vor dem ersten Zeichen hinzu und der Befehl wird nicht im Bash-Verlauf gespeichert. Funktioniert für Ubuntu / Bash.
Baldr
5
BONUS: Arbeitet für Docker:docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
Bilal Akil
3
Seien Sie vorsichtig und stellen Sie sicher, dass Sie immer ein vorangestelltes Leerzeichen hinzufügen, da es sonst in Ihrer Bash-Verlaufsdatei ~ / .bash_history angezeigt wird ...
Rogerdpack
102
  • in einer Zeile:

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

    mit Befehl ein SQL-Befehl wie"select * from schema.table"

  • oder besser lesbar:

    export PGPASSWORD='password'
    psql -h 'server name' -U 'user name' -d 'base name' \
         -c 'command' (eg. "select * from schema.table")
    
user4653174
quelle
18
Die eine Zeile kann leicht vereinfacht werden zu: PGPASSWORD='password' psql .... Dies hat auch den Vorteil, dass die Variable nach Ausführung des Befehls nicht mehr zugänglich ist.
Garrett
3
export PGPASSWORD=YourNewPasswordarbeitete für mich über andere Variationen.
Mikeumus
7
export PGPASSWORDklingt nach einer wirklich schlechten Idee
hasen
1
Dadurch wird das Kennwort in der Datei Bash-Verlauf ~ / .bash_history gespeichert (es sei denn, Sie fügen sorgfältig immer ein vorangestelltes Leerzeichen hinzu) und das Kennwort in Ihre aktuelle Umgebung exportiert. FWIW: |
Rogerdpack
66

Ich ziehe es vor, eine URL an psql zu übergeben :

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

Dies gibt mir die Freiheit, meine Umgebungsvariablen nach Belieben zu benennen, und vermeidet das Erstellen unnötiger Dateien.

Dies erfordert libpq. Die Dokumentation finden Sie hier .

Jacques Gaudin
quelle
Kannst du so etwas mit pg_restore verwenden? Vielen Dank!
the_ccalderon
1
@ ccalderon911217 Anscheinend können Sie: stackoverflow.com/a/28359470/1388292
Jacques Gaudin
@ JacquesGaudin yep habe mich getestet! Vielen Dank!
the_ccalderon
26

Unter Windows:

  1. Weisen Sie PGPASSWORD einen Wert zu: C:\>set PGPASSWORD=pass

  2. Führen Sie den Befehl aus: C:\>psql -d database -U user

Bereit

Oder in einer Zeile,

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

Beachten Sie den Platzmangel vor dem &&!

JAGJ jdfoxito
quelle
1
Ich habe das versucht und es hat nicht funktioniert. Wird immer noch nach einem Passwort gefragt.
Antipattern
1
@antipattern Sie müssen auch die Option übergeben -w.
mljrg
1
PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"funktioniert.
Steve Shipway
21

Dies kann durch Erstellen einer .pgpassDatei im Home-Verzeichnis des (Linux-) Benutzers erfolgen. .pgpass Datei Format:

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

Sie können *anstelle von Details auch Platzhalter verwenden.

Angenommen, ich wollte tmp.sqlohne Aufforderung zur Eingabe eines Kennworts ausgeführt werden.

Mit dem folgenden Code können Sie in * .sh Datei

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 `        
Srini
quelle
11
Was ist der Sinn des Echos "` chmod 0600 $ HOME / .pgpass `"? Wie wäre es nur mit chmod 0600 $ HOME / .pgpass?
Vlad Patryshev
12

Eine Alternative zur Verwendung der PGPASSWORDUmgebungsvariablen besteht darin, die conninfoZeichenfolge gemäß der Dokumentation zu verwenden :

Eine alternative Möglichkeit, Verbindungsparameter anzugeben, besteht in einer Conninfo-Zeichenfolge oder einem URI, der anstelle eines Datenbanknamens verwendet wird. Dieser Mechanismus gibt Ihnen eine sehr breite Kontrolle über die Verbindung.

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

postgres=>
ubi
quelle
danke, es hat gut für mich
funktioniert
4

Inhalt von pg_env.sh zu meiner .bashrc hinzugefügt:

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

mit Hinzufügung von (gemäß user4653174 Vorschlag)

export PGPASSWORD='password'
rauben
quelle