如何调用psql以使它不提示输入密码?

这是我所拥有的:

psql -Umyuser < myscript.sql

但是,我找不到传递密码的参数,所以psql总是提示输入这个参数。


当前回答

使用PGPASSWORD环境变量的替代方法是根据文档使用conninfo字符串

指定连接参数的另一种方法是在conninfo中 字符串或URI,用来代替数据库名称。这 机制使您可以对连接进行非常广泛的控制。

$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"

postgres=>

其他回答

你必须创建一个密码文件:更多信息请参见http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html。

你可以在脚本的开头添加这个命令行:

export PGPASSWORD="[your password]"

在Windows上工作的url字符串和使用psql选项的组合:

> psql -d postgresql://username:password@localhost:5432/mydb -f myscript.sql

传递没有-d的命令没有工作,只是连接到数据库,但没有执行脚本

考虑到使用PGPASSWORD环境变量的安全问题,我认为最佳的整体解决方案如下:

用您想使用的密码编写自己的临时pgpass文件。 使用PGPASSFILE环境变量告诉psql使用该文件。 删除临时pgpass文件

这里有几点需要注意。步骤1是为了避免混淆用户的~/。Pgpass文件可能存在。您还必须确保该文件的权限为0600或更小。

一些人建议使用bash来实现如下的快捷方式:

PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb

它使用<()语法来避免将数据写入实际文件。但它不起作用,因为psql检查正在使用的文件,并抛出如下错误:

WARNING: password file "/dev/fd/63" is not a plain file

使用PGPASSWORD环境变量的替代方法是根据文档使用conninfo字符串

指定连接参数的另一种方法是在conninfo中 字符串或URI,用来代替数据库名称。这 机制使您可以对连接进行非常广泛的控制。

$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"

postgres=>