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

时间:2011-06-19 21:06:06

标签: bash postgresql command-line

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

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

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

谢谢!

9 个答案:

答案 0 :(得分:453)

在调用psql

之前,在脚本中设置PGPASSWORD环境变量
PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

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


修改

自Postgres 9.2起,还可以选择指定可包含用户名密码的connection string or URI

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

另见Database Administrators

上的这个问题

答案 1 :(得分:107)

来自official documentation

  

使用〜/ .pgpass文件也很方便,以避免经常输入密码。有关详细信息,请参阅Section 30.13

...

  

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

hostname:port:database:username:password
  

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

答案 2 :(得分:89)

  • 在一行中:

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

答案 3 :(得分:24)

我倾向于将网址传递给psql:

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

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

这需要libpq。可以找到文档here

答案 4 :(得分:19)

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

答案 5 :(得分:17)

在Windows上:

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

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

  3. 就绪

    或者在一行中,

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

    请注意&amp;&amp; amp;之前的空间不足!

答案 6 :(得分:6)

如果还不算太晚,可以在一个答案中添加大多数选项:

有两种选择:

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

    export PGPASSWORD='password'

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

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

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

答案 7 :(得分:3)

使用PGPASSWORD环境变量的另一种方法是根据documentation

使用conninfo字符串
  

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

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

postgres=>

答案 8 :(得分:0)

将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

(根据用户4653174的建议添加)

export PGPASSWORD='password'