关于bash:如何以非交互方式为psql指定密码?

How do I specify a password to psql non-interactively?

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

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

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

谢谢!


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

1
PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

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

编辑

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

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

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


从官方文档:

It is also convenient to have a ~/.pgpass file to avoid regularly having to type in passwords. See Section 30.13 for more information.

...

This file should contain lines of the following format:

1
hostname:port:database:username:password

The password field from the first line that matches the current connection parameters will be used.


  • 在一行:

    1
    export PGPASSWORD='password'; psql -h 'server name' -U 'user name' -d 'base name' -c 'command'

    使用命令执行"select * from schema.table"等sql命令

  • 或更具可读性:

    1
    2
    3
    export PGPASSWORD='password'
    psql -h 'server name' -U 'user name' -d 'base name' \
         -c 'command' (eg."select * from schema.table")


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

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

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

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


在Windows上:

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

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

  • 准备

    或者在一行中,

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

    请注意&& amp;之前缺少空间。 !


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

    1
    <databaseip>:<port>:<databasename>:<dbusername>:<password>

    您也可以使用通配符*代替详细信息。

    假设我想在不提示输入密码的情况下运行tmp.sql

    使用以下代码,您可以在* .sh文件中

    1
    2
    3
    4
    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 `


    在我的.bashrc中添加了pg_env.sh的内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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建议)

    1
    export PGPASSWORD='password'