提问



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


这就是我所拥有的:


psql -Umyuser < myscript.sql


但是,我无法找到传递密码的参数,因此psql总是会提示它。

最佳参考


有几种方法可以对PostgreSQL进行身份验证。您可能希望在https://www.postgresql.org/docs/current/static/client-authentication.html上调查密码验证的替代方案。[22]


要回答您的问题,有几种方法可以为基于密码的身份验证提供密码。显而易见的方法是通过密码提示。您可以在pgpass文件中或通过PGPASSWORD环境变量提供密码,而不是这样。看到这些:



  • https://www.postgresql.org/docs/9.0/static/libpq-pgpass.html

  • https://www.postgresql.org/docs/9.0/interactive/libpq-envars.html



没有选项可以将密码作为命令行参数提供,因为该信息通常可供所有用户使用,因此不安全。但是,在Linux/Unix环境中,您可以为单个命令提供环境变量,如下所示:[23] [24]


PGPASSWORD=yourpass psql ...

其它参考1


PGPASSWORD=[your password] psql -Umyuser < myscript.sql

其它参考2


您可以在脚本开头添加此命令行:


set PGPASSWORD=[your password]

其它参考3


如果您打算拥有多个主机/数据库连接,那么〜/.pgpass文件就可以了。[25]


脚步:



  1. 创建〜/.pgpass文件。使用以下格式输入您的信息hostname:port:database:username:password

  2. 不要在字段值周围添加字符串引号。您还可以使用*作为端口/数据库字段的通配符。

  3. 在bash配置文件中创建一个别名,为您运行psql命令。例如:alias postygresy='psql --host hostname database_name -U username'值应与您输入到〜/.pgpass文件的值匹配。

  4. 获取您的bash个人资料。

  5. 从命令行键入别名。



请注意,如果您设置了导出PGPASSWORD =变量,则它将优先于该文件。更改文件的权限以便从其他用户隐藏内容也是明智之举。这可以用chmod 600 ~/.pgpass来实现

其它参考4


您必须创建密码文件:有关详细信息,请参阅http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html。[26]

其它参考5


如果你在像我这样的Windows上遇到问题(我使用的是Windows 7 64位)并且set PGPASSWORD=[Password]不起作用。


然后,正如Kavaklioglu在其中一条评论中所说的那样,


export PGPASSWORD=[password]


您需要将其保存在文件的顶部,或者在任何使用之前保存,以便在调用之前将其保存。


当然可以在Windows上工作:)

其它参考6


鉴于使用PGPASSWORD环境变量的安全性问题,我认为最好的整体解决方案如下:



  1. 使用您要使用的密码编写您自己的临时pgpass文件。

  2. 使用PGPASSFILE环境变量告诉psql使用该文件。

  3. 删除临时pgpass文件



这里有几点需要注意。第1步是为了避免与可能存在的用户s~/.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

其它参考7


建立在mightybyte对那些不熟悉 * nix shell脚本的人的回答的基础上,这是一个工作脚本:


#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
chmod 600 $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE


第2行/tmp/pgpasswd$$中的双美元符号($$)将进程ID号附加到文件名,这样该脚本可以多次运行,甚至同时运行,没有副作用。


注意在第4行使用chmod命令 - 就像 mightybyte 描述的 not plain file 错误一样,还有一个< em> permissions 如果没有这样做,则会出错。


在第6行,您不必使用-h myserver ,-p myport 或-U jdoe 标志,如果您使用默认值( localhost : 5432 )并且只有一个数据库用户。对于多个用户,(但默认连接)更改该行至


psql mydb jdoe


不要忘记使用脚本可执行文件



  chmod +x runpsql(或任何你称之为脚本文件的)


其它参考8


它可以简单地使用PGPASSWORD完成。我正在使用psql 9.5.10。在你的情况下,解决方案将是


PGPASSWORD=password psql -U myuser < myscript.sql

其它参考9


您可能会发现这很有用:Windows PSQL命令行:有没有办法允许无密码登录?

其它参考10


我发现,即使您定义了PGPASSWORD变量,psql显示密码提示,但您可以为psql指定-w选项以省略密码提示。

其它参考11


在命令中使用-w:
psql -h localhost -p 5432 -U用户-w