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

Axe*_*ine 248 postgresql psql

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

这就是我所拥有的:

psql -Umyuser < myscript.sql
Run Code Online (Sandbox Code Playgroud)

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

Ree*_*ece 290

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

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

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

PGPASSWORD=yourpass psql ...
Run Code Online (Sandbox Code Playgroud)

  • 是的,它已被弃用(并在其中一个链接中注明).由于它的出现,可能还值得注意的是,这种弃用受到了激烈的争议,因为它对许多人来说非常有用,但在某些情况下可以使用而没有严重的安全问题.在我看来,这并不比将.pgpass存储在NFS文件系统上更糟糕.我经常使用PGPASSWORD. (32认同)
  • 我认为PGPASSWORD已被弃用但仍然可以使用,顺便说一句.仅供参考 (11认同)
  • 命令行信息“可供所有用户使用”的想法是基于关于多用户系统的过时假设,不适用于大多数系统只运行单个应用程序并且全部自动化的现代环境 (4认同)
  • 快进 2021 年:对于使用 Postgresql 版本 13 的任何人 - `PGPASSWORD=yourpass psql ...` 似乎不再适用于版本 13(在我的例子中是 Debian 10),因此我成功地使用了连接字符串,如中所述[官方文档](https://www.postgresql.org/docs/13/) (4认同)
  • 对我有用。Mac 上的“psql (PostgreSQL) 13.2”。 (2认同)

Gre*_*reg 152

PGPASSWORD=[your password] psql -Umyuser < myscript.sql
Run Code Online (Sandbox Code Playgroud)


jba*_*ina 66

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

set PGPASSWORD=[your password]
Run Code Online (Sandbox Code Playgroud)

  • 在我的情况下,set命令不起作用,但`export PGPASSWORD = [password]`确实有效 (22认同)
  • 尽量不要使用空格,例如。`PGPASSWORD=密码`。 (2认同)

tan*_*ndy 47

如果您打算拥有多个主机/数据库连接,那么〜/ .pgpass文件就是您的选择.

脚步:

  1. 创建〜/ .pgpass文件.使用以下格式输入您的信息hostname:port:database:username:password
  2. 不要在字段值周围添加字符串引号.您还可以使用*作为端口/数据库字段的通配符.
  3. 在bash配置文件中创建一个别名,为您运行psql命令.例如:vim ~/.pgpass值应与您输入到〜/ .pgpass文件的值相匹配.
  4. 来源您的bash档案.
  5. 从命令行键入别名.

请注意,如果您设置了导出PGPASSWORD =''变量,则它将优先于该文件.更改文件的权限以便从其他用户隐藏内容也是明智之举.这可以通过实现hostname:port:database:username:password

  • 您必须对文件执行“chmod 600”,否则“psql”将默默地忽略它(根据文档)。 (2认同)

ajx*_*jxs 24

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

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

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
Run Code Online (Sandbox Code Playgroud)

  • Postrgres 9.3 忽略环境变量`PGPASSWORD` (2认同)

Fem*_*emi 12

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


Jam*_*ber 12

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

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

export PGPASSWORD=[password]
Run Code Online (Sandbox Code Playgroud)

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

当然可以在Windows上工作:)


ubi*_*ubi 12

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

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

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

postgres=>
Run Code Online (Sandbox Code Playgroud)

  • 这对于其他方法不起作用的健全性测试很有用。此外,将密码保留在 shell 历史记录之外就像[在命令前加一个空格](https://digi.ninja/blog/hiding_bash_history.php) 一样简单。 (2认同)

mig*_*yte 6

鉴于使用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
Run Code Online (Sandbox Code Playgroud)

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

WARNING: password file "/dev/fd/63" is not a plain file
Run Code Online (Sandbox Code Playgroud)


pyA*_*ict 6

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

PGPASSWORD=password psql -U myuser < myscript.sql


Eli*_*las 5

基于mightybyte的答案,对那些不熟悉*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
Run Code Online (Sandbox Code Playgroud)

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

请注意chmod在第4行使用命令 - 就像强大的描述中的" 非普通文件 "错误一样,如果不这样做,也会出现" 权限 "错误.

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

psql mydb jdoe
Run Code Online (Sandbox Code Playgroud)

不要忘了使脚本可执行

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

  • 您可以使用[`mktemp`](https://en.wikipedia.org/wiki/Mktemp)创建临时文件,而不是提出自己的命名方案.它创建一个新的临时文件(在Linux中命名为`/ tmp/tmp.ITXUNYgiNh`,在MacOS X上命名为`/ var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4`)并将其名称输出到stdout. (4认同)
  • **安全问题** 最好在创建文件之后,但在向其写入密码之前执行`chmod 600`。正如所写,服务器上的恶意脚本可能会不断尝试读取这种格式的文件,有时会成功获取密码。此外,如果这个脚本由于某种原因被中断,文件将留在磁盘上 - 编写一个 shell `trap` 处理程序可以解决这个问题。鉴于编写这样的安全脚本并非易事,我建议改用 `export PGPASSWORD`。 (2认同)