一、实验背景
用psql客户端命令连接远程的PostgreSql数据库时,在命令中不能传密码,只能连接后,再按照提弹出密码输入提示输入密码(这一点感觉很别扭,在MySQL上就可以在命令中传入密码),如果这样的话就涉及到和服务器的交互(或者称之为会话),如果你要用shell脚本非交互式执行一些sql脚本,怎么办?
# psql -U postgres -p 5432 postgres
二、实验环境
操作系统: CentOS7.5 Minimal
IP: 192.168.1.106
PostgreSQL版本: 9.5
# systemctl status postgresql-9.5
# psql --help
三、解决方法
方法一:设置环境变量 PGPASSWORD
PGPASSWORD 是 PostgreSQL 系统环境变量,在客户端设置这后,那么在客户端连接远端数据库时,将优先使用这个密码。
# export PGPASSWORD="Postgres@123"
# psql -h 192.168.1.106 -p 5432 -U postgresql -d postgres
注意:设置环境变量 PGPASSWORD ,连接数据库不再弹出密码输入提示,从安全性方面考虑,这种方法并不推荐,使用完记得清楚操作历史
# unset PGPASSWORD
# history -c
方法二:修改服务器端pg_hba.conf文件
修改认证文件 $PGDATA/pg_hba.conf, 添加以下行, 并 reload使配置立即生效。
# vim /var/lib/pgsql/9.5/data/pg_hba.conf
######################################################
host postgres postgresql 192.168.1.0/24 trust
#######################################################
# pg_ctl reload -D $PGDATA
注:修改服务端 pg_hba.conf 并 reload 后,不再弹出密码输入提示。
方法三:在客户端设置.pgpass密码文件
通过在客户端 /home/postgres 目录下创建隐藏文件 .pgpass ,从而避免连接数据库时弹出密码输入提示。
格式: hostname:port:database:username:password
# mkdir /home/postgres
# cp -r /etc/skel/. /home/postgres
# vim /home/postgres/.pgpass
############################################
192.168.1.106:5432:postgres:postgres:Postgres@123
#############################################
注:在/home/postgres 目录创建了密码文件 .pgpass 文件后,并正确配置连接信息,那么客户端连接数据时会优先使用 .pgass文件, 并使用匹配记录的密码,从而不跳出密码输入提示。
四、参考
PostgreSql命令行不输入密码的两种方法
https://blog.csdn.net/sunsides/article/details/84370134
用客户端命令psql连接 PostgreSQL 不输入密码的方法
https://blog.csdn.net/zhu_xun/article/details/23347869