it-swarm.com.de

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

Ich versuche, den Datenbankerstellungsprozess mit einem Shell-Skript zu automatisieren, und eine Sache, die ich mit der Übergabe eines Kennworts an psql blockiert habe. 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 nicht interaktive Weise an psql?

Vielen Dank!

260
Alex N.

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. Siehe Abschnitt 30.1 für weitere Informationen.

...

Diese Datei sollte Zeilen des folgenden Formats enthalten:

hostname:port:database:username:password

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

111
Flimzy

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

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

Informationen hierzu 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 URI anzugeben, die den Benutzernamen und das Passwort enthalten kann.

Dies ist ein Sicherheitsrisiko, da das Kennwort in Klartext angezeigt wird, wenn die Befehlszeile eines laufenden Prozesses angezeigt wird, z. Verwendung von ps (Linux), ProcessExplorer (Windows) oder ähnlichen Tools durch andere Benutzer.

Siehe auch diese Frage zu Datenbankadministratoren

479
  • 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")
    
92
user4653174

Ich gebe lieber eine URL an psql weiter:

psql "postgresql://$DB_USER:[email protected]$DB_SERVER/$DB_NAME"

Dadurch kann ich meine Umgebungsvariablen beliebig benennen und unnötige Dateien vermeiden.

Dies erfordert libpq. Die Dokumentation finden Sie hier

33
Jacques Gaudin

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 &&!

23
JAGJ jdfoxito

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

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

Sie können anstelle von Details auch den Platzhalter * Verwenden.

Angenommen, ich wollte tmp.sql Ausführen, ohne nach einem Kennwort zu fragen.

Mit folgendem Code kannst du 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 `        
20
Srini

Inhalt von pg_env.sh zu meinem .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 Zusatz von (gemäß User4653174 Vorschlag)

export PGPASSWORD='password'
2
Rob