psql连接PostgreSQL数据库时特殊符号密码转义失败报错咨询
psql密码含特殊符号连接失败解决方案
报错原因
你遇到的报错是两个问题叠加导致的:
- 双引号包裹密码段时,shell会解析内部的转义符,破坏连接URI的结构
- postgres连接URI要求特殊字符必须做URL百分号编码,未编码的
@会被psql误识别为用户名和主机名的分隔符,导致后续密码内容被当成主机名解析,触发无法解析主机的报错。
解决方案
方案1:优先使用参数传递(无转义成本,最稳妥)
交互模式
直接执行带参数的psql命令,回车后手动输入密码,完全不需要处理转义:
psql -h HOST -p 5432 -U USERNAMER -d DB_NAME -W
非交互脚本模式
用单引号包裹密码赋值给PGPASSWORD环境变量,单引号内的所有字符会被shell原样传递,不需要额外转义:
PGPASSWORD='@efszP&\39D7"d_' psql -h HOST -p 5432 -U USERNAMER -d DB_NAME
方案2:使用连接URI格式(需先做URL编码)
先对原密码@efszP&\39D7"d_的特殊字符做百分号编码:
@编码为%40&编码为%26\编码为%5C"编码为%22
编码后的密码为:%40efszP%26%5C39D7%22d_
直接代入连接URI即可,不需要额外加引号或转义符:
psql postgres://USERNAMER:%40efszP%26%5C39D7%22d_@HOST:5432/DB_NAME
安全建议
生产环境不要将明文密码写在命令行中,会被进程列表工具获取到。建议配置.pgpass文件存储密码:
- 在用户根目录新建
.pgpass文件,写入内容:
HOST:5432:DB_NAME:USERNAMER:@efszP&\39D7"d_
- 设置文件权限为仅当前用户可读:
chmod 600 ~/.pgpass
配置完成后直接执行psql -h HOST -p 5432 -U USERNAMER -d DB_NAME即可自动读取密码登录。
内容的提问来源于stack exchange,提问作者Eyal Solomon
相关产品推荐
相关产品推荐

