Как мне найти путь к pg_hba.conf из оболочки?

101

Я хотел бы получить путь к pg_hba.conf из оболочки. Путь варьируется между версиями PostgreSQL. Например, для 8.4 и 9.1:

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

Я пробовал pg_configкоманду, но она, кажется, не включает эту информацию.

Это сделано для того, чтобы я мог использовать единую команду для открытия pg_hba.confи другие файлы конфигурации PostgreSQL для редактирования.

Я использую Bash.

Роджер Даль
источник
1
Как насчет найти pg_hba.conf?
Прамод
1
@Pramod Там могли бы десятки из них валяться. Что если вы хотите знать, какой из них используется Postgres?
Кровоточащие пальцы
@BleedingFingers В зависимости от вашей настройки, вы можете просто фильтровать по времени доступа. find / -name pg_hba.conf -amin -5(если сервер был перезапущен за последние 5 минут; достаточно легко изменить его на -atimeпоследний перезапуск более длительного времени назад). Или вы можете фильтровать по времени доступа новее, чем время изменения, или один из других вариантов поиска на основе времени ... (хотя фильтрация lsof | grep pg_hba.confво время работы сервера не работает).
Парфянский выстрел

Ответы:

152

pg_configдля информации о комплиментах, чтобы помочь расширениям и клиентским программам компилировать и связывать с PostgreSQL. Он ничего не знает об активных экземплярах PostgreSQL на машине, только двоичные файлы.

pg_hba.confможет появиться во многих других местах в зависимости от того, как был установлен Pg. Стандартное расположение в pg_hba.confпределах data_directoryбазы данных (который может быть в /home, /var/lib/pgsql, /var/lib/postgresql/[version]/, /opt/postgres/и т.д. и т.д. и т.д.) , но пользователи и упаковщиков может поставить его там , где им нравится. К несчастью.

Единственный верный способ найти pg_hba.conf- это спросить работающий экземпляр PostgreSQL, где он pg_hba.confнаходится, или спросить системного администратора, где он находится. Вы даже не можете полагаться на вопрос, где находится datadir, и на синтаксический анализ, postgresql.confпотому что сценарий инициализации может передавать параметр, как -c hba_file=/some/other/pathпри запуске Pg.

Что вы хотите сделать, это спросить PostgreSQL:

SHOW hba_file;

Эта команда должна выполняться в сеансе суперпользователя, поэтому для сценариев оболочки вы можете написать что-то вроде:

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

и установить переменные окружения PGUSER, PGDATABASEи т.д. , чтобы убедиться , что соединение является правильным.

Да, это в некоторой степени проблема курицы и яйца: если пользователь не может подключиться (скажем, испортил редактирование pg_hba.conf), вы не можете найти его pg_hba.conf, чтобы исправить.

Другой вариант - посмотреть на psвывод команды и посмотреть, видим ли там аргумент каталога данных postmaster -D, например

ps aux  | grep 'postgres *-D'

так как pg_hba.confбудет в каталоге данных (если вы не используете Debian / Ubuntu или какую-либо производную и используете их пакеты).

Если вы нацелены конкретно на системы Ubuntu с PostgreSQL, установленным из пакетов Debian / Ubuntu, это станет немного проще. Вам не нужно иметь дело с Pg, скомпилированным вручную из исходного кода, для которого чей-то initdbda dadadir находится в его домашнем каталоге, или с Pg EnterpriseDB, установленным в / opt, и т. Д. Вы можете спросить pg_wrapper, многоверсионный Pg Debian / Ubuntu менеджер, где PostgreSQL использует в pg_lsclustersкоманду с pg_wrapper.

Если вы не можете подключиться (Pg не запущен, или вам нужно отредактировать pg_hba.confдля подключения), вам придется искать в системе pg_hba.confфайлы. На Mac и Linux что-то подобное sudo find / -type f -name pg_hba.confподойдет. Затем проверьте PG_VERSIONфайл в том же каталоге, чтобы убедиться, что это правильная версия PostgreSQL, если у вас их больше одной. (Если pg_hba.confнаходится в /etc/, игнорируйте это, вместо этого это имя родительского каталога). Если у вас есть несколько каталогов данных для одной и той же версии PostgreSQL, вам придется посмотреть на размер базы данных, проверьте командную строку запущенного postgres, psчтобы узнать, -Dсовпадает ли его аргумент каталога данных с тем, где вы редактируете, и т. Д.

Крейг Рингер
источник
Это может быть недопустимо для 9.3, я получаю: psql: invalid port number: "format=unaligned"когда я запускаю эту команду psql.
Jcollum
@jcollum Нет, просто опечатка. -Pне -p. Исправлена.
Крейг Рингер
Это единственный ответ, который работает, если у вас установлено более одной версии PostgreSQL.
Бон
Есть ли надежда для Postges стандартизировать это? Это очень помогло бы с головной болью при установке ...
Скотт Скилз
@ScottSkiles PostgreSQL не контролирует его, это зависит от пакетов и распространителей, которые имеют твердое (и разное) мнение о том, где это должно быть.
Крейг Рингер
21

Вот как я это делаю:

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

Так как путь такой: /etc/postgresql/[VERSION]/main/pg_hba.conf

это я
источник
2

Я использую следующее для обнаружения файлов конфигурации:

$(ls /etc/postgresql/*/main/pg_hba.conf)
$(ls /etc/postgresql/*/main/postgresql.conf)
radeklos
источник
1

Редактировать правильное изображение pg_hba.confс помощью визуального редактора по умолчанию (vim, emacs, nano, joe и т. Д.) Так же просто, как:

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

christianbundy
источник
-2

Чтобы узнать, где находится файл, просто введите:

pg_lsclusters
nirvanastack
источник
Если вы хотите обновить файл pg_hba.conf, введите следующую команду: $ sudo nano /etc/postgresql/9.1/main/pg_hba.conf
nirvanastack
-bash: pg_lsclusters: команда не найдена
Мона Джалал