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 psql
nicht interaktive Weise?
bash
postgresql
command-line
Alex N.
quelle
quelle
Antworten:
Aus der offiziellen Dokumentation :
...
quelle
chmod go-rwx .pgpass
Legen Sie die Umgebungsvariable PGPASSWORD im Skript fest, bevor Sie psql aufrufen
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
ps
angezeigt 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
quelle
space
in der Befehlszeile vor dem ersten Zeichen hinzu und der Befehl wird nicht im Bash-Verlauf gespeichert. Funktioniert für Ubuntu / Bash.docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
in einer Zeile:
mit Befehl ein SQL-Befehl wie
"select * from schema.table"
oder besser lesbar:
quelle
PGPASSWORD='password' psql ....
Dies hat auch den Vorteil, dass die Variable nach Ausführung des Befehls nicht mehr zugänglich ist.export PGPASSWORD=YourNewPassword
arbeitete für mich über andere Variationen.export PGPASSWORD
klingt nach einer wirklich schlechten IdeeIch ziehe es vor, eine URL an psql zu übergeben :
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 .quelle
Unter Windows:
Weisen Sie PGPASSWORD einen Wert zu:
C:\>set PGPASSWORD=pass
Führen Sie den Befehl aus:
C:\>psql -d database -U user
Bereit
Oder in einer Zeile,
Beachten Sie den Platzmangel vor dem &&!
quelle
-w
.PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"
funktioniert.Dies kann durch Erstellen einer
.pgpass
Datei im Home-Verzeichnis des (Linux-) Benutzers erfolgen..pgpass
Datei Format:Sie können
*
anstelle von Details auch Platzhalter verwenden.Angenommen, ich wollte
tmp.sql
ohne Aufforderung zur Eingabe eines Kennworts ausgeführt werden.Mit dem folgenden Code können Sie in * .sh Datei
quelle
Eine Alternative zur Verwendung der
PGPASSWORD
Umgebungsvariablen besteht darin, dieconninfo
Zeichenfolge gemäß der Dokumentation zu verwenden :quelle
Inhalt von pg_env.sh zu meiner .bashrc hinzugefügt:
mit Hinzufügung von (gemäß user4653174 Vorschlag)
quelle