手动运行psql不弹密码,定时备份却卡在提示符。先查执行脚本的身份:你登录时的家目录和服务运行时读到的密码文件,可能根本不是同一份。

先找运行账号的文件
在Unix上libpq默认查找用户家目录下的.pgpass,也可用PGPASSFILE或连接参数passfile指定。先核对定时服务的用户与实际文件路径。不要用自己交互终端的环境代替服务环境判断。
检查读取权限
用stat -c "%a %U %n" /path/to/pgpass在Linux检查权限和属主。文件对组或其他用户开放时,libpq在Unix会忽略它;按需用chmod 0600 /path/to/pgpass并确保执行账号可读。别用放宽权限来解决身份不符。
按真实参数匹配第一条
每行格式是hostname:port:database:username:password。前四列可用星号匹配,先放具体条目;冒号或反斜杠出现在字段中需用反斜杠转义。第一条匹配项生效,后面更具体的项不能覆盖它。
不要混淆域名与IP
连接使用host时优先按host匹配,未给host才看hostaddr;两者都没给时按localhost查找。默认套接字目录也有localhost匹配规则。文件写localhost而脚本明确写127.0.0.1时,应按实际参数调整。连接串已提供密码时无需从该文件查找。
以同账号做非交互验收
在萤光云或LightNode的独立实例先用无敏感数据的测试库演练。然后用服务账号和相同参数执行psql -w -h db.example.com -p 5432 -U backup -d app -c "SELECT current_database(), current_user;"。-w禁止交互提示,缺少可用密码会直接失败。验证目标库和账号正确;若要证明密码确实来自该文件,还需排除连接串密码及其他认证方式。
FAQ
同一个文件能放多个库吗? 可以,使用独立匹配行。
权限0644可用吗? Unix上会被忽略。
Windows权限检查一样吗? 不是,libpq假定密码文件放在安全目录。
能把密码写进命令行吗? 避免这样做,可能进入历史和进程信息。
失败一定是密码文件吗? 不是,还需区分网络、认证策略和角色权限错误。
温馨提示
密码文件是明文敏感配置。不要在日志、备份报告或故障截图里展示内容;脚本应在连接失败时返回非零退出码。


