![Postgres:在非交互式脚本中以 postgres 用户身份进行身份验证](https://linux22.com/image/53479/Postgres%EF%BC%9A%E5%9C%A8%E9%9D%9E%E4%BA%A4%E4%BA%92%E5%BC%8F%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BB%A5%20postgres%20%E7%94%A8%E6%88%B7%E8%BA%AB%E4%BB%BD%E8%BF%9B%E8%A1%8C%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81.png)
我正在编写一个需要执行 postgres 命令的非交互式脚本。该脚本只能由root
具有权限的用户运行sudo
,并且 postgres 命令需要以postgres
postgresql 中的用户身份执行。问题是 postgresql 总是(据我所知)交互式地提示输入密码(即pqsl -U postgres -W
)或根本不接受密码(即psql -U postgres -w
)。我想在命令行上传递密码,类似于 mysql 允许的方式mysql -u user -p password
。我怎样才能用 postgres 做到这一点?
答案1
答案2
有两种方法可以做同样的事情。
方法一:
.pgpass
在用户(运行脚本的用户)的主目录中添加一个文件:
$ cat /home/user/.pgpass
hostname:port:database:user:password
$ chmod 600 /home/user/.pgpass
添加上述内容后,您无需在使用的任何脚本中添加密码。它将直接连接。
方法2:
在 shell 脚本中添加以下内容。但是,如果您提交到任何存储库,这会暴露您的密码并成为问题。
export PGPASSWORD=password
答案3
如果您可以作为用户 postgres 运行 psql,最有用的解决方案是修改 pg_hba.conf,以便通过 localhost/socket 连接的 Unix 用户 postgres 无需任何密码或外部文件即可进行身份验证。在文件的顶部插入:
local all postgres peer
这一点,TBMI是默认的。也许有人认为当他们删除这条线时他们很聪明或更安全,我不知道。您还可以使用类似的东西来进行监控服务:
local zabbix zabbix peer
您为其创建一个名为“zabbix”的用户名和数据库。