Ubuntu: How do I find the path to pg_hba.conf from the shell?
Channel: Roel Van de Paar
Date: 19/06/2019

Ubuntu: How do I find the path to pg_hba.conf from the shell?


Question: I would like to obtain the path to pg_hba.conf from the shell. The path varies
between versions of PostgreSQL. For instance, for 8.4 and 9.1:
/etc/postgresql/8.4/main/pg_hba.conf
/etc/postgresql/9.1/main/pg_hba.conf
I have tried the pg_config command, but it does not seem to include this
information.
This is so that I can use a uniform command for opening pg_hba.conf and other
PostgreSQL configuration files for editing.
I'm using bash.

Solutions Sample (Please watch the whole video to see all solutions, in order of how many people found them helpful):

== This solution helped 121 people ==
pg_config is for compliation information, to help extensions and client
programs compile and link against PostgreSQL. It knows nothing about the active
PostgreSQL instance(s) on the machine, only the binaries.
pg_hba.conf can appear in many other places depending on how Pg was installed.
The standard location is pg_hba.conf within the data_directory of the database
(which could be in /home, /var/lib/pgsql, /var/lib/postgresql/[version]/, /opt/
postgres/, etc etc etc) but users and packagers can put it wherever they like.
Unfortunately.
The only valid ways find pg_hba.conf is to ask a running PostgreSQL instance
where it's pg_hba.conf is, or ask the sysadmin where it is. You can't even rely
on asking where the datadir is and parsing postgresql.conf because an init
script might passed a param like -c hba_file=/some/other/path when starting Pg.
What you want to do is ask PostgreSQL:
SHOW hba_file;
This command must be run on a superuser session, so for shell scripting you
might write something like:
psql -t -P format=unaligned -c 'show hba_file';
and set the environment variables PGUSER, PGDATABASE, etc to ensure that the
connection is right.
Yes, this is somewhat of a chicken-and-egg problem, in that if the user can't
connect (say, after screwing up editing pg_hba.conf) you can't find pg_hba.conf
in order to fix it.
Another option is to look at the ps command's output and see if the postmaster
data directory argument -D is visible there, e.g.
ps aux | grep 'postgres *-D'
since pg_hba.conf will be inside the data directory (unless you're on Debian/
Ubuntu or some derivative and using their packages).
If you're targeting specifically Ubuntu systems with PostgreSQL installed from
Debian/Ubuntu packages it gets a little easier. You don't have to deal with
hand-compiled-from-source Pg that someone's initdb'd a datadir for in their
home dir, or an EnterpriseDB Pg install in /opt, etc. You can ask pg_wrapper,
the Debian/Ubuntu multi-version Pg manager, where PostgreSQL is using the
pg_lsclusters_command from pg_wrapper.
If you can't connect (Pg isn't running, or you need to edit pg_hba.conf to
connect) you'll have to search the system for pg_hba.conf files. On Mac and
Linux something like sudo find / -type f -name pg_hba.conf will do. Then check
the PG_VERSION file in the same directory to make sure it's the right
PostgreSQL version if you have more than one. (If pg_hba.conf is in /etc/,
ignore this, it's the parent directory name instead). If you have more than one
data directory for the same PostgreSQL version you'll have to look at database
size, check the command line of the running postgres from ps to see if it's
data directory -D argument matches where you're editing, etc.

== This solution helped 1 person ==
Editing the correct pg_hba.conf with your default visual editor (vim, emacs,
nano, joe, etc.) is as easy as:
$VISUAL /etc/postgresql/$(ls /etc/postgresql)/main/pg_hba.conf

== This solution helped 20 people ==
This is how I do it:
john@host:~$ ls /etc/postgresql
9.1
john@host:~$ sudo vim /etc/postgresql/9.1/main/pg_hba.conf
Since the path is like this: /etc/postgresql/[VERSION]/main/pg_hba.conf

With thanks & praise to God! With thanks to all the many who have made this project possible! | Content (except music & images) licensed under cc by-sa 3.0 | Music & music license: https://www.bensound.com/royalty-free-music | Images & images license: https://stocksnap.io/license and others | With thanks to user Roger Dahl (https://askubuntu.com/users/53661), user radeklos (https://askubuntu.com/users/29398), user its_me (https://askubuntu.com/users/36459), user Craig Ringer (https://askubuntu.com/users/75715), user christianbundy (https://askubuntu.com/users/401449), and the Stack Exchange Network (http://askubuntu.com/questions/256534). Trademarks are property of their respective owners. Disclaimer: All information is provided "AS IS" without warranty of any kind. You are responsible for your own actions. Please contact me if anything should be amiss at Roel D.OT VandePaar A.T gmail.com.