如何在没有密码提示的情况下使用 psql?

Maj*_*imi 106 postgresql psql

我写了一个脚本来REINDEX索引数据库中的索引。这是其中之一:

echo -e "\nreindex for unq_vbvdata_vehicle started at: `date "+%F %T"`" >> ${LOG_FILE}
psql -U ${USERNAME} -h ${HOSTNAME} -d ${DBNAME} -c "REINDEX INDEX scm_main.unq_vbvdata_vehicle;"
if [[ ${?} -eq 0 ]]; then
    echo "reindex for unq_vbvdata_vehicle finished at: `date "+%F %T"`" >> ${LOG_FILE}
else
    echo "reindex for unq_vbvdata_vehicle failed" >> ${LOG_FILE}
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

问题是我无法在独立模式下运行此脚本。psql每次运行都提示输入密码。还有两个限制:

  1. 我无法在没有密码的数据库上创建用户。

  2. 因为REINDEX锁表,我应该sleep <num>在每个REINDEX.

有没有自动解决方案?

a_h*_*ame 152

关于密码提示,您有四种选择:

  1. 设置 PGPASSWORD 环境变量。有关详细信息,请参阅手册:http :
    //www.postgresql.org/docs/current/static/libpq-envars.html
  2. 使用 .pgpass 文件来存储密码。有关详细信息,请参阅手册:http :
    //www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. 对该特定用户使用“信任身份验证”:http :
    //www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. 使用包含所有内容的连接 URI:http :
    //www.postgresql.org/docs/current/static/libpq-connect.html#AEN42532

  • 从 PostgreSQL 9.1 开始,本地连接也有“peer”认证方法。目前仅适用于 Linux、BSD、OS X 或 Solaris(不适用于 Windows)。 (5认同)
  • 轻松使用 `export PGPASSWORD="your_pw"` 转到版本 1 (2认同)

pdm*_*pdm 32

一个简单的例子PGPASSWORD将是这样的:

PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。

  • 请注意,这仍然会将您的密码暴露给命令 shell 历史记录。 (5认同)
  • 嗨 Ian_H,感谢您的评论,我都同意您的观点。接受的答案非常全面,确实解决了我的问题。我把我的答案放在这个旧帖子上的原因是因为它对我来说仍然不简单,因为我相信其他人可能也有同样的感觉。 (4认同)
  • 这绝对是对已接受答案的一个很好的补充 - 有用的提醒我们不需要永久设置 ENV 变量。 (3认同)

小智 5

根据您的帐户权限,未指定数据库的示例可能会失败,因为会根据您连接到的数据库检查用户权限。最好也明确指定数据库。

# this can fail.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME    

# this is more likely to work, assuming given account has permissions to that database.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME -d YOUR_DATABASE  
Run Code Online (Sandbox Code Playgroud)


Jer*_*son 5

Windows中,您可以在系统范围内设置它:

SETx PGPASSWORD YourPassword /M 
Run Code Online (Sandbox Code Playgroud)

或者为了安全起见,如果您不想在系统范围内使用它,您可以一行登录:

set PGPASSWORD=YourPassword&& psql -d database -U user
Run Code Online (Sandbox Code Playgroud)