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
/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:
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
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'
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
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.