Postgresql:使用密码编写psql执行脚本

Postgresql:使用密码编写psql执行脚本,postgresql,psql,Postgresql,Psql,如何调用psql,使其不提示输入密码 这就是我所拥有的: psql -Umyuser < myscript.sql psql-Umyuser

如何调用psql,使其不提示输入密码

这就是我所拥有的:

psql -Umyuser < myscript.sql
psql-Umyuser

但是,我找不到传递密码的参数,因此psql总是提示输入密码。

您必须创建一个密码文件:有关详细信息,请参阅。

您可能会发现这很有用:

有几种方法可以验证PostgreSQL。您可能希望调查密码身份验证的替代方案

要回答您的问题,有几种方法可以为基于密码的身份验证提供密码:

  • 最明显的方式是通过密码提示
  • 相反,你可以
    • 在pgpass文件中提供密码或

    • 通过
      PGPASSWORD
      环境变量

    • 请看这些:


  • 命令行没有选项将密码作为命令行参数提供,因为所有用户都可以使用该信息,因此不安全。但是,在Linux/Unix环境中,可以为单个命令提供环境变量,如下所示:

  • 可以在脚本开头添加以下命令行:

    set PGPASSWORD=[your password]
    
    PGPASSWORD=[your password]psql-Umyuser
    如果您在像我这样的windows上遇到问题(我使用的是64位windows 7),并且
    set PGPASSWORD=[Password]
    不起作用

    然后,正如Kavaklioglu在一篇评论中所说

    export PGPASSWORD=[password]
    
    您需要将其保存在文件的顶部,或在任何使用之前,以便在调用之前将其设置好


    当然可以在windows上使用:)

    考虑到使用PGPASSWORD环境变量的安全性问题,我认为最好的总体解决方案如下:

    PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
    
  • 使用要使用的密码编写自己的临时pgpass文件
  • 使用PGPASSFILE环境变量告知psql使用该文件
  • 删除临时pgpass文件
  • 这里有几点值得注意。第1步是为了避免弄乱用户可能存在的~/.pgpass文件。您还必须确保该文件的权限不超过0600

    一些人建议利用bash来缩短此过程,如下所示:

    PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
    

    如果您打算拥有多个主机/数据库连接,那么最好的方法就是这样

    步骤:

  • 使用
    vim~/.pgpass
    或类似工具创建文件。按以下格式输入您的信息:
    hostname:port:database:username:password
    不要在字段值周围添加字符串引号。您还可以使用*作为端口/数据库字段的通配符
  • 您必须
    chmod 0600~/.pgpass
    ,以便psql不会自动忽略它
  • 在bash概要文件中创建一个别名,以便为您运行psql命令。例如:
    alias postygresy='psql--host hostname数据库\U name-U username'
    这些值应该与输入到~/.pgpass文件中的值相匹配
  • 使用
    ~/”为bash配置文件提供源代码。bashrc
    或类似产品
  • 从命令行键入别名
  • 请注意,如果设置了export PGPASSWORD=''变量,它将优先于该文件。

    对于那些不熟悉*nix shell脚本的人来说,下面是一个工作脚本:

    #!/bin/sh
    PGPASSFILE=/tmp/pgpasswd$$
    touch $PGPASSFILE
    chmod 600 $PGPASSFILE
    echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
    export PGPASSFILE
    psql mydb
    rm $PGPASSFILE
    
    第2行
    /tmp/pgpasswd$$
    中的双美元符号(
    $$$
    )将进程ID号附加到文件名,因此此脚本可以多次运行,甚至可以同时运行,而不会产生副作用

    请注意,第4行使用了
    chmod
    命令-就像mightybyte描述的“非普通文件”错误一样,如果不这样做,也会出现“权限”错误

    在第7行,如果使用默认值(localhost:5432)并且只有一个数据库用户,则不必使用
    -h
    myserver、
    -p
    myport或
    -U
    jdoe标志。对于多个用户,(但默认连接)将该行更改为

    psql mydb jdoe
    
    别忘了用

    chmod+x runpsql
    (或您称之为脚本文件的任何内容)

    更新:

    我接受了RichVel的建议,在将密码放入文件之前使文件无法读取。这填补了一个小小的安全漏洞。 谢谢

    在命令中使用-w:
    psql-h localhost-p 5432-U user-w我发现,即使您定义了PGPASSWORD变量,psql也会显示密码提示,但是您可以为psql指定-w选项来省略密码提示。

    只需使用PGPASSWORD即可。我正在使用PSQL9.5.10。在你的情况下,解决办法是


    PGPASSWORD=password psql-U myuser

    这可能是一个老问题,但有一种替代方法可以使用,没有人提到过。可以直接在连接URI中指定密码。或者,也可以找到文档

    您可以在提供给
    psql
    的连接URI中直接提供用户名和密码:

    # postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
    psql postgresql://username:password@localhost:5432/mydb
    
    8年后

    在我的mac电脑上,我必须在文件中插入一行
    ~/.pgpass
    类似:

    <IP>:<PORT>:<dbname>:<user>:<password>
    
    ::
    
    另请参见:


    使用
    PGPASSWORD
    环境变量的替代方法是根据

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

    $psql“主机=端口=5432数据库名=用户=密码=”
    博士后=>
    
    这也适用于其他postgresql CLI,例如,您可以在非交互模式下运行pgbench

    export PGPASSWORD=yourpassword
    /usr/pgsql-9.5/bin/pgbench -h $REMOTE_PG_HOST -p 5432 -U postgres -c 12 -j 4 -t 10000 example > pgbench.out 2>&1 &
    

    我认为PGPASSWORD已被弃用,但仍然有效,顺便说一句。仅供参考,它已被弃用(因此在
    <IP>:<PORT>:<dbname>:<user>:<password>
    
    $ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
    
    postgres=>
    
    export PGPASSWORD=yourpassword
    /usr/pgsql-9.5/bin/pgbench -h $REMOTE_PG_HOST -p 5432 -U postgres -c 12 -j 4 -t 10000 example > pgbench.out 2>&1 &