it-swarm.com.de

Postgresql: Scripting der psql-Ausführung mit Passwort

Wie kann ich psql aufrufen, damit es nicht zur Eingabe eines Passworts auffordert?

Das habe ich:

psql -Umyuser < myscript.sql

Ich konnte jedoch das Argument nicht finden, das das Kennwort übergibt, und daher fordert psql immer zur Eingabe auf.

246
Axel Fontaine

Es gibt verschiedene Möglichkeiten, sich bei PostgreSQL zu authentifizieren. Möglicherweise möchten Sie Alternativen zur Kennwortauthentifizierung unter https://www.postgresql.org/docs/current/static/client-authentication.html untersuchen.

Um Ihre Frage zu beantworten, gibt es verschiedene Möglichkeiten, ein Kennwort für die kennwortbasierte Authentifizierung bereitzustellen. Der offensichtliche Weg ist über das Passwort Prompt. Stattdessen können Sie das Kennwort in einer pgpass-Datei oder über die Umgebungsvariable PGPASSWORD angeben. Siehe diese:

Es gibt keine Möglichkeit, das Kennwort als Befehlszeilenargument anzugeben, da diese Informationen häufig allen Benutzern zur Verfügung stehen und daher unsicher sind. In Linux/Unix-Umgebungen können Sie jedoch eine Umgebungsvariable für einen einzelnen Befehl wie diesen bereitstellen:

PGPASSWORD=yourpass psql ...
283
Reece
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
149
Greg

Sie können diese Befehlszeile am Anfang Ihres Skripts hinzufügen:

set PGPASSWORD=[your password]
65
jbaylina

Wenn Sie mehrere Hosts/Datenbankverbindungen haben möchten, ist die ~/.pgpass-Datei der richtige Weg.

Schritte:

  1. Erstellen Sie die Datei mit vim ~/.pgpass oder ähnliches. Geben Sie Ihre Informationen in folgendem Format ein: hostname:port:database:username:password Fügen Sie Ihre Feldwerte nicht in Anführungszeichen ein. Sie können * auch als Platzhalter für Ihre Port-/Datenbankfelder verwenden.
  2. Sie müssen chmod 0600 ~/.pgpass, damit es von psql nicht unbemerkt ignoriert wird.
  3. Erstellen Sie in Ihrem Bash-Profil einen Alias, der Ihren psql-Befehl für Sie ausführt. Zum Beispiel:alias postygresy='psql --Host hostname database_name -U username' Die Werte sollten mit denen übereinstimmen, die Sie in die Datei ~/.pgpass eingegeben haben.
  4. Beschreibe dein Bash-Profil mit . ~/.bashrc oder ähnliches.
  5. Geben Sie Ihren Alias ​​über die Befehlszeile ein.

Beachten Sie, dass, wenn Sie eine Exportvariable PGPASSWORD = '' festgelegt haben, diese Datei Vorrang hat.

47
tandy

Dies mag eine alte Frage sein, aber es gibt eine alternative Methode, die Sie verwenden können, die niemand erwähnt hat. Es ist möglich, das Passwort direkt in der Verbindungs-URI anzugeben. Die Dokumentation finden Sie hier , alternativ hier .

Sie können Ihren Benutzernamen und Ihr Passwort direkt in der Verbindungs-URI angeben, die psql bereitgestellt wird:

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

Sie müssen eine Kennwortdatei erstellen: Weitere Informationen finden Sie unter http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html .

12
Femi

Wenn Sie unter Windows wie mir Probleme haben (ich verwende Windows 7 64-Bit) und set PGPASSWORD=[Password] funktioniert nicht.

Dann, wie Kavaklioglu in einem der Kommentare sagte,

export PGPASSWORD=[password]

Sie müssen dies am Anfang der Datei oder vor jeder Verwendung speichern, damit es festgelegt wird, bevor Sie aufgerufen werden.

Funktioniert auf jeden Fall unter Windows :)

12
Jamie Hutber

Angesichts der Sicherheitsbedenken hinsichtlich der Verwendung der Umgebungsvariablen PGPASSWORD ist meines Erachtens die beste Gesamtlösung wie folgt:

  1. Schreiben Sie Ihre eigene temporäre pgpass-Datei mit dem Passwort, das Sie verwenden möchten.
  2. Verwenden Sie die Umgebungsvariable PGPASSFILE, um psql anzuweisen, diese Datei zu verwenden.
  3. Entfernen Sie die temporäre pgpass-Datei

Hier gibt es ein paar wichtige Punkte. Schritt 1 soll verhindern, dass die möglicherweise vorhandene ~/.pgpass-Datei des Benutzers verwechselt wird. Sie müssen auch sicherstellen, dass die Datei über Berechtigungen von 0600 oder weniger verfügt.

Einige haben vorgeschlagen, Bash zu nutzen, um dies wie folgt zu verkürzen:

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

Hierbei wird die Syntax <() verwendet, um zu vermeiden, dass die Daten in eine tatsächliche Datei geschrieben werden müssen. Aber es funktioniert nicht, weil psql prüft, welche Datei verwendet wird und einen Fehler wie diesen ausgibt:

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

Dies kann einfach mit PGPASSWORD erfolgen. Ich benutze psql 9.5.10. In Ihrem Fall wäre die Lösung

PGPASSWORD=password psql -U myuser < myscript.sql

6
pyAddict

Aufbauend auf Antwort von mightybyte für diejenigen, die mit * nix Shell-Skripten nicht vertraut sind, ist hier ein funktionierendes Skript:

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

Das doppelte Dollarzeichen ($$) im /tmp/pgpasswd$$ in Zeile 2 hängt die Prozess-ID-Nummer an den Dateinamen an, sodass dieses Skript mehrmals ausgeführt werden kann, auch gleichzeitig, ohne Nebenwirkungen.

Beachten Sie die Verwendung des Befehls chmod in Zeile 4 - genau wie der Fehler " keine einfache Datei", bei dem ein mächtiges Byte beschrieben, gibt es auch einen " Berechtigungen" Fehler, wenn dies nicht getan wird.

In Zeile 7 müssen Sie nicht das -h myserver, der -p myport oder -U jdoe Flag, wenn Sie die Standardeinstellungen verwenden ( localhost: 5432) und nur einen Datenbankbenutzer haben. Ändern Sie diese Zeile für mehrere Benutzer (aber die Standardverbindung) in

psql mydb jdoe

Vergessen Sie nicht, das Skript ausführbar zu machen mit

chmod +x runpsql ( oder wie auch immer du das Skript genannt hast)

UPDATE:

Ich habe den Rat von RichVel befolgt und die Datei unleserlich gemacht davor das Passwort eingegeben. Das schließt eine kleine Sicherheitslücke. Vielen Dank!

5
2

8 Jahre später ...

Auf meinem Mac musste ich eine Zeile in die Datei einfügen ~/.pgpass mögen:

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

Siehe auch:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass

0
Dirk Schumacher