Postgresql:用密码编写psql执行脚本

时间:2011-06-29 15:16:03

标签: postgresql psql

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

这就是我所拥有的:

psql -Umyuser < myscript.sql

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

16 个答案:

答案 0 :(得分:274)

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

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

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

PGPASSWORD=yourpass psql ...

答案 1 :(得分:146)

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

答案 2 :(得分:63)

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

set PGPASSWORD=[your password]

答案 3 :(得分:45)

如果您打算拥有多个主机/数据库连接,~/.pgpass file即可。

步骤:

  1. 使用vim ~/.pgpass或类似内容创建文件。以下列格式输入您的信息: hostname:port:database:username:password不要在字段值周围添加字符串引号。您还可以使用*作为端口/数据库字段的通配符。
  2. 您必须chmod 0600 ~/.pgpass才能使psql无法忽略它。
  3. 在bash配置文件中创建一个别名,为您运行psql命令。例如:alias postygresy='psql --host hostname database_name -U username'值应与您输入到〜/ .pgpass文件的值相匹配。
  4. 使用. ~/.bashrc或类似信息来源您的bash个人资料。
  5. 从命令行键入别名。
  6. 请注意,如果您设置了导出PGPASSWORD =''变量,则它将优先于该文件。

答案 4 :(得分:18)

这可能是一个古老的问题,但是您可以使用一种没有人提及的替代方法。可以直接在连接URI中指定密码。可以在herehere中找到该文档。

您可以直接在提供给psql的连接URI中提供用户名和密码:

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb

答案 5 :(得分:12)

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

答案 6 :(得分:12)

如果您在像我这样的Windows上遇到问题(我使用的是Windows 7 64位),set PGPASSWORD=[Password]无效。

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

export PGPASSWORD=[password]

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

当然可以在Windows上工作:)

答案 7 :(得分:6)

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

  1. 使用您要使用的密码编写您自己的临时pgpass文件。
  2. 使用PGPASSFILE环境变量告诉psql使用该文件。
  3. 删除临时pgpass文件
  4. 这里有几点需要注意。第1步是为了避免与用户可能存在的〜/ .pgpass文件混淆。您还必须确保该文件具有0600或更低的权限。

    有些人建议利用bash来快速执行此操作,如下所示:

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

    这使用&lt;()语法来避免需要将数据写入实际文件。但它不起作用,因为psql检查正在使用的文件,并将抛出这样的错误:

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

答案 8 :(得分:6)

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

PGPASSWORD=password psql -U myuser < myscript.sql

答案 9 :(得分:5)

mightybyte's answer的基础上为那些不熟悉 * nix shell脚本的人构建,这是一个工作脚本:

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

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

请注意第4行使用chmod命令 - 就像 mightybyte 所描述的“ not plain file ”错误一样,还有一个“如果没有这样做,权限“错误。

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

psql mydb jdoe

不要忘记使用

创建脚本可执行文件
  

chmod +x runpsql或您称之为脚本文件的任何内容

<强>更新

我提出了 RichVel 的建议,并在将密码输入之前使文件不可读。这关闭了一个小小的安全漏洞。 谢谢!

答案 10 :(得分:2)

答案 11 :(得分:2)

使用PGPASSWORD环境变量的另一种方法是根据documentation

使用conninfo字符串
  

在conninfo中指定连接参数的另一种方法   字符串或URI,而不是数据库名称。这个   机制使您可以非常广泛地控制连接。

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

postgres=>

答案 12 :(得分:0)

8年后...

在Mac上,我不得不在文件中添加一行 ~/.pgpass喜欢:

<IP>:<PORT>:<dbname>:<user>:<password>

另请参阅:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass

答案 13 :(得分:-1)

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

答案 14 :(得分:-1)

这也适用于其他postgresql cli,例如,您可以在非交互模式下运行pgbench。

export PGPASSWORD=yourpassword
/usr/pgsql-9.5/bin/pgbench -h $REMOTE_PG_HOST -p 5432 -U postgres -c 12 -j 4 -t 10000 example > pgbench.out 2>&1 &

答案 15 :(得分:-5)

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