当前位置: 首页>>技术问答>>正文


如何从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。

最佳解决思路

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

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

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

你想要做的是问PostgreSQL:

SHOW hba_file;

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

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

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

是的,这有点像chicken-and-egg问题,因为如果用户无法连接(例如,在编辑pg_hba.conf之后),则无法找到pg_hba.conf来修复它。

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

ps aux  | grep 'postgres *-D'

因为pg_hba.conf将在数据目录中(除非您使用的是Debian /Ubuntu或某些衍生产品并使用其软件包)。

如果您专门针对使用Debian /Ubuntu软件包安装PostgreSQL的Ubuntu系统,它会变得更容易一些。您不必处理hand-compiled-from-source Pg,其中有人的initdb‘dad datadir用于其主目录,或者EnterpriseDB Pg安装在/opt等。您可以询问pg_wrapper,Debian /Ubuntu multi-version Pg管理器,其中PostgreSQL正在使用pg_wrapperpg_lsclusters命令。

如果您无法连接(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版本的多个数据目录,则必须查看数据库大小,请检查来自ps的正在运行的postgres的命令行,以查看它的数据目录-D参数是否与您正在编辑的位置相匹配等。

次佳解决思路

我是这样做的:

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

第三种解决思路

我使用以下配置文件检测:

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1126.html,未经允许,请勿转载。