Como encontro o caminho para o pg_hba.conf no shell?

101

Eu gostaria de obter o caminho para pg_hba.conf do shell. O caminho varia entre as versões do PostgreSQL. Por exemplo, para 8.4 e 9.1:

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

Eu tentei o pg_configcomando, mas ele não parece incluir essas informações.

Isso é para que eu possa usar um comando uniforme para abrir pg_hba.confe outros arquivos de configuração do PostgreSQL para editar.

Estou usando o bash.

Roger Dahl
fonte
1
Que tal localizar pg_hba.conf?
Pramod
1
@Pramod Poderia dezenas deles por aí. E se você quiser saber qual deles está sendo usado pelo Postgres.
Dedos Sangrentos
@BleedingFingers Dependendo da sua configuração, você provavelmente pode filtrar pelo tempo de acesso. find / -name pg_hba.conf -amin -5(se o servidor foi reiniciado nos últimos 5 minutos; é fácil alterá-lo para -atimese foi reiniciado pela última vez há mais tempo). Ou você pode filtrar por tempo de acesso mais recente que o horário de alteração ou uma das outras opções de localização com base em tempo ... (Embora a filtragem por lsof | grep pg_hba.confenquanto o servidor em execução não funcione).
Parthian Shot

Respostas:

152

pg_configé para informações de compliação, para ajudar extensões e programas clientes a serem compilados e vinculados ao PostgreSQL. Ele não sabe nada sobre as instâncias ativas do PostgreSQL na máquina, apenas os binários.

pg_hba.confpode aparecer em muitos outros lugares, dependendo de como a página foi instalada. A localização padrão é pg_hba.confdentro do data_directorydo banco de dados (que pode ser em /home, /var/lib/pgsql, /var/lib/postgresql/[version]/, /opt/postgres/, etc etc etc) mas os usuários e empacotadores pode colocá-lo onde quiserem. Infelizmente.

As únicas maneiras válidas encontradas pg_hba.confsão perguntar a uma instância do PostgreSQL em execução, onde pg_hba.confestá, ou perguntar ao administrador de sistemas, onde está. Você não pode nem perguntar onde está o datadir e a análise, postgresql.confporque um script init pode ter passado um parâmetro como -c hba_file=/some/other/pathao iniciar a página.

O que você quer fazer é perguntar ao PostgreSQL:

SHOW hba_file;

Este comando deve ser executado em uma sessão de superusuário, portanto, para scripts de shell, você pode escrever algo como:

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

e definir as variáveis de ambiente PGUSER, PGDATABASEetc para garantir que a conexão é certo.

Sim, isso é um problema de galinha e ovo, pois se o usuário não puder se conectar (digamos, depois de estragar a edição pg_hba.conf), você não poderá encontrar pg_hba.confpara corrigi-lo.

Outra opção é examinar a pssaída do comando e ver se o argumento do diretório de dados postmaster -Destá visível lá, por exemplo

ps aux  | grep 'postgres *-D'

desde pg_hba.confque esteja dentro do diretório de dados (a menos que você esteja no Debian / Ubuntu ou em algum derivado e use seus pacotes).

Se você está direcionado especificamente para sistemas Ubuntu com o PostgreSQL instalado a partir de pacotes Debian / Ubuntu, fica um pouco mais fácil. Você não tem que lidar com mão-de-compilado-source Pg que alguém da initdb'da datadir no seu diretório home, ou um Pg EnterpriseDB instalar em / opt, etc. Você pode perguntar pg_wrapper, o Debian / Ubuntu multi-versão Pg gerente, onde PostgreSQL está usando o pg_lsclusterscomando de pg_wrapper.

Se você não conseguir se conectar (a página não está sendo executada ou você precisa editar pg_hba.confpara se conectar), será necessário procurar pg_hba.confarquivos no sistema . No Mac e Linux, algo como o sudo find / -type f -name pg_hba.conffará. Em seguida, verifique o PG_VERSIONarquivo no mesmo diretório para garantir que seja a versão correta do PostgreSQL, se você tiver mais de um. (Se pg_hba.confestiver em /etc/, ignore isso, é o nome do diretório pai). Se você tiver mais de um diretório de dados para a mesma versão do PostgreSQL, precisará analisar o tamanho do banco de dados, verifique a linha de comando dos postgres em execução pspara ver se o -Dargumento do diretório de dados corresponde ao local onde você está editando etc.

Craig Ringer
fonte
Isso pode não ser válido para a 9.3, recebo: psql: invalid port number: "format=unaligned"quando executo esse comando psql.
Jcollum
@jcollum Não, apenas um erro de digitação. -Pnão -p. Fixo.
Craig Ringer
Esta é a única resposta que funciona se você tiver mais de uma versão do PostgreSQL instalada.
Bonh 18/07/16
Existe alguma esperança para Postges padronizar isso? Isso ajudaria muito com dores de cabeça na instalação ...
Scott Skiles 09/02
@ScottSkiles O PostgreSQL não o controla, cabe aos pacotes e distribuidores, todos com opiniões fortes (e diferentes) sobre onde deveria estar.
Craig Ringer
21

É assim que eu faço:

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

Como o caminho é assim: /etc/postgresql/[VERSION]/main/pg_hba.conf

wsou eu
fonte
2

Estou usando o seguinte para detecção de arquivos de configuração:

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

Editar o correto pg_hba.confcom o seu editor visual padrão (vim, emacs, nano, joe etc.) é tão fácil quanto:

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

christianbundy
fonte
-2

Para saber onde está o arquivo, digite:

pg_lsclusters
nirvanastack
fonte
Se você quiser atualizar o arquivo pg_hba.conf, em seguida, emitir o seguinte comando: $ sudo nano /etc/postgresql/9.1/main/pg_hba.conf
nirvanastack
-bash: pg_lsclusters: command not found
Mona Jalal