it-swarm.com.de

Führen Sie die Batchdatei mit dem Befehl psql ohne Kennwort aus

Ich versuche diesen psql-Befehl mit einem Batch-Skript auszuführen:

psql --Host=localhost --dbname=<dbname> --port=<Port Number>
     --username=<dbuser> --file=C:\PSQL_Script.txt --output=C:\PSQL_Output.txt

Das Problem ist, dass bei jeder Ausführung des Batch-Skripts das Kennwort abgefragt wird. Wie kann ich ein Passwort über die Batchdatei eingeben?

22
shabu 224

Lesen Sie weiter, die besten Optionen kommen als letzte . Aber lassen Sie uns zuerst ein paar Dinge klären.

Bringen Sie nur die Kennwortanforderung zum Schweigen

Wenn es sich bei Ihrem Problem nur um die Aufforderung zur Kennworteingabe handelt, können Sie sie stummschalten. Ich zitiere das Handbuch hier :

-w
--no-password

Geben Sie niemals eine Passwortabfrage ein. Wenn der Server eine Kennwortauthentifizierung erfordert und ein Kennwort nicht auf andere Weise verfügbar ist, z. B. durch eine .pgpass-Datei, schlägt der Verbindungsversuch fehl. Diese Option kann bei Stapeljobs und Skripten hilfreich sein, bei denen kein Benutzer zur Eingabe eines Kennworts anwesend ist. (...)

Sie brauchen wahrscheinlich kein Passwort

Normalerweise ist dies nicht erforderlich. Der Standard-Datenbank-Superuser postgres entspricht normalerweise dem gleichnamigen Systembenutzer. Für die Ausführung von psql über dieses Konto ist kein Kennwort erforderlich, wenn die Authentifizierungsmethodepeer oder ident in Ihrer Dateipg_hba.conffestgelegt ist. Sie haben wahrscheinlich eine Zeile wie diese:

local    all    postgres    peer

Und normalerweise auch:

local    all    all         peer

Dies bedeutet, dass sich jeder lokale Benutzer ohne Passwort bei einer all Datenbank als gleichnamiger Datenbankbenutzer anmelden kann.
Allerdings gibt es hier ein weit verbreitetes Missverständnis. Wieder zitieren :

Diese Methode wird nur für lokale Verbindungen unterstützt.

Meine kühne Betonung.
Sie stellen eine Verbindung zulocalhosther, das keine "lokale Verbindung" ist, obwohl es das Wort "local" enthält. Es ist eine TCP/IP-Verbindung zu 127.0.0.1. Wikipedia auf localhost :

Auf modernen Computersystemen wird localhost als Hostname in eine IPv4-Adresse im Netzblock 127.0.0.0/8 (Loopback) übersetzt, normalerweise 127.0.0.1 oder ::1 in IPv6.

Einfache Lösung für lokale Verbindungen

Lassen Sie den Parameter -h aus dem Aufruf psql weg. Zitat des Handbuchs zu psql noch einmal:

Wenn Sie den Hostnamen weglassen, verbindet sich psql über einen Unix-Domain-Socket mit einem Server auf dem lokalen Host oder über TCP/IP mit localhost auf Rechnern ohne Unix-Domain-Sockets.

Windows

... hat keine Unix-Domain-Sockets, pg_hba.conf-Zeilen, die mit local beginnen, sind unter Windows nicht anwendbar. Unter Windows erfolgt die Verbindung standardmäßig über localhost, wodurch wir zum Start zurückkehren.

Wenn Ihre Sicherheitsanforderungen nachlassen, können Sie einfach allen Verbindungen über localhost vertrauen:

Host    all    all    127.0.0.1/32     trust

Ich würde das nur zum Debuggen mit deaktivierten Remoteverbindungen tun. Für mehr Sicherheit können Sie SSPI-Authentifizierung unter Windows verwenden. Fügen Sie diese Zeile zu pg_hba.conf für "lokale" Verbindungen hinzu:

Host    all    all    127.0.0.1/32     sspi

Wenn Sie tatsächlich ein Passwort benötigen

Sie könnten eine Umgebungsvariable setzen, aber dies ist nicht empfehlenswert , insbesondere für Windows. Das Handbuch:

PGPASSWORD verhält sich wie der Verbindungsparameter password . Die Verwendung dieser Umgebungsvariablen wird aus Sicherheitsgründen nicht empfohlen, da einige Betriebssysteme es Nicht-Root-Benutzern ermöglichen, Prozessumgebungsvariablen über ps anzuzeigen. Verwenden Sie stattdessen die Datei ~/.pgpass (siehe Abschnitt 32.15 ).

Das Handbuch zu psql :

Eine conninfo Zeichenfolge ist eine Alternative zum Angeben von Verbindungsparametern:

 $ psql "user=myuser password=secret_pw Host=localhost port=5432 sslmode=require"

Oder ein URI , das anstelle eines Datenbanknamens verwendet wird:

 $ psql postgresql://myuser:[email protected]:5432/mydb?sslmode=require

Kennwortdatei

In der Regel ist es jedoch vorzuziehen, eine .pgpass -Datei einzurichten, anstatt Kennwörter in Skriptdateien einzufügen.
Lesen Sie das kurze Kapitel im Handbuch sorgfältig durch . Beachten Sie insbesondere, dass hier ...

Ein Hostname von localhost entspricht sowohl TCP (Hostname localhost) als auch Unix-Domain-Socket-Verbindungen (pghost leer oder dem Standard-Socket-Verzeichnis) vom lokalen Computer.

Der genaue Pfad hängt vom System ab. In dieser Datei können Kennwörter für mehrere Kombinationen von Rolle und Port (DB-Cluster) gespeichert werden:

localhost:5432:*:myadmin:myadminPasswd
localhost:5434:*:myadmin:myadminPasswd
localhost:5437:*:myadmin:myadminPasswd
...

Auf Windows Maschinen suchen Sie nach der Datei in:

%APPDATA%\postgresql\pgpass.conf

%APPDATA% wird normalerweise in C:\Documents and Settings\My_Windows_User_Name\Application Data\ aufgelöst.

45

Ich hatte irgendwie dasselbe Problem:

psql -hlocalhost -d<myDB> -U<myUser>

ich habe immer nach einem Passwort gefragt. Dies ist, wie @Erwin erklärt, weil -hlocalhost eine Verbindung über TCP und nicht über den Unix-Domain-Socket (für Unix-basiertes Betriebssystem) herstellt. Auch wenn Sie Ihre local als vertrauenswürdig konfiguriert haben:

local   all    all                     trust

es wird immer noch nach Kennwort gefragt. Um den -hlocalhost so zu konfigurieren, dass er durch TCP funktioniert, musste ich die Host für localhost-Adressen wie folgt konfigurieren:

Host    all    all    127.0.0.1/32     trust
Host    all    all    ::1/128          trust

Aber das hat bei mir nicht funktioniert. Was ich tun musste, war die Kombination aus beiden:

Host    all    all    localhost        trust

Einige zusätzliche Lesungen:

2
nyxz

postgres-Dokumentation - https://www.postgresql.org/docs/9.6/static/app-psql.html

-w -- kein Kennwort Niemals ein Kennwort eingeben. Wenn der Server eine Kennwortauthentifizierung erfordert und ein Kennwort auf andere Weise nicht verfügbar ist, z. B. eine .pgpass-Datei, schlägt der Verbindungsversuch fehl. Diese Option kann bei Stapeljobs und Skripts nützlich sein, bei denen kein Benutzer anwesend ist, um ein Kennwort einzugeben.

0
Darshana Patel