我试图用一个shell脚本自动化数据库创建过程,其中一件事我遇到了传递密码到psql的障碍。 下面是shell脚本的一段代码:
psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"
如何以非交互的方式将密码传递给psql ?
我试图用一个shell脚本自动化数据库创建过程,其中一件事我遇到了传递密码到psql的障碍。 下面是shell脚本的一段代码:
psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"
如何以非交互的方式将密码传递给psql ?
当前回答
使用PGPASSWORD环境变量的另一种方法是根据文档使用conninfo字符串:
指定连接参数的另一种方法是在conninfo中 字符串或URI,用来代替数据库名称。这 机制使您可以对连接进行非常广泛的控制。
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
postgres=>
其他回答
psql postgresql://myawsumuser:myPassword@127.0.0.1:5432/myawsumdb
在我的.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=>
在调用psql之前,在脚本中设置环境变量PGPASSWORD
PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName
参考网站:http://www.postgresql.org/docs/current/static/libpq-envars.html
Edit
自从Postgres 9.2以来,还可以指定包含用户名和密码的连接字符串或URI。语法是:
$ psql postgresql://[user[:password]@][host][:port][,...][/dbname][?param1=value1&...]
使用该密码存在安全风险,因为当其他用户查看正在运行的进程的命令行时,密码以纯文本形式可见,例如使用ps (Linux)、ProcessExplorer (Windows)或类似工具时。
另请参阅有关数据库管理员的问题
我倾向于将URL传递给psql:
psql "postgresql://$DB_USER:$DB_PWD@$DB_SERVER/$DB_NAME"
这使我可以自由地按照自己的意愿命名环境变量,并避免创建不必要的文件。
这需要libpq。文档可以在这里找到。