Как мне найти путь к файлу 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 для редактирования.

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

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

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

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

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

$ psql -U postgrespostgres=# SHOW config_file;

Редактирование правильного 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 во время работы сервера не работает).