【问题标题】:Postgresql: Scripting psql execution with passwordPostgresql:使用密码编写 psql 执行脚本
【发布时间】:2011-09-25 06:23:25
【问题描述】:

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

这就是我所拥有的:

psql -Umyuser < myscript.sql

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

【问题讨论】:

标签: postgresql psql


【解决方案1】:

您不妨阅读the ways to authenticate to PostgreSQL 的摘要。

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

  1. 通过密码提示。示例:

    psql -h uta.biocommons.org -U foo
    Password for user foo: 
    
  2. 在 pgpass 文件中。见libpq-pgpass。格式:

    <host>:<port>:<database>:<user>:<password>
    
  3. 使用PGPASSWORD 环境变量。见libpq-envars。示例:

    export PGPASSWORD=yourpass
    psql ...
    
    # Or in one line for this invocation only:
    PGPASSWORD=yourpass psql ...
    
  4. 在连接字符串中 密码和其他选项可以在连接字符串/URI 中指定。见app-psql。示例:

    psql postgresql://username:password@dbmaster:5433/mydb?sslmode=require
    

【讨论】:

  • 我认为 PGPASSWORD 已被弃用但仍然有效,顺便说一句。仅供参考
  • 是的,它已被弃用(并在其中一个链接中注明)。既然它出现了,可能还值得注意的是,弃用受到了激烈的争论,因为它对许多人来说非常有用,但可以在某些情况下使用,而不会产生严重的安全问题。例如,在我看来,这并不比将 .pgpass 存储在 NFS 文件系统上更糟糕。我经常使用 PGPASSWORD。
  • 命令行信息“对所有用户可用”的想法是基于关于多用户系统的过时假设,不适用于大多数现代环境中系统只运行单个应用程序并且全部自动化
  • Fast Forward 2021:对于使用 Postgresql 版本 13 的任何人 - PGPASSWORD=yourpass psql ... 似乎不再适用于版本 13(在我的情况下是 Debian 10),因此我成功地将连接字符串作为在official docs 中解释
  • 为我工作。 psql (PostgreSQL) 13.2 在 Mac 上。
【解决方案2】:
PGPASSWORD=[your password] psql -Umyuser < myscript.sql

【讨论】:

  • 这也适用于 terraform。我的朋友,你是救命稻草
【解决方案3】:

您可以在脚本开头添加此命令行:

set PGPASSWORD=[your password]

【讨论】:

  • 在我的情况下 set 命令不起作用,但 export PGPASSWORD=[password] 确实起作用
  • 它在 shell 脚本中不起作用。我正在使用它#!/bin/sh set PGPASSWORD = postgres psql -h 192.168.3.200 -U postgres incx_um &lt;&lt; EOF DELETE FROM usrmgt.user_one_time_codes WHERE time &lt; NOW() - INTERVAL '30 minute' EOF
  • 尽量不要使用空格,例如。 PGPASSWORD=password.
【解决方案4】:

这可能是一个老问题,但是您可以使用另一种没有人提到的方法。可以直接在连接 URI 中指定密码。可以在herehere 找到文档。

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

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

【讨论】:

  • Postrgres 9.3 忽略环境变量PGPASSWORD
  • 它可能需要引用参数才能工作:psql.exe "postgresql://username:password@address:5432/database"
【解决方案5】:

如果您打算拥有多个主机/数据库连接,~/.pgpass file 是您的最佳选择。

步骤:

  1. 使用vim ~/.pgpass 或类似方法创建文件。请按以下格式输入您的信息: hostname:port:database:username:password 不要在字段值周围添加字符串引号。您还可以使用 * 作为端口/数据库字段的通配符。
  2. 您必须 chmod 0600 ~/.pgpass 以使其不会被 psql 静默忽略。
  3. 在您的 bash 配置文件中创建一个别名,为您运行 psql 命令。例如:alias postygresy='psql --host hostname database_name -U username' 这些值应该与您输入到 ~/.pgpass 文件中的值匹配。
  4. 使用 . ~/.bashrc 或类似名称获取您的 bash 配置文件。
  5. 从命令行输入您的别名。

请注意,如果您设置了 export PGPASSWORD='' 变量,它将优先于文件。

【讨论】:

  • 您必须对文件执行chmod 600,否则psql 会默默忽略它(根据文档)。
  • 这在 Windows 服务器上可能不是一个很好的解决方案,在 Windows 服务器上,很多事情都是在没有用户目录的情况下与用户一起运行的。
【解决方案6】:

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

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

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

postgres=>

【讨论】:

  • 这对于其他方法不起作用的健全性测试很有用。此外,将密码从您的 shell 历史记录中删除可以像 putting a space before a command 一样简单。
【解决方案7】:

