Wie kann ich psql aufrufen , damit kein Passwort abgefragt wird ?
Das habe ich:
psql -Umyuser < myscript.sql
Ich konnte jedoch das Argument nicht finden, das das Kennwort übergibt, und daher fordert psql immer dazu auf.
postgresql
psql
Axel Fontaine
quelle
quelle
Antworten:
Es gibt verschiedene Möglichkeiten, sich bei PostgreSQL zu authentifizieren. Möglicherweise möchten Sie unter https://www.postgresql.org/docs/current/static/client-authentication.html nach Alternativen zur Kennwortauthentifizierung suchen .
Um Ihre Frage zu beantworten, gibt es verschiedene Möglichkeiten, ein Kennwort für die kennwortbasierte Authentifizierung bereitzustellen. Der naheliegende Weg ist über die Passwortabfrage. Stattdessen können Sie das Kennwort in einer pgpass-Datei oder über die
PGPASSWORD
Umgebungsvariable angeben . Siehe diese:Es gibt keine Option, 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 den folgenden bereitstellen:
quelle
quelle
Sie können diese Befehlszeile zu Beginn Ihres Skripts hinzufügen:
quelle
export PGPASSWORD=[password]
aber funktioniert#!/bin/sh set PGPASSWORD = postgres psql -h 192.168.3.200 -U postgres incx_um << EOF DELETE FROM usrmgt.user_one_time_codes WHERE time < NOW() - INTERVAL '30 minute' EOF
PGPASSWORD=password
.Wenn Sie mehrere Hosts / Datenbankverbindungen haben möchten, ist die Datei ~ / .pgpass der richtige Weg.
Schritte:
vim ~/.pgpass
oder ähnlich. Geben Sie Ihre Informationen im folgenden Format ein:hostname:port:database:username:password
Fügen Sie keine Zeichenfolgen um Ihre Feldwerte ein. Sie können * auch als Platzhalter für Ihre Port- / Datenbankfelder verwenden.chmod 0600 ~/.pgpass
, damit es von psql nicht stillschweigend ignoriert wird.alias postygresy='psql --host hostname database_name -U username'
Die Werte sollten mit denen übereinstimmen, die Sie in die Datei ~ / .pgpass eingegeben haben.. ~/.bashrc
oder ähnlich ein.Beachten Sie, dass eine Exportvariable PGPASSWORD = '' Vorrang vor der Datei hat.
quelle
chmod 600
Datei bearbeiten, andernfallspsql
wird sie stillschweigend ignoriert (gemäß den Dokumenten).Dies mag eine alte Frage sein, aber es gibt eine alternative Methode, die Sie verwenden können und 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 für Folgendes bereitgestellt wird
psql
:quelle
PGPASSWORD
Wenn Sie Probleme unter Windows wie mir haben (ich verwende Windows 7 64-Bit) und
set PGPASSWORD=[Password]
nicht funktioniert haben.Dann, wie Kavaklioglu in einem der Kommentare sagte,
Sie müssen dies oben in der Datei oder vor jeder Verwendung speichern, damit es vor dem Aufruf festgelegt wird.
Funktioniert sicherlich unter Windows :)
quelle
export PGPASSWORD=[password]
funktioniert bei mir überhaupt nicht über die Kommandozeile (cmd.exe). Bist du sicher, dass du kein Cygwin oder ähnliches benutzt hast?Sie müssen eine Kennwortdatei erstellen: Weitere Informationen finden Sie unter http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html .
quelle
Angesichts der Sicherheitsbedenken hinsichtlich der Verwendung der Umgebungsvariablen PGPASSWORD denke ich, dass die beste Gesamtlösung folgende ist:
Hier gibt es einige wichtige Punkte. Schritt 1 ist da, um zu vermeiden, dass die ~ / .pgpass-Datei des Benutzers, die möglicherweise vorhanden ist, durcheinander gebracht wird. Sie müssen auch sicherstellen, dass die Datei die Berechtigungen 0600 oder weniger hat.
Einige haben vorgeschlagen, Bash zu nutzen, um dies wie folgt zu verknüpfen:
Hierbei wird die Syntax <() verwendet, um zu vermeiden, dass die Daten in eine tatsächliche Datei geschrieben werden müssen. Dies funktioniert jedoch nicht, da psql überprüft, welche Datei verwendet wird, und einen Fehler wie den folgenden auslöst:
quelle
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
quelle
Aufbauend auf der Antwort von mächtigen Byte für diejenigen, die mit * nix Shell- Skripten nicht vertraut sind , ist hier ein funktionierendes Skript:
Das doppelte Dollarzeichen (
$$
) in/tmp/pgpasswd$$
Zeile 2 hängt die Prozess-ID-Nummer an den Dateinamen an, sodass dieses Skript mehr als einmal und sogar gleichzeitig ohne Nebenwirkungen ausgeführt werden kann.Beachten Sie die Verwendung des
chmod
Befehls in Zeile 4 - genau wie der Fehler " Keine einfache Datei ", der möglicherweise beschrieben wird, gibt es auch einen Fehler " Berechtigungen ", wenn dies nicht erfolgt.In Zeile 7 müssen Sie nicht das
-h
Flag myserver ,-p
myport oder-U
jdoe verwenden, wenn Sie die Standardeinstellungen ( localhost : 5432 ) verwenden und nur einen Datenbankbenutzer haben. Ändern Sie für mehrere Benutzer (aber die Standardverbindung) diese Zeile inVergessen Sie nicht, das Skript mit ausführbar zu machen
AKTUALISIEREN:
Ich habe den Rat von RichVel befolgt und die Datei unlesbar gemacht, bevor ich das Passwort eingegeben habe. Das schließt eine kleine Sicherheitslücke. Vielen Dank!
quelle
mktemp
eine temporäre Datei erstellen, anstatt ein eigenes Namensschema zu erstellen. Es erstellt eine neue temporäre Datei (etwa/tmp/tmp.ITXUNYgiNh
unter Linux und/var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4
MacOS X) und druckt ihren Namen in stdout.chmod 600
nach dem Erstellen der Datei zu tun , aber bevor Sie das Kennwort darauf schreiben. Wie geschrieben, könnte ein bösartiges Skript auf dem Server ständig versuchen, Dateien dieses Formats zu lesen, und manchmal gelang es ihm, das Kennwort zu erhalten. Wenn dieses Skript aus irgendeinem Grund unterbrochen wird, bleibt die Datei auf der Festplatte - das Schreiben eines Shell-trap
Handlers würde dies beheben. Da es nicht trivial ist, ein sicheres Skript wie dieses zu schreiben, empfehle ich stattdessen die Verwendungexport PGPASSWORD
.PGPASSWORD
sie in 9.3 veraltet ist.Eine Alternative zur Verwendung von
PGPASSWORD
Umgebungsvariablen ist die Verwendung einerconninfo
Zeichenfolge gemäß der Dokumentationquelle
Dies kann hilfreich sein: Windows PSQL-Befehlszeile : Gibt es eine Möglichkeit, eine kennwortlose Anmeldung zuzulassen?
quelle
8 Jahre später ...
Auf meinem Mac musste ich eine Zeile in die Datei einfügen
~/.pgpass
wie:Siehe auch:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
quelle
Ich finde, dass psql Passwort-Eingabeaufforderung anzeigen, selbst wenn Sie die Variable PGPASSWORD definieren, aber Sie können die Option -w angeben, damit psql die Passwort-Eingabeaufforderung weglässt.
quelle
Verwenden Sie -w im Befehl: psql -h localhost -p 5432 -U Benutzer -w
quelle