PostgreSQL外部执行命令时加密密码失效问题求助
PostgreSQL复制检查脚本密码问题解决办法
问题原因
你直接把MD5哈希值放到PGPASSWORD环境变量里的做法是错误的:
- PostgreSQL的MD5认证哈希是用户名与明文密码拼接后加密的结果(格式为
md5{哈希值}),并非单纯的密码哈希 PGPASSWORD环境变量要求传入的是明文密码,不是哈希值。你把哈希当作明文密码传入,PostgreSQL会用这个字符串去和数据库存储的认证哈希做匹配,自然无法通过验证,导致命令执行失败。
安全的替代方案
不要在命令行或环境变量中明文传递密码,推荐以下两种安全方式:
1. 使用pgpass密码文件(最安全)
创建一个pgpass文件,让psql自动读取密码:
- Linux/macOS:在用户主目录下创建
.pgpass文件,内容格式为:
然后设置严格的文件权限(否则psql会忽略该文件):localhost:54032:postgres:user_name:你的明文密码chmod 600 ~/.pgpass - Windows:在
%APPDATA%\postgresql目录下创建pgpass.conf文件,内容格式同上。
之后直接执行命令即可,无需指定密码:
psql -U user_name -p 54032 -c "select * from pg_stat_replication" -d postgres
2. 使用连接字符串(临时场景可用)
如果是临时操作,可以用连接字符串的方式,但注意密码会被记录在shell命令历史中:
psql "postgresql://user_name:你的明文密码@localhost:54032/postgres" -c "select * from pg_stat_replication"
额外提醒
如果必须使用环境变量,只能传入明文密码,但这种方式密码会暴露在环境变量列表中,不推荐在生产环境使用。
内容的提问来源于stack exchange,提问作者sandesh Jadhav
相关产品推荐
相关产品推荐

