如何非交互地为“ psql”指定密码?


337

我正在尝试使用Shell脚本来自动化数据库创建过程,而有一件事是我将密码传递给psql遇到了障碍。这是shell脚本中的一些代码:

psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"

如何psql以非交互方式将密码传递给?


1
您可以使用连接网址。在stackoverflow.com/questions/3582552/postgres-connection-url中检查此答案。
paulodiovani

Answers:


140

官方文档中

拥有〜/ .pgpass文件也很方便,可以避免定期输入密码。有关更多信息,请参见第30.13节

...

该文件应包含以下格式的行:

hostname:port:database:username:password

将使用第一行中与当前连接参数匹配的密码字段。


29
谢谢,我知道pgpass,但这不能解决问题-我需要一个自包含的bash脚本来对数据库进行操作,因此我想通过命令行将信息传递给psql。
亚历克斯N.

6
我认为您唯一的选择是设置您的bash脚本可以访问的.pgpass文件。或者根本不使用密码-您可以设置另一种身份验证形式,例如ident或使用SSL证书。
Flimzy 2011年

这就是我所担心的:)感谢您提供的信息!
亚历克斯N.

另一个选择可能是使用Expect。但我真的很讨厌期待:)
Flimzy 2011年

1
不要忘记删除组和其他用户的权限来读取,写入和执行.pgpass文件!跑步chmod go-rwx .pgpass
弗拉迪斯拉夫(Vladislavs Dovgalecs)

608

在调用psql之前,在脚本内设置PGPASSWORD环境变量

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

有关参考,请参见http://www.postgresql.org/docs/current/static/libpq-envars.html


编辑

从Postgres 9.2开始,还可以选择指定可以包含用户名密码的连接字符串或URI

使用该方法存在安全风险,因为当其他用户查看正在运行的进程的命令行(例如,使用ps(Linux),ProcessExplorer(Windows)或类似工具)时,密码以纯文本形式可见。

另请参阅有关数据库管理员的问题


32
例如,在一行中,您可以执行以下操作:PGPASSWORD = pass1234 psql -u MyUsername myUserName
andyortlieb 2013年

3
我认为这是简单运行SQL脚本的最便捷方法。
zr870

2
我只能添加- space在命令行中的第一个字符前添加a ,该命令将不会存储在bash历史记录中。适用于ubuntu / bash。
baldr

5
奖金:适用于Docker的作品:docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
Bilal Akil's

3
请注意并确保始终添加前面的空格,否则它将显示在您的bash历史记录〜/ .bash_history文件中……
rogerdpack

102
  • 一行:

    export PGPASSWORD='password'; psql -h 'server name' -U 'user name' -d 'base name' -c 'command'

    使用命令 sql命令,例如"select * from schema.table"

  • 或更可读:

    export PGPASSWORD='password'
    psql -h 'server name' -U 'user name' -d 'base name' \
         -c 'command' (eg. "select * from schema.table")

18
一行可以稍微简化为: PGPASSWORD='password' psql .... 这还具有以下优点:在完成命令后无法访问变量。
加勒特

3
export PGPASSWORD=YourNewPassword在其他版本上为我工作。
Mikeumus

7
export PGPASSWORD听起来像是一个非常糟糕的主意
Hasen

1
这会将密码保存在您的bash历史记录〜/ .bash_history文件中(除非您始终小心地添加一个空格),并且还将密码导出到当前环境FWIW:|
rogerdpack


26

在Windows上:

  1. 将值分配给PGPASSWORD: C:\>set PGPASSWORD=pass

  2. 运行命令: C:\>psql -d database -U user

准备

或者一行

set PGPASSWORD=pass&& psql -d database -U user

注意&&前面没有空格。


1
我尝试过,但没有成功。仍然要求输入密码。
反模式

1
@antipattern您还必须通过选项-w
mljrg

1
PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"作品。
史蒂夫·希普韦

21

这可以通过.pgpass在(Linux)用户的主目录中创建一个文件来完成。 .pgpass 文件格式:

<databaseip>:<port>:<databasename>:<dbusername>:<password>

您也可以使用通配符*代替详细信息。

假设我想在tmp.sql不提示输入密码的情况下运行。

使用以下代码,您可以在* .sh文件中

echo "192.168.1.1:*:*:postgres:postgrespwd" > $HOME/.pgpass
echo "` chmod 0600 $HOME/.pgpass `"

echo " ` psql -h 192.168.1.1 -p 5432  -U postgres  postgres  -f tmp.sql `        

11
回声的含义是“`chmod 0600 $ HOME / .pgpass`”?只是chmod 0600 $ HOME / .pgpass怎么样?
弗拉德·帕特里谢夫(Flad Patryshev)2014年

12

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

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

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

postgres=>

谢谢,它对我来说很好用
grepit

4

在我的.bashrc中添加了pg_env.sh的内容:

cat /opt/PostgreSQL/10/pg_env.sh

#!/bin/sh
# The script sets environment variables helpful for PostgreSQL

export PATH=/opt/PostgreSQL/10/bin:$PATH
export PGDATA=/opt/PostgreSQL/10/data
export PGDATABASE=postgres
export PGUSER=postgres
export PGPORT=5433
export PGLOCALEDIR=/opt/PostgreSQL/10/share/locale
export MANPATH=$MANPATH:/opt/PostgreSQL/10/share/man

加上(根据user4653174的建议)

export PGPASSWORD='password'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.