我有一个正在运行的 PostgreSQL 数据库。现在我想自动执行数据库上的某些操作,但我的密码有问题。
我正在使用以下 bash 脚本:
#!/bin/bash
export PGPASSWORD="postgres"
sudo -u postgres psql -d pg_ldap -w --no-password -h localhost -p 5432 -t -c "SELECT id FROM radusers WHERE id=1"
当我运行 bash 脚本时出现以下错误:
psql: fe_sendauth: no password supplied
我甚至尝试在我的主目录中配置 .pgpass 文件但无济于事:
*:*:*:postgres:postgres
我已经运行以下命令:
sudo chmod 0600 .pgpass
然而,似乎没有任何方法有效。有人知道吗?我是不是忘了做某事?
答案1
sudo
不保留大多数环境变量。如果您想为在 下运行的命令指定环境变量sudo
,请这样做sudo
:
sudo PGPASSWORD="postgres" -u postgres psql -d pg_ldap -w --no-password -h localhost -p 5432 -t -c "SELECT id FROM radusers WHERE id=1"
是否sudo
允许这样做取决于您网站现行的安全策略。
我不推荐这种方法,因为它会在命令行历史记录和进程列表中暴露密码。最好使用文件.pgpass
,或者最好设置pg_hba.conf
为对来自用户的连接peer
进行身份验证。local
postgres
您可以使用.pgpass
文件,但它必须是您要访问的.pgpass
用户的文件,而不是您要访问的用户的文件sudo
sudo
从;在这种情况下它需要这样做~postgres/.pgpass
。想想看:psql
以 身份运行postgres
并不知道您是从您的帐户运行的sudo
,它不知道您的用户帐户是什么,即使它知道,它也没有以用户身份读取 的postgres
权限~youruser/.pgpass
。
此外,-w
与 相同--no-password
。没有必要同时指定两者。
答案2
如果没有提供数据库密码,就会发生这种情况。
default="postgres://postgres:[email protected]:5432/DBname"
答案3
我甚至尝试配置 .pgpass 文件在我的主目录中但无济于事:
您需要在运行该命令的账户的主目录中创建 .pgpass 文件查询语言命令,即PostgreSQL 的帐户,不是你的!
psql-d pg_ldap-w --无密码...
我认为这些选项可能也会造成混淆。
两者的意思是一样的,具体来说就是“不要使用密码”。
我建议删除这些。 psql 会承认需要密码,但应该检测正确放置的 .pgpass 文件并使用它来代替询问输入密码。
当然,你的 postgres 账户密码不是真的“postgres”,是吗?:-)