Comment trouver le chemin d'accès à pg_hba.conf à partir du shell?


101

Je voudrais obtenir le chemin vers pg_hba.conf depuis le shell. Le chemin varie selon les versions de PostgreSQL. Par exemple, pour 8.4 et 9.1:

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

J'ai essayé la pg_configcommande, mais elle ne semble pas inclure cette information.

C'est pour que je puisse utiliser une commande uniforme pour l'ouverture pg_hba.confet d'autres fichiers de configuration PostgreSQL pour l'édition.

J'utilise bash.


1
Comment localiser pg_hba.conf?
Pramod

1
@Pramod Il pourrait y en avoir des dizaines. Si vous voulez savoir lequel d’entre eux est utilisé par Postgres.
Bleeding Fingers

@BleedingFingers Selon votre configuration, vous pouvez probablement simplement filtrer par heure d'accès. find / -name pg_hba.conf -amin -5(si le serveur a été redémarré au cours des 5 dernières minutes; assez facile pour le remplacer par -atimes'il avait été redémarré il y a plus longtemps). Vous pouvez également filtrer par heure d'accès plus récente que l'heure de modification ou par l'une des autres options basées sur l'heure ... (bien que le filtrage par lsof | grep pg_hba.confpendant l'exécution d'un serveur ne fonctionne pas).
Parthian Shot

Réponses:


152

pg_configest pour les informations de compliation, pour aider les extensions et les programmes clients à compiler et se lier à PostgreSQL. Il ne sait rien des instances actives de PostgreSQL sur la machine, seulement des fichiers binaires.

pg_hba.confpeut apparaître dans de nombreux autres endroits en fonction de l'installation de Pg. L'emplacement standard est pg_hba.confdans le data_directoryde la base de données (qui pourrait être /home, /var/lib/pgsql, /var/lib/postgresql/[version]/, /opt/postgres/, etc , etc , etc) , mais les utilisateurs et les emballeurs peuvent le mettre où ils veulent. Malheureusement.

Le seul moyen valable de trouver pg_hba.confest de demander à une instance PostgreSQL en cours d'exécution pg_hba.confou à l'administrateur sysadmin où elle se trouve. Vous ne pouvez même pas vous demander où se trouve datadir et analyser, postgresql.confcar un script init peut transmettre un paramètre comme -c hba_file=/some/other/pathlors du démarrage de Pg.

Ce que vous voulez faire, c'est demander à PostgreSQL:

SHOW hba_file;

Cette commande doit être exécutée sur une session de superutilisateur. Ainsi, pour les scripts shell, vous pourriez écrire quelque chose comme:

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

et définir les variables d'environnement PGUSER, PGDATABASEetc. pour assurer que la connexion est bonne.

Oui, il s’agit en quelque sorte d’un problème particulier: si l’utilisateur ne peut pas se connecter (par exemple, après avoir bousillé le montage pg_hba.conf), vous ne pouvez pas le trouver pg_hba.confpour le réparer.

Une autre option consiste à examiner le résultat de la pscommande pour voir si l'argument postmaster data directory -Dest visible ici, par exemple:

ps aux  | grep 'postgres *-D'

car pg_hba.confsera dans le répertoire de données (sauf si vous êtes sur Debian / Ubuntu ou sur un dérivé et que vous utilisez leurs paquets).

Si vous ciblez spécifiquement des systèmes Ubuntu avec PostgreSQL installés à partir de paquets Debian / Ubuntu, cela devient un peu plus facile. Vous n'avez pas à traiter avec une page source compilée à la main initdbpour laquelle le nom de données d'un utilisateur est situé dans son répertoire personnel, ni une installation EnterpriseDB Pg dans / opt, etc. Vous pouvez demander pg_wrapper, la version multi-version Debian / Ubuntu manager, où PostgreSQL utilise la pg_lsclusterscommande de pg_wrapper.

Si vous ne pouvez pas vous connecter (Pg n'est pas en cours d'exécution ou si vous devez l'éditer pg_hba.confpour vous connecter), vous devrez rechercher des pg_hba.conffichiers dans le système . Sur Mac et Linux, quelque chose sudo find / -type f -name pg_hba.confva faire. Ensuite, vérifiez le PG_VERSIONfichier dans le même répertoire pour vous assurer que c'est la bonne version de PostgreSQL si vous en avez plusieurs. (Si pg_hba.confest dans /etc/, ignorez ceci, c'est plutôt le nom du répertoire parent). Si vous avez plus d'un répertoire de données pour la même version de PostgreSQL, vous devrez examiner la taille de la base de données, vérifiez la ligne de commande du postgres en cours d'exécution pspour voir si l' -Dargument du répertoire de données correspond à l'endroit où vous modifiez, etc.


Cela pourrait ne pas être valable pour 9.3, je reçois: psql: invalid port number: "format=unaligned"quand j’exécute cette commande psql.
jeudi

@ jcollum Nope, juste une faute de frappe. -Pnon -p. Fixé.
Craig Ringer

C'est la seule réponse qui fonctionne si vous avez plusieurs versions de PostgreSQL installées.
Bonh

Y a-t-il un espoir pour Postges de normaliser cela? Cela aiderait beaucoup avec les problèmes d'installation ...
Scott Skiles

@ScottSkiles PostgreSQL ne le contrôle pas, c'est aux paquets et aux distributeurs, qui ont tous des opinions bien arrêtées (et différentes) sur ce qu'il devrait être.
Craig Ringer

21

Voici comment je le fais:

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

Puisque le chemin est comme ça: /etc/postgresql/[VERSION]/main/pg_hba.conf


2

J'utilise les éléments suivants pour la détection des fichiers de configuration:

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

1

Éditer le correct pg_hba.confavec votre éditeur visuel par défaut (vim, emacs, nano, joe, etc.) est aussi simple que:

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



-2

Pour savoir où se trouve le fichier, tapez simplement:

pg_lsclusters

Si vous souhaitez mettre à jour le fichier pg_hba.conf, lancez la commande suivante: $ sudo nano /etc/postgresql/9.1/main/pg_hba.conf
nirvanastack

-bash: pg_lsclusters: commande non trouvée
Mona Jalal
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.