繁体   English   中英

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

[英]How do I specify a password to 'psql' non-interactively?

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

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

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

在调用 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) 或类似工具时,密码以纯文本形式可见。

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

官方文档

有一个 ~/.pgpass 文件也很方便,以避免经常输入密码。 有关更多信息,请参阅第 30.13 节

...

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

hostname:port:database:username:password

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

  • 在一行中:

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

我倾向于将 URL 传递给psql

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

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

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

在 Windows 上:

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

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

准备好

或者在一行中,

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

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

这可以通过在 (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 `        

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

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

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

postgres=>

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

有几个选项:

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

    export PGPASSWORD='password'

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

 psql -h clustername -U username -d testdb
  1. 在 Windows 上,您必须使用 "set" :

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

将 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

添加(根据 user4653174 建议)

export PGPASSWORD='password'

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

您可以将密码分配给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

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

如果您登录到运行 Postgres 的同一台计算机,您可以使用以下 psql 登录命令,指定数据库 (mydb) 和用户名 (myuser):

psql -d mydb -U myuser

如果您需要登录名为 myhost 的服务器上的 Postgres 数据库,您可以使用以下 Postgres 登录命令:

psql -h myhost -d mydb -U myuser

了解更多

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM