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.
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.
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:
PGPASSWORD=yourpass psql ...
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
Sie können diese Befehlszeile zu Beginn Ihres Skripts hinzufügen:
set PGPASSWORD=[your password]
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.
chmod 600
Datei bearbeiten, andernfalls psql
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
:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
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,
export PGPASSWORD=[password]
Sie müssen dies oben in der Datei oder vor jeder Verwendung speichern, damit es vor dem Aufruf festgelegt wird.
Funktioniert sicherlich unter Windows :)
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 .
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:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
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:
WARNING: password file "/dev/fd/63" is not a plain file
Aufbauend auf der Antwort von mächtigen Byte für diejenigen, die mit * nix Shell- Skripten nicht vertraut sind , ist hier ein funktionierendes Skript:
#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
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 in
psql mydb jdoe
Vergessen Sie nicht, das Skript mit ausführbar zu machen
chmod +x runpsql
( oder wie auch immer Sie die Skriptdatei genannt haben )
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!
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 Verwendung export PGPASSWORD
.
PGPASSWORD
sie in 9.3 veraltet ist.
Eine Alternative zur Verwendung von PGPASSWORD
Umgebungsvariablen ist die Verwendung einer conninfo
Zeichenfolge gemäß der Dokumentation
Eine alternative Möglichkeit, Verbindungsparameter anzugeben, besteht in einer Conninfo-Zeichenfolge oder einem URI, der anstelle eines Datenbanknamens verwendet wird. Dieser Mechanismus gibt Ihnen eine sehr breite Kontrolle über die Verbindung.
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
postgres=>
Dies kann hilfreich sein: Windows PSQL-Befehlszeile : Gibt es eine Möglichkeit, eine kennwortlose Anmeldung zuzulassen?
8 Jahre später ...
Auf meinem Mac musste ich eine Zeile in die Datei einfügen
~/.pgpass
wie:
<IP>:<PORT>:<dbname>:<user>:<password>
Siehe auch:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
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.