如何非交互式地指定psql的密码?

我正在尝试使用shell脚本自动化数据库创build过程,还有一件事是通过将密码传递给psql来实现的。 以下是shell脚本的一些代码:

psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL" 

如何以非交互方式将密码传递给psql?

谢谢!

从官方文档 :

有一个〜/ .pgpass文件以避免经常input密码也很方便。 有关更多信息,请参见第30.13节 。

在调用psql之前,在脚本中设置PGPASSWORD环境variables

 PGPASSWORD=pass1234 psql -U MyUsername myUserName 

有关参考,请参阅http://www.postgresql.org/docs/current/static/libpq-envars.html


编辑

自Postgres 9.2以来,也可以select指定一个包含用户名密码的连接URL 。

使用这种方式存在安全风险,因为如果使用ps (Linux),ProcessExplorer(Windows)或类似工具查看正在运行的进程的命令行,密码可以用纯文本显示。

另请参阅数据库pipe理员的这个问题

  • 在一行中:

     export PGPASSWORD='password'; psql -h 'server name' -U 'user name' -d 'base name' -c 'command' 

    命令一个sql命令如"select * from schema.table"

  • 或更可读:

     export PGPASSWORD='password' psql -h 'server name' -U 'user name' -d 'base name' \ -c 'command' (eg. "select * from schema.table") 

这可以通过在(Linux)用户的主目录中创build一个.pgpass文件来完成。 .pgpass文件格式:

 <databaseip>:<port>:<databasename>:<dbusername>:<password> 

你也可以使用通配符*代替细节。

假设我想运行tmp.sql而不提示input密码。

用下面的代码你可以在* .sh文件中

 echo "192.168.1.1:*:*:postgres:postgrespwd" > $HOME/.pgpass echo "` chmod 0600 $HOME/.pgpass `" echo " ` psql -h 192.168.1.1 -p 5432 -U postgres postgres -f tmp.sql ` 

在Windows上

  1. 赋值给PGPASSWORD:

C:\ Windows \ system32> set PGPASSWORD = clave

  1. 运行命令

C:\ Windows \ system32> psql -d basededatos -U usuario

准备