¿Cómo encuentro la ruta a pg_hba.conf desde el shell?

101

Me gustaría obtener la ruta a pg_hba.conf desde el shell. La ruta varía entre versiones de PostgreSQL. Por ejemplo, para 8.4 y 9.1:

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

He probado el pg_configcomando, pero no parece incluir esta información.

Esto es para que pueda usar un comando uniforme para abrir pg_hba.confy otros archivos de configuración de PostgreSQL para editar.

Estoy usando bash

Roger Dahl
fuente
1
¿Qué tal localizar pg_hba.conf?
Pramod
1
@Pramod Podría haber decenas de ellos por ahí. ¿Qué pasa si quieres saber cuál de ellos está siendo utilizado por Postgres?
Sangrado de los dedos
@BleedingFingers Dependiendo de su configuración, probablemente podría filtrar por tiempo de acceso. find / -name pg_hba.conf -amin -5(si el servidor se ha reiniciado en los últimos 5 minutos; es bastante fácil cambiarlo -atimesi se reinició por última vez hace más tiempo). O puede filtrar por tiempo de acceso más nuevo que el tiempo de cambio o una de las otras opciones basadas en el tiempo de búsqueda ... (Aunque el filtrado por lsof | grep pg_hba.confmientras el servidor está funcionando no funciona).
Parthian Shot

Respuestas:

151

pg_configes para información de compilación, para ayudar a las extensiones y programas de clientes a compilar y vincular contra PostgreSQL. No sabe nada sobre las instancias activas de PostgreSQL en la máquina, solo los binarios.

pg_hba.confpuede aparecer en muchos otros lugares dependiendo de cómo se instaló Pg. La ubicación estándar es pg_hba.confen el data_directoryde la base de datos (que podría ser en /home, /var/lib/pgsql, /var/lib/postgresql/[version]/, /opt/postgres/, etc, etc, etc) pero los usuarios y envasadores pueden ponerlo donde quieran. Desafortunadamente.

La única forma válida de encontrar pg_hba.confes preguntarle a una instancia de PostgreSQL en ejecución dónde pg_hba.confestá, o preguntarle al administrador del sistema dónde está. Ni siquiera puede confiar en preguntar dónde está el datadir y analizar postgresql.confporque un script de inicio podría pasar un parámetro como -c hba_file=/some/other/pathal iniciar Pg.

Lo que quieres hacer es preguntarle a PostgreSQL:

SHOW hba_file;

Este comando debe ejecutarse en una sesión de superusuario, por lo que para las secuencias de comandos de shell puede escribir algo como:

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

y establecer las variables de entorno PGUSER, PGDATABASEetc para asegurarse de que la conexión es correcta.

Sí, esto es algo así como un problema de huevo y gallina, en el sentido de que si el usuario no puede conectarse (por ejemplo, después de arruinar la edición pg_hba.conf) no puede encontrarlo pg_hba.confpara solucionarlo.

Otra opción es mirar la pssalida del comando y ver si el argumento del directorio de datos del postmaster -Destá visible allí, p. Ej.

ps aux  | grep 'postgres *-D'

ya pg_hba.confque estará dentro del directorio de datos (a menos que esté en Debian / Ubuntu o alguna derivada y esté usando sus paquetes).

Si se dirige específicamente a sistemas Ubuntu con PostgreSQL instalado desde paquetes Debian / Ubuntu, se vuelve un poco más fácil. No tiene que lidiar con la Pg compilada a mano desde la fuente para la cual el dadir de datos de alguien initdben su directorio de inicio, o una instalación de EnterpriseDB Pg en / opt, etc. Puede preguntar pg_wrapper, la Pg de múltiples versiones de Debian / Ubuntu manager, donde PostgreSQL está utilizando el pg_lsclusterscomando de pg_wrapper.

Si no puede conectarse (Pg no se está ejecutando o necesita editar pg_hba.confpara conectarse), tendrá que buscar pg_hba.confarchivos en el sistema . En Mac y Linux, algo como sudo find / -type f -name pg_hba.conflo hará. Luego verifique el PG_VERSIONarchivo en el mismo directorio para asegurarse de que sea la versión correcta de PostgreSQL si tiene más de uno. (Si pg_hba.confestá en /etc/, ignore esto, es el nombre del directorio principal). Si tiene más de un directorio de datos para la misma versión de PostgreSQL, tendrá que mirar el tamaño de la base de datos, verifique la línea de comando de los postgres en ejecución pspara ver si el -Dargumento del directorio de datos coincide con el que está editando, etc.

Craig Ringer
fuente
Esto podría no ser válido para 9.3, obtengo: psql: invalid port number: "format=unaligned"cuando ejecuto ese comando psql.
jcollum
@jcollum No, solo un error tipográfico. -Pno -p. Fijo.
Craig Ringer
Esta es la única respuesta que funciona si tiene instalada más de una versión de PostgreSQL.
bonh
¿Hay alguna esperanza para Postges de estandarizar esto? Eso ayudaría mucho con los dolores de cabeza de la instalación ...
Scott Skiles
@ScottSkiles PostgreSQL no lo controla, depende de los paquetes y los distribuidores, quienes tienen opiniones fuertes (y diferentes) sobre dónde debería estar.
Craig Ringer
21

Así es como lo hago:

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

Como el camino es así: /etc/postgresql/[VERSION]/main/pg_hba.conf

soy yo
fuente
2

Estoy usando lo siguiente para la detección de archivos de configuración:

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

Editar lo correcto pg_hba.confcon su editor visual predeterminado (vim, emacs, nano, joe, etc.) es tan fácil como:

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

christianbundy
fuente
-2

Para saber dónde está el archivo simplemente escriba:

pg_lsclusters
nirvanastack
fuente
Si desea actualizar el archivo pg_hba.conf, emita el siguiente comando: $ sudo nano /etc/postgresql/9.1/main/pg_hba.conf
nirvanastack
-bash: pg_lsclusters: comando no encontrado
Mona Jalal