Wie finde ich den Pfad zu pg_hba.conf aus der Shell?

101

Ich möchte den Pfad zu pg_hba.conf von der Shell erhalten. Der Pfad variiert zwischen den PostgreSQL-Versionen. Zum Beispiel für 8.4 und 9.1:

/etc/postgresql/8.4/main/pg_hba.conf
/etc/postgresql/9.1/main/pg_hba.conf

Ich habe den pg_configBefehl ausprobiert , aber er scheint diese Informationen nicht zu enthalten.

Auf diese Weise kann ich einen einheitlichen Befehl zum Öffnen pg_hba.confund andere PostgreSQL-Konfigurationsdateien zum Bearbeiten verwenden.

Ich benutze Bash.

Roger Dahl
quelle
1
Wie wäre es mit locate pg_hba.conf?
Pramod
1
@Pramod Es könnten Dutzende von ihnen herumliegen. Was ist, wenn Sie wissen möchten, welches davon von Postgres verwendet wird?
Blutende Finger
@BleedingFingers Abhängig von Ihrem Setup können Sie wahrscheinlich nur nach der Zugriffszeit filtern. find / -name pg_hba.conf -amin -5(wenn der Server in den letzten 5 Minuten neu gestartet wurde; einfach genug, um ihn in einen neu gestarteten Server vor -atimeeiner längeren Zeit zu ändern ). Oder Sie können nach Zugriffszeit filtern, die neuer als die Änderungszeit ist, oder eine der anderen zeitbasierten Optionen suchen ... (Obwohl das Filtern nach, lsof | grep pg_hba.confwährend ein Server ausgeführt wird, nicht funktioniert).
Parthian Shot

Antworten:

151

pg_configdient zur Vervollständigung von Informationen, um Erweiterungen und Client-Programmen beim Kompilieren und Verknüpfen mit PostgreSQL zu helfen. Es weiß nichts über die aktiven PostgreSQL-Instanzen auf dem Computer, nur die Binärdateien.

pg_hba.confkann an vielen anderen Stellen erscheinen, je nachdem, wie Pg installiert wurde. Die Standardposition ist pg_hba.confinnerhalb der data_directoryvon der Datenbank (die in sein könnte /home, /var/lib/pgsql, /var/lib/postgresql/[version]/, /opt/postgres/, etc etc etc) , aber Benutzer und Verpacker können sie setzen , wo immer sie wollen. Unglücklicherweise.

Die einzig gültige Möglichkeit pg_hba.confbesteht darin, eine laufende PostgreSQL-Instanz zu fragen, wo sie sich pg_hba.confbefindet, oder den Sysadmin zu fragen, wo sie sich befindet. Sie können sich nicht einmal darauf verlassen, nach dem Datadir zu fragen und zu analysieren, postgresql.confda ein Init-Skript möglicherweise einen Parameter wie -c hba_file=/some/other/pathbeim Starten von Pg übergeben hat.

Was Sie tun möchten, ist PostgreSQL zu fragen:

SHOW hba_file;

Dieser Befehl muss in einer Superuser-Sitzung ausgeführt werden. Für Shell-Skripte können Sie also Folgendes schreiben:

psql -t -P format=unaligned -c 'show hba_file';

und legen Sie die Umgebungsvariablen PGUSER, PGDATABASEusw. , um sicherzustellen , dass die Verbindung richtig ist.

Ja, dies ist ein kleines Henne-Ei-Problem. Wenn der Benutzer keine Verbindung herstellen kann (z. B. nach einer fehlerhaften Bearbeitung pg_hba.conf), können Sie es nicht finden pg_hba.conf, um es zu beheben.

Eine andere Möglichkeit besteht darin, die psAusgabe des Befehls zu überprüfen und festzustellen, ob das Argument für das Postmaster-Datenverzeichnis -Ddort sichtbar ist, z

ps aux  | grep 'postgres *-D'

