Как мне найти путь к pg_hba.conf из командной строки?

Я хотел бы получить путь к 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 для редактирования.

Я использую баш.

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, скомпилированным вручную из исходного кода, который кто-то initdb'd datadir для в их домашнем каталоге, или для установки EnterpriseDB Pg в / 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 аргумент совпадает с тем, где вы редактируете, и т.д.

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

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

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

Используя командную строку, запросите вашу базу данных:

$ psql -U postgrespostgres=# SHOW config_file;

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

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

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

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

Просто спросите у PostgreSQL.

Распечатать расположение файла pg_hba.conf:

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

Распечатать местоположение файла postgresql.conf:

su - postgres -c "psql -t -P format=unaligned -c 'SHOW config_file';"

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

pg_lsclusters

Как насчет того, чтобы найти pg_hba.conf?

@Pramod Их могут быть десятки, валяющиеся вокруг. Что делать, если вы хотите знать, какой из них используется Postgres.

@BleedingFingers В зависимости от ваших настроек вы, вероятно, могли бы просто отфильтровать по времени доступа. find / -name pg_hba.conf -amin -5 (если сервер был перезапущен за последние 5 минут; достаточно легко изменить его на -atime, если последний раз он перезапускался более длительное время назад). Или вы можете выполнить фильтрацию по времени доступа, более новому, чем время изменения, или по одному из других вариантов поиска, основанных на времени… (Хотя фильтрация по lsof | grep pg_hba.conf во время работы сервера не работает).