如何从 shell 找到 pg_hba.conf 的路径?

如何从 shell 找到 pg_hba.conf 的路径?

我想从 shell 获取 pg_hba.conf 的路径。该路径因 PostgreSQL 版本而异。例如,对于 8.4 和 9.1:

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

我已尝试该pg_config命令,但它似乎不包含该信息。

这样我就可以使用统一的命令来打开pg_hba.conf和编辑其他 PostgreSQL 配置文件。

我正在使用 bash。

答案1

pg_config用于编译信息,帮助扩展和客户端程序编译和链接 PostgreSQL。它对机器上的活动 PostgreSQL 实例一无所知,只知道二进制文件。

pg_hba.conf可以出现在很多其他地方,具体取决于 Pg 的安装方式。标准位置是pg_hba.conf在数据库内data_directory(可以是/home/var/lib/pgsql/var/lib/postgresql/[version]//opt/postgres/等等),但用户和打包者可以将其放在他们喜欢的任何地方。不幸的是。

唯一有效的查找方法pg_hba.conf是询问正在运行的 PostgreSQL 实例它在哪里pg_hba.conf,或者询问系统管理员它在哪里。您甚至不能依赖于询问数据目录在哪里并进行解析,postgresql.conf因为初始化脚本可能会传递参数,就像-c hba_file=/some/other/path启动 Pg 时一样。

你要做的是询问 PostgreSQL:

SHOW hba_file;

此命令必须在超级用户会话中运行,因此对于 shell 脚本,您可以编写如下内容:

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

并设置环境变量PGUSERPGDATABASE等,以确保连接正确。

是的,这有点像先有鸡还是先有蛋的问题,如果用户无法连接(比如,在搞砸了编辑之后pg_hba.conf),您就无法找到pg_hba.conf并修复它。

另一个选择是查看ps命令的输出并查看 postmaster 数据目录参数是否-D在那里可见,例如

ps aux  | grep 'postgres *-D'

因为pg_hba.conf将位于数据目录中(除非您使用 Debian/Ubuntu 或某些衍生版本并使用它们的软件包)。

如果您专门针对从 Debian/Ubuntu 软件包安装 PostgreSQL 的 Ubuntu 系统,那么事情会变得简单一些。您不必处理手动编译的源代码 Pg(某人的initdb主目录中的数据目录),或者在 /opt 中安装 EnterpriseDB Pg 等。您可以询问pg_wrapperDebian/Ubuntu 多版本 Pg 管理器,PostgreSQL 正在使用命令pg_lsclusterspg_wrapper

如果您无法连接(Pg 没有运行,或者您需要编辑pg_hba.conf才能连接),则必须在系统中搜索pg_hba.conf文件。在 Mac 和 Linux 上,类似这样的sudo find / -type f -name pg_hba.conf操作即可。然后检查PG_VERSION同一目录中的文件,以确保它是正确的 PostgreSQL 版本(如果您有多个)。(如果pg_hba.conf/etc/ 中,请忽略它,它是父目录名称)。如果您有多个相同 PostgreSQL 版本的数据目录,则必须查看数据库大小,检查正在运行的 postgres 的命令行,以ps查看它的数据目录-D参数是否与您正在编辑的位置匹配,等等。

答案2

我是这样做的:

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

由于路径是这样的:/etc/postgresql/[VERSION]/main/pg_hba.conf

答案3

使用命令行询问您的数据库:

$ psql -U postgres
postgres=# SHOW config_file;

答案4

要查找 pg_hba.conf 的路径,请使用以下命令:

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

相关内容