如果您在像我这样的 Windows 上遇到问题(我使用的是 Windows 7 64 位)并且set PGPASSWORD=[Password] 不起作用。

然后,正如 Kavaklioglu 在其中一个 cmets 中所说,

export PGPASSWORD=[password]

您需要将其保存在文件顶部,或在任何使用之前保存,以便在调用之前对其进行设置。

当然可以在 windows 上工作:)

【讨论】:

  • export PGPASSWORD=[password] 对我使用命令行 (cmd.exe) 根本不起作用。你确定你没有使用 cygwin 或类似的东西吗?
  • 仅适用于 cl,您将其添加到文件中对吗?现在只需将其输入命令?
  • 在linux/mac环境下使用是可以的,对于windows,我觉得你应该想办法导出这个环境变量。
  • 所以添加一个全局密码......这也是一个有趣的想法
【解决方案8】:

您必须创建一个密码文件:请参阅http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html 了解更多信息。

【讨论】:

    【解决方案9】:

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

    1. 使用您要使用的密码编写您自己的临时 pgpass 文件。
    2. 使用 PGPASSFILE 环境变量告诉 psql 使用该文件。
    3. 删除临时 pgpass 文件

    这里有几点需要注意。第 1 步是为了避免弄乱可能存在的用户 ~/.pgpass 文件。您还必须确保该文件的权限为 0600 或更少。

    有些人建议利用 bash 来简化此操作,如下所示:

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

    这使用

    WARNING: password file "/dev/fd/63" is not a plain file
    

    【讨论】:

    • stackoverflow.com/a/40614592/3696363 中出现了这种方法的一个工作示例 - 此问题的另一个答案。
    • 虽然这个用户并没有真正要求我正在寻找的东西,但我会说这种方法不匹配。使用 PGPASSFILE=
    【解决方案10】:

    只需使用 PGPASSWORD 即可完成。我正在使用 psql 9.5.10。在你的情况下,解决方案是

    PGPASSWORD=password psql -U myuser &lt; myscript.sql

    【讨论】:

      【解决方案11】:

      mightybyte's answer 的基础上为那些不熟悉 *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 描述的“not a plain file”错误一样,还有一个“permissions”如果不这样做会出错。

      在第 7 行,您不必使用 -hmyserver-pmyport-Ujdoe em> 标志,如果您使用默认值 (localhost : 5432) 并且只有一个数据库用户。对于多个用户,(但默认连接)将该行更改为

      psql mydb jdoe
      

      别忘了用

      使脚本可执行

      chmod +x runpsql或任何你称之为脚本文件的东西

      更新:

      我接受了 RichVel 的建议,将密码放入其中之前使文件不可读。这关闭了一个轻微的安全漏洞。 谢谢!

      【讨论】:

      • 您可以使用mktemp 创建一个临时文件,而不是想出自己的命名方案。它创建一个新的临时文件(在 Linux 中命名为 /tmp/tmp.ITXUNYgiNh,在 MacOS X 中命名为 /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4)并将其名称打印到标准输出。
      • 安全问题 最好在创建文件之后但在写入密码之前执行chmod 600。如前所述,服务器上的恶意脚本可能会不断尝试读取这种格式的文件,并且有时会成功获取密码。此外,如果此脚本由于某种原因被中断,文件将留在磁盘上 - 编写 shell trap 处理程序将解决此问题。鉴于编写这样的安全脚本并非易事,我建议改用export PGPASSWORD
      • 感谢@RichVel 指出了那个小的安全漏洞。在输入密码之前触摸创建文件并将其设为私有是一个明显的改进。需要这种解决方案,因为 PGPASSWORD 在 9.3 中已被弃用。
      • 一些文档说它已被弃用,但正如 this Q&A 中的评论中所述,弃用是有争议的,它仍然适用于 Postgres 10.6
      【解决方案12】:

      【讨论】:

        【解决方案13】:

        8 年后……

        在我的 Mac 上,我必须在文件中添加一行 ~/.pgpass点赞:

        <IP>:<PORT>:<dbname>:<user>:<password>
        

        另见:
        https://www.postgresql.org/docs/current/libpq-pgpass.html
        https://wiki.postgresql.org/wiki/Pgpass

        【讨论】:

        • 如果您使用 .pgpass,请不要将 -W 用于 psql。该参数取消.pgpass的使用。
        【解决方案14】:

        这也适用于其他 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 &
        

        【讨论】:

          【解决方案15】:

          我发现,即使您定义了 PGPASSWORD 变量,psql 也会显示密码提示,但是您可以为 psql 指定 -w 选项以省略密码提示。

          【讨论】:

            【解决方案16】:

            在命令中使用 -w: psql -h localhost -p 5432 -U 用户 -w

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-04-15
              • 1970-01-01
              • 2023-03-25
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多