如何指定密码为'经常吗?

我试图用一个shell脚本自动化数据库创建过程,其中一件事我遇到了一个障碍,传递密码到psql。 下面是shell脚本中的一段代码:

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

我如何以非交互的方式传递密码到psql ?

546498 次浏览

官方文档:

有一个~/也很方便。Pgpass文件,以避免定期输入密码。有关更多信息,请参阅30.13节

...

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

hostname:port:database:username:password

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

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

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

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


编辑

自从Postgres 9.2以来,还有一个选项可以指定连接字符串或URI,它可以包含用户名而且的密码。语法是:

$ psql postgresql://[user[:password]@][host][:port][,...][/dbname][?param1=value1&...]

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

请参见数据库管理员上的这个问题

这可以通过在(Linux)用户的主目录中创建一个.pgpass文件来完成。 .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 `
  • 在一行:

    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")
    

在Windows上:

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

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

准备好了

或者在一行里,

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

注意&&!

我倾向于传递一个URL到psql:

psql "postgresql://$DB_USER:$DB_PWD@$DB_SERVER/$DB_NAME"

这使我可以自由地按照自己的意愿命名环境变量,并避免创建不必要的文件。

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

在我的.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'

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

另一种指定连接参数的方法是在conninfo中 字符串或URI,用来代替数据库名称。这

.

.

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


postgres=>

如果在一个答案中添加大部分选项还不算太晚的话:

这里有几个选项:

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

    # EYZ0

    ,然后运行您的PSQL登录,甚至从运行命令 : < / p >

    # EYZ0

  2. 在windows上,你必须使用“;设置”;:

    set PGPASSWORD=pass然后登录到psql bash。

  3. 通过URL &env变量:

    # EYZ0

为了让大家更清楚。

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

下面的代码需要你输入密码:

psql --host=aurora-postgres.cluster-fgshdjdf.eu-west-1.rds.amazonaws.com --port=5432 --user=my_master_user --password --dbname=postgres

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

PGPASSWORD=QghyumjB3ZtCQkdf psql --host=aurora-postgres.cluster-fgshdjdf.eu-west-1.rds.amazonaws.com --port=5432 --user=my_master_user --dbname=postgres

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

psql postgresql://myawsumuser:myPassword@127.0.0.1:5432/myawsumdb