339

如何调用psql使其不提示输入密码

这就是我所拥有的:

psql -Umyuser < myscript.sql

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

4

16 回答 16

417

您可能希望阅读对 PostgreSQL 进行身份验证的方法的摘要。

要回答您的问题,有几种方法可以为基于密码的身份验证提供密码:

  1. 通过密码提示。例子:

    psql -h uta.biocommons.org -U foo
    Password for user foo: 
    
  2. 在 pgpass 文件中。请参阅libpq-pgpass。格式:

    <host>:<port>:<database>:<user>:<password>
    
  3. PGPASSWORD环境变量. 请参阅libpq-envars。例子:

    export PGPASSWORD=yourpass
    psql ...
    
    # Or in one line for this invocation only:
    PGPASSWORD=yourpass psql ...
    
  4. 在连接字符串中可以在连接字符串/URI 中指定密码和其他选项。请参阅 app-psql。例子:

    psql postgresql://username:password@dbmaster:5433/mydb?sslmode=require
    
于 2011-06-29T16:39:27.153 回答
185
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
于 2013-12-04T07:48:24.623 回答
73

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

set PGPASSWORD=[your password]
于 2011-09-19T16:19:53.743 回答
57

这可能是一个老问题,但是您可以使用另一种没有人提到的方法。可以直接在连接 URI 中指定密码。文档可以在这里找到,或者在这里

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

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
于 2018-11-02T13:25:13.553 回答
55

如果您打算拥有多个主机/数据库连接,则~/.pgpass 文件是要走的路。

脚步:

  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. 从命令行键入您的别名。

请注意,如果您设置了 export PGPASSWORD='' 变量,它将优先于文件。

于 2015-01-13T17:38:35.877 回答
17

使用PGPASSWORD环境变量的另一种方法是conninfo根据文档使用字符串

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

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

postgres=>
于 2019-11-09T23:40:25.730 回答
14

如果您在像我这样的 Windows 上遇到问题(我使用的是 Windows 7 64 位)并且set PGPASSWORD=[Password]无法正常工作。

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

export PGPASSWORD=[password]

您需要将其保存在文件顶部,或在任何使用之前保存,以便在调用之前对其进行设置。

当然可以在 Windows 上工作:)

于 2014-03-27T16:21:51.263 回答
12

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

于 2011-06-29T15:24:55.207 回答
8

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

  1. 使用您要使用的密码编写您自己的临时 pgpass 文件。
  2. 使用 PGPASSFILE 环境变量告诉 psql 使用该文件。
  3. 删除临时 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
于 2014-12-05T17:36:01.713 回答
8

只需使用 PGPASSWORD 即可完成。我正在使用 psql 9.5.10。在您的情况下,解决方案是

PGPASSWORD=password psql -U myuser < myscript.sql

于 2018-01-19T06:53:16.293 回答
5

对于不熟悉*nix shell 脚本的人来说,基于mightybyte 的回答,这里有一个工作脚本:

#!/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 号附加到文件名中,因此该脚本可以多次运行,甚至可以同时运行,而不会产生副作用。

请注意第chmod4 行命令的使用 - 就像mayybyte描述的“不是普通文件”错误一样,如果不这样做,也会出现“权限”错误。

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

psql mydb jdoe

不要忘记使脚本可执行

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

更新:

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

于 2016-11-15T16:11:29.620 回答
2

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

于 2011-06-29T15:33:38.613 回答
1

8年后...

在我的 Mac 上,我必须在文件中添加一行, ~/.pgpass例如:

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

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

于 2019-08-13T09:19:04.810 回答
0

这也适用于其他 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 &
于 2020-11-13T21:18:56.133 回答
-1

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

于 2017-07-20T09:12:14.097 回答
-6

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

于 2016-12-22T17:43:02.910 回答