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?
Lesen Sie weiter, die besten Optionen kommen als letzte . Aber lassen Sie uns zuerst ein paar Dinge klären.
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. (...)
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.conf
festgelegt 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 zulocalhost
her, 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 Netzblock127.0.0.0/8
(Loopback) übersetzt, normalerweise127.0.0.1
oder::1
in IPv6.
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.
... 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
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 ).
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
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 (Hostnamelocalhost
) 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.
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:
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.