问题描述
我想从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';
并设置环境变量PGUSER
,PGDATABASE
等,以确保连接正确。
是的,这有点像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_wrapper
的pg_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)