如何以非交互方式为psql指定密码?

Ale*_* N. 283 postgresql bash command-line

我正在尝试使用shell脚本自动化数据库创建过程,并且我已经通过将密码传递给psql而遇到了一个问题.以下是shell脚本中的一些代码:

psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

a_h*_*ame 517

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

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName
Run Code Online (Sandbox Code Playgroud)

供参考,请参阅http://www.postgresql.org/docs/current/static/libpq-envars.html


编辑

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

使用它是一种安全风险,因为在查看正在运行的进程的命令行时,密码是以纯文本形式显示的,例如使用ps(Linux),ProcessExplorer(Windows)或其他用户的类似工具.

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

  • 例如,在一行中,您可以执行以下操作:PGPASSWORD = pass1234 psql -u MyUsername myUserName (31认同)
  • 我认为这是简单运行SQL脚本最方便的方法. (3认同)
  • 奖励:适用于Docker:`docker run -e PGPASSWORD ="$(pbpaste)" - rm postgres psql -h www.example.com dbname username -c'SELECT*FROM table;'` (3认同)
  • 小心,*确保始终添加前面的空格*否则它将显示在您的bash历史记录〜/ .bash_history文件中... (3认同)
  • 对于那些即将使用它的人,请注意,将密码作为 shell 命令的一部分将 **1)** 将其显示在系统的 *所有* 用户可见的进程列表中(例如 `ps -ef`), **2)** 会将其添加到 shell 的历史文件中(例如 `.bash_history`)。我的建议是将密码存储在安全文件中(例如,使用操作系统级权限来限制访问),然后“PGPASSWORD=$(cat /<path>/to/secret.txt) ...”。 (3认同)
  • 我只能添加 - 在第一个字符之前在命令行中添加一个`space`,命令不会存储在bash历史记录中.适用于ubuntu/bash. (2认同)
  • 欢迎同行的旅行者并感谢您在 SO 上提供的服务。这位 2021 年中期访问者为纪念该问题 10 周年而发出的快速警告:*在 Fedora 32+ 上,在命令前添加空格以将其隐藏在历史记录中的旧魔法不再起作用。*即使“它有效”今天,在我的机器上”,您可能会因为一次操作系统更新或恶意配置更改而将您的秘密转储到您的 bash 历史记录中(并且它总是在“ps”中泄露)。我将坚持在上面的评论中接受的答案或 @code_dredd 的有用替代方案,这些感觉像是更安全的做法。 (2认同)

Fli*_*mzy 119

官方文档:

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

...

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

hostname:port:database:username:password
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,我知道pgpass,但这并没有解决问题 - 我需要一个自包含的bash脚本来操作数据库,因此我的问题是通过命令行将信息传递给psql. (27认同)
  • 我认为您唯一的选择是设置您的bash脚本可以访问的.pgpass文件.或者根本不使用密码 - 您可以设置其他形式的身份验证,例如ident或使用SSL证书. (6认同)
  • 不要忘记删除组和其他用户读取、写入、执行 .pgpass 文件的权限!运行 `chmod go-rwx .pgpass` (6认同)

小智 97

  • 一行可以略微简化为:`PGPASSWORD ='password'psql ....`,它也具有在命令完成后无法访问的变量的好处. (18认同)
  • `export PGPASSWORD`听起来真的很糟糕 (7认同)
  • `export PGPASSWORD = YourNewPassword`在其他版本上为我工作。 (3认同)
  • 这会将密码保存在您的 bash 历史记录 ~/.bash_history 文件中(除非您总是小心地添加前面的空格),并将密码导出到您当前的环境 FWIW :| (3认同)

Jac*_*din 48

我更倾向于将URL传递给psql:

psql "postgresql://$DB_USER:$DB_PWD@$DB_SERVER/$DB_NAME"
Run Code Online (Sandbox Code Playgroud)

这使我可以自由地命名我的环境变量,并避免创建不必要的文件.

这需要libpq.文档可以在这里找到


ubi*_*ubi 24

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

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

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

postgres=>
Run Code Online (Sandbox Code Playgroud)


小智 23

在Windows上:

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

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

准备

或者在一行中,

set PGPASSWORD=pass&& psql -d database -U user
Run Code Online (Sandbox Code Playgroud)

请注意&&之前缺少空格!

  • @antipattern 您还必须传递选项 `-w`。 (2认同)
  • 在 Powershell 中,您可以执行以下操作:`$env:PGPASSWORD=pass; psql -d 数据库 -U 用户` (2认同)

Pro*_*ton 22

只是为了增加更多清晰度。

您可以将密码分配给PGPASSWORD变量。

因此,下面的内容将要求您输入密码:

psql --host=aurora-postgres.cluster-fgshdjdf.eu-west-1.rds.amazonaws.com --port=5432 --user=my_master_user --password --dbname=postgres
Run Code Online (Sandbox Code Playgroud)

我们将用 替换该--password标志PGPASSWORD=QghyumjB3ZtCQkdf。所以它将是:

PGPASSWORD=QghyumjB3ZtCQkdf psql --host=aurora-postgres.cluster-fgshdjdf.eu-west-1.rds.amazonaws.com --port=5432 --user=my_master_user --dbname=postgres
Run Code Online (Sandbox Code Playgroud)

这样您就不需要输入密码。


小智 20

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

<databaseip>:<port>:<databasename>:<dbusername>:<password>
Run Code Online (Sandbox Code Playgroud)

您也可以使用外卡*代替细节.

假设我想在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 `        
Run Code Online (Sandbox Code Playgroud)

  • 回声"`chmod 0600 $ HOME/.pgpass`"有什么意义?怎么样只是chmod 0600 $ HOME/.pgpass? (10认同)

Raj*_*rma 12

如果在一个答案中添加大部分选项还为时不晚:

有几个选项:

  1. 在 pgpass 文件中设置它。关联
  1. 设置一个环境变量并从那里获取它:

    export PGPASSWORD='password'

然后运行你的 psql 登录,甚至从那里运行命令:

 psql -h clustername -U username -d testdb
Run Code Online (Sandbox Code Playgroud)
  1. 在 Windows 上,您必须使用 "set" :

    设置 PGPASSWORD=pass 然后登录到 psql bash。


Rob*_*Rob 8

将 pg_env.sh 的内容添加到我的 .bashrc 中:

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
Run Code Online (Sandbox Code Playgroud)

添加(根据 user4653174 建议)

export PGPASSWORD='password'
Run Code Online (Sandbox Code Playgroud)


JDO*_*own 5

psql postgresql://myawsumuser:myPassword@127.0.0.1:5432/myawsumdb
Run Code Online (Sandbox Code Playgroud)