Wie benutze ich psql ohne Passwortabfrage?

70

Ich habe ein Skript für REINDEXIndizes in einer Datenbank geschrieben. Hier ist einer von ihnen:

echo -e "\nreindex for unq_vbvdata_vehicle started at: `date "+%F %T"`" >> ${LOG_FILE}
psql -U ${USERNAME} -h ${HOSTNAME} -d ${DBNAME} -c "REINDEX INDEX scm_main.unq_vbvdata_vehicle;"
if [[ ${?} -eq 0 ]]; then
    echo "reindex for unq_vbvdata_vehicle finished at: `date "+%F %T"`" >> ${LOG_FILE}
else
    echo "reindex for unq_vbvdata_vehicle failed" >> ${LOG_FILE}
    exit 1
fi

Das Problem ist, dass ich dieses Skript nicht im Standalone-Modus ausführen kann. psqlfragt bei jeder Ausführung nach dem Kennwort. Es gibt auch zwei Einschränkungen:

  1. Ich kann keinen Benutzer in der Datenbank ohne Passwort erstellen.

  2. Da REINDEXsperrt Tabellen, sollte ich sleep <num>zwischen jedem verwenden REINDEX.

Gibt es eine automatische Lösung?

Majid Azimi
quelle

Antworten:

111

Bei der Passwortabfrage haben Sie vier Möglichkeiten:

  1. Setzen Sie die Umgebungsvariable PGPASSWORD. Einzelheiten finden Sie im Handbuch:
    http://www.postgresql.org/docs/current/static/libpq-envars.html
  2. Verwenden Sie eine .pgpass-Datei, um das Kennwort zu speichern. Einzelheiten finden Sie im Handbuch:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. Verwenden Sie für diesen bestimmten Benutzer die "Vertrauensauthentifizierung":
    http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. Verwenden Sie einen Verbindungs-URI, der alles enthält:
    http://www.postgresql.org/docs/current/static/libpq-connect.html#AEN42532
ein Pferd ohne Name
quelle
4
Seit PostgreSQL 9.1 gibt es auch die peerAuthentifizierungsmethode für lokale Verbindungen. Derzeit nur für Linux, BSD, OS X oder Solaris (nicht Windows).
Erwin Brandstetter
1
Hinweis zu dieser .pgpassOption: Sie müssen noch den Benutzernamen, die Datenbank und den Hostnamen (wenn Sie dies normalerweise psql
getan
In Bezug auf 3 müssen Sie die Methode bearbeiten. Es wird hier erklärt: gist.github.com/p1nox/4953113
FuzzyAmi
Leicht zu verwenden export PGPASSWORD="your_pw", um Version 1 zu gehen
gies0r
18

Ein einfaches Beispiel mit PGPASSWORDwird etwa sein:

PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME

Ich hoffe es hilft.

pdm
quelle
4
Hallo Ian_H, danke für deine Kommentare und ich stimme allen deinen Punkten zu. Die akzeptierte Antwort ist sehr umfassend und das hat mein Problem gelöst. Der Grund, warum ich auf diesen alten Beitrag antworte, ist, dass er für mich immer noch nicht einfach ist, da ich glaube, dass andere das gleiche Gefühl haben.
pdm
Dies war definitiv eine gute Ergänzung zu der akzeptierten Antwort - eine hilfreiche Erinnerung daran, dass wir ENV-Variablen nicht permanent festlegen müssen.
Kevlarr
1

Abhängig von Ihren Kontoberechtigungen schlägt das Beispiel ohne Angabe der Datenbank möglicherweise fehl, da die Benutzerberechtigungen mit der Datenbank verglichen werden, mit der Sie eine Verbindung herstellen. Es ist besser, auch die Datenbank explizit anzugeben.

# this can fail.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME    

# this is more likely to work, assuming given account has permissions to that database.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME -d YOUR_DATABASE  
mtoonen
quelle
0

Sehr hilfreiche Antworten in diesem Thread. Ich füge dies nur für Ubuntu 18.04 hinzu:

sudo PGPASSWORD=yourpasswordHere -u postgres psql

So gelangen Sie ohne Passwortabfrage in die Postgres, ohne Umgebungsvariablen setzen zu müssen. Dies ist keine dauerhafte Einstellung.

Dhiraj
quelle
Tun Sie dies nicht: Das Passwort wird in der Ausgabe von ps -ef angezeigt.
Colin 't Hart