since pg_hba.confwird sich im Datenverzeichnis befinden (es sei denn, Sie arbeiten mit Debian / Ubuntu oder einem Derivat und verwenden deren Pakete).

Wenn Sie speziell Ubuntu-Systeme mit PostgreSQL aus Debian / Ubuntu-Paketen ansprechen, wird es etwas einfacher. Sie müssen sich nicht mit von Hand kompilierten Quell-Pg initdbbefassen, für die jemand ein Dateiverzeichnis in seinem Home-Verzeichnis hat, oder mit einer EnterpriseDB-Pg-Installation in / opt usw. Sie können pg_wrapperdie Debian / Ubuntu-Multi-Version-Pg fragen manager, bei dem PostgreSQL den pg_lsclustersBefehl from verwendet pg_wrapper.

Wenn Sie keine Verbindung herstellen können (Pg läuft nicht oder Sie müssen bearbeiten pg_hba.conf, um eine Verbindung herzustellen), müssen Sie das System nach pg_hba.confDateien durchsuchen . Auf Mac und Linux reicht sowas sudo find / -type f -name pg_hba.confschon. Überprüfen Sie dann die PG_VERSIONDatei im selben Verzeichnis, um sicherzustellen, dass es sich um die richtige PostgreSQL-Version handelt, wenn Sie mehr als eine haben. (Wenn pg_hba.confsich in /etc/ befindet, ignorieren Sie dies, es ist stattdessen der Name des übergeordneten Verzeichnisses.) Wenn Sie mehr als ein Datenverzeichnis für dieselbe PostgreSQL-Version haben, müssen Sie die Datenbankgröße überprüfen. Überprüfen Sie in der Befehlszeile des ausgeführten Postgres ps, ob das -DArgument des Datenverzeichnisses mit der Stelle übereinstimmt, an der Sie es bearbeiten.

Craig Ringer
quelle
Dies ist möglicherweise nicht gültig für 9.3, psql: invalid port number: "format=unaligned"wenn ich diesen psql-Befehl ausführe.
jcollum
@ jcollum Nö, nur ein Tippfehler. -Pnicht -p. Fest.
Craig Ringer
Dies ist die einzige Antwort, die funktioniert, wenn Sie mehr als eine Version von PostgreSQL installiert haben.
Bonh
Gibt es Hoffnung für Postges, dies zu standardisieren? Das würde bei Installationsproblemen viel helfen ...
Scott Skiles
@ScottSkiles PostgreSQL kontrolliert es nicht, es liegt an den Paketen und Distributoren, die alle eine starke (und unterschiedliche) Meinung dazu haben, wo es sein sollte.
Craig Ringer
21

So mache ich es:

john@host:~$ ls /etc/postgresql
9.1
john@host:~$ sudo vim /etc/postgresql/9.1/main/pg_hba.conf

Da der Weg so ist: /etc/postgresql/[VERSION]/main/pg_hba.conf

da ich bin
quelle
2

Ich verwende Folgendes zur Erkennung von Konfigurationsdateien:

$(ls /etc/postgresql/*/main/pg_hba.conf)
$(ls /etc/postgresql/*/main/postgresql.conf)
radeklos
quelle
1

Das korrekte Editieren pg_hba.confmit Ihrem standardmäßigen visuellen Editor (vim, emacs, nano, joe usw.) ist so einfach wie:

$VISUAL /etc/postgresql/$(ls /etc/postgresql)/main/pg_hba.conf

christianbundy
quelle
-2

Um zu wissen, wo sich die Datei befindet, geben Sie einfach Folgendes ein:

pg_lsclusters
Nirvanastack
quelle
Wenn Sie die Datei pg_hba.conf aktualisieren möchten, geben Sie den folgenden Befehl ein: $ sudo nano /etc/postgresql/9.1/main/pg_hba.conf
nirvanastack
-bash: pg_lsclusters: Befehl nicht gefunden
Mona Jalal