PostgreSQL 免密登录:一篇文章讲清楚
.pgpass 文件,psql 和其他客户端会自动读取里面的密码。hostname:port:database:username:password
* 匹配任意值。# 本机 5432 端口 mydb 数据库 chai 用户
localhost:5432:mydb:chai:mypassword123
# 内网服务器 192.168.1.100 的所有数据库 postgres 用户
192.168.1.100:5432:*:postgres:anotherpassword
# 匹配所有情况(谨慎使用)
*:*:*:*:superpassword
psql -h localhost -U chai -d mydb
chmod 600 ~/.pgpass,权限错了 PostgreSQL 会直接忽略这个文件,不报错,但就是连不上。%APPDATA%\postgresql\pgpass.conf\: 和 \\ 转义pg_hba.conf(通常在数据目录下,或者 /etc/postgresql/版本号/main/):# 本地 Unix socket 连接,所有用户都不用密码
local all all trust
# 本机 IP 地址连接,不用密码
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
# 只允许某个内网网段
host all all 192.168.1.0/24 trust
pg_ctl reload # 或者 systemctl reload postgresql
local all postgres peer
local all all peer
# 假设当前 Linux 用户是 chai
createuser -U postgres chai
createdb -U postgres -O chai chaidb
psql -d chaidb
export PGPASSWORD=yourpassword
psql -h localhost -U chai -d mydb
PGPASSWORD=yourpassword
psql -h localhost -U chai -d mydb
ps aux 或 /proc/PID/environ 别人可能看到密码export PGPASSWORD=xxx ;psql -U chai -d mydb -c "SELECT 1;" ;unset PGPASSWORD
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'root.crt'
# 生成客户端私钥
openssl genrsa -out ~/.postgresql/client.key 2048
chmod 600 ~/.postgresql/client.key
# 生成 CSR
openssl req -new -key ~/.postgresql/client.key -out ~/.postgresql/client.csr -subj "/CN=chai"
# 用 CA 证书签名
openssl x509 -req -in ~/.postgresql/client.csr -CA root.crt -CAkey root.key -CAcreateserial -out ~/.postgresql/client.crt -days 3650
hostssl all all 0.0.0.0/0 cert
psql "host=myserver user=chai dbname=mydb sslmode=verify-full"
~/.postgresql/client.crt 和 client.key 登录。~/.pg_service.conf:[mydb]
host=localhost
port=5432
dbname=mydb
user=chai
[production]
host=prod-db.example.com
port=5432
dbname=appdb
user=appuser
sslmode=require
psql service=mydb # 或者 psql "service=production"
.pgpass 使用,效果最好。.pgpass 文件 + peer 认证,安全方便不折腾.pg_service.conf + .pgpass 组合拳chai 0 2 * * * psql -d mydb -c "SELECT my_function();" >> /var/log/mydb.log 2>&1
.pgpass 文件即可。.pgpass 权限问题password authentication failed 的报错,但根本不知道是权限问题。chmod 600 ~/.pgpass 永远是第一步检查。pg_hba.conf 改了没 reloadpg_ctl reload 或者 systemctl reload,否则老规则依然生效。很多人改完配置不重启,怀疑人生一小时。psql -h localhost 是 TCP 连接,走不了 peer。不带 -h 参数才是 Unix socket 连接。host all all 0.0.0.0/0 md5 host all all 192.168.1.1/32 trust
trust 永远不会生效。.pgpass。
夜雨聆风