Jak znaleźć ścieżkę do pg_hba.conf z powłoki?

101

Chciałbym uzyskać ścieżkę do pg_hba.conf z powłoki. Ścieżka różni się w zależności od wersji PostgreSQL. Na przykład dla 8.4 i 9.1:

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

Wypróbowałem pg_configpolecenie, ale wydaje się, że nie zawiera ono tych informacji.

Dzięki temu mogę używać jednolitego polecenia do otwierania pg_hba.confi innych plików konfiguracyjnych PostgreSQL do edycji.

Używam bash.

Roger Dahl
źródło
1
Co powiesz na zlokalizowanie pg_hba.conf?
Pramod
1
@Pramod Może ich być dziesiątki. Co jeśli chcesz wiedzieć, z którego z nich korzysta Postgres.
Krwawiące palce
@BleedingFingers W zależności od konfiguracji prawdopodobnie możesz po prostu filtrować według czasu dostępu. find / -name pg_hba.conf -amin -5(jeśli serwer został zrestartowany w ciągu ostatnich 5 minut; wystarczy, aby go zmienić, jeśli serwer został ponownie -atimeuruchomiony wcześniej). Lub możesz filtrować według czasu dostępu nowszego niż zmiana czasu lub jednej z innych opcji wyszukiwania opartych na czasie ... (Chociaż filtrowanie według lsof | grep pg_hba.confczasu działania serwera nie działa).
Parthian Shot

Odpowiedzi:

151

pg_configsłuży do informacji o kompilacji, aby pomóc rozszerzeniom i programom klienckim kompilować i łączyć się z PostgreSQL. Nic nie wie o aktywnych instancjach PostgreSQL na komputerze, tylko pliki binarne.

pg_hba.confmoże pojawić się w wielu innych miejscach, w zależności od sposobu instalacji Pg. Średnia lokalizacja jest pg_hba.confw obrębie data_directorybazy danych (który może być w /home, /var/lib/pgsql, /var/lib/postgresql/[version]/, /opt/postgres/, etc etc etc), ale użytkownicy i pakowaniem można umieścić go tam, gdzie im się podoba. Niestety.

Jedynym prawidłowym sposobem znalezienia pg_hba.confjest zapytanie działającej instancji PostgreSQL, gdzie ona pg_hba.confjest, lub zapytanie sysadmin, gdzie ona jest. Nie możesz nawet polegać na pytaniu, gdzie jest datadir i analizowaniu, postgresql.confponieważ skrypt init może przekazać parametry, jak -c hba_file=/some/other/pathpodczas uruchamiania Pg.

Co chcesz zrobić, to zapytać PostgreSQL:

SHOW hba_file;

To polecenie musi zostać uruchomione w sesji superużytkownika, więc dla skryptów powłoki możesz napisać coś takiego:

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

i ustawić zmienne środowiskowe PGUSER, PGDATABASEitp aby upewnić się, że połączenie jest w porządku.

Tak, jest to w pewnym sensie problem z kurczakiem i jajkiem, ponieważ jeśli użytkownik nie może się połączyć (powiedzmy, po zepsuciu edycji pg_hba.conf), nie możesz go znaleźć pg_hba.conf, aby go naprawić.

Inną opcją jest sprawdzenie danych pswyjściowych polecenia i sprawdzenie, czy argument katalogu danych postmaster -Djest tam widoczny, np

ps aux  | grep 'postgres *-D'

ponieważ pg_hba.confbędzie w katalogu danych (chyba że korzystasz z Debiana / Ubuntu lub jakiejś pochodnej i używasz ich pakietów).

Jeśli celujesz w konkretne systemy Ubuntu z PostgreSQL zainstalowanym z pakietów Debian / Ubuntu, staje się to trochę łatwiejsze. Nie musisz zajmować się ręcznie skompilowanym ze źródła Pg, dla którego czyjś initdbda datadir w katalogu domowym, czy instalacją EnterpriseDB Pg w / opt itp. Możesz zapytać pg_wrapper, wersja Pg w wielu wersjach Debiana / Ubuntu menedżer, gdzie PostgreSQL używa się pg_lsclusterspolecenia z pg_wrapper.

Jeśli nie możesz się połączyć (Pg nie działa lub musisz edytować, pg_hba.confaby się połączyć), musisz przeszukać system w poszukiwaniu pg_hba.confplików. Na Macu i Linuksie coś takiego sudo find / -type f -name pg_hba.confzrobi. Następnie sprawdź PG_VERSIONplik w tym samym katalogu, aby upewnić się, że jest to poprawna wersja PostgreSQL, jeśli masz więcej niż jedną. (Jeśli pg_hba.confjest w /etc/, zignoruj ​​to, zamiast tego jest to nazwa katalogu nadrzędnego). Jeśli masz więcej niż jeden katalog danych dla tej samej wersji PostgreSQL, musisz spojrzeć na rozmiar bazy danych, sprawdź wiersz poleceń uruchomionego postgres, psaby sprawdzić, czy jego -Dargument katalogu danych pasuje do miejsca, w którym edytujesz itp.

Craig Ringer
źródło
To może nie być poprawne dla 9.3, otrzymuję: psql: invalid port number: "format=unaligned"kiedy uruchamiam to polecenie psql.
jcollum
@jcollum Nope, tylko literówka. -PNie -p. Naprawiony.
Craig Ringer
To jedyna odpowiedź, która działa, jeśli masz zainstalowaną więcej niż jedną wersję PostgreSQL.
bonh
Czy istnieje jakaś nadzieja na to, że Postges to znormalizuje? To by bardzo pomogło przy problemach z instalacją ...
Scott Skiles
@ScottSkiles PostgreSQL nie kontroluje tego, to zależy od pakietów i dystrybutorów, którzy wszyscy mają mocne (i różne) opinie na temat tego, gdzie powinien być.
Craig Ringer
21

Tak to robię:

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

Ponieważ ścieżka jest taka: /etc/postgresql/[VERSION]/main/pg_hba.conf

to ja
źródło
2

Korzystam z następujących funkcji do wykrywania plików konfiguracyjnych:

$(ls /etc/postgresql/*/main/pg_hba.conf)
$(ls /etc/postgresql/*/main/postgresql.conf)
radeklos
źródło
1

Edycja poprawnych pg_hba.confustawień za pomocą domyślnego edytora wizualnego (vim, emacs, nano, joe itp.) Jest tak prosta, jak:

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

christianbundy
źródło
-2

Aby wiedzieć, gdzie jest plik, po prostu wpisz:

pg_lsclusters
nirvanastack
źródło
Jeśli chcesz zaktualizować plik pg_hba.conf, wydaj następującą komendę: $ sudo nano /etc/postgresql/9.1/main/pg_hba.conf
nirvanastack
-bash: pg_lsclusters: nie znaleziono polecenia
Mona Jalal