【问题标题】:How to execute PostgreSQL script-file from command line without userinput / password如何在没有用户输入/密码的情况下从命令行执行 PostgreSQL 脚本文件
【发布时间】:2018-10-26 20:18:02
【问题描述】:

在安装我的应用程序期间,我想创建一个 PostgreSQL 数据库以及一些表和函数。

为此,我使用 PostgreSQL 附带的 PSQL.EXE。我有 2 个脚本。第一个创建数据库和有权在该数据库上执行脚本的相应用户。我想以刚刚创建的用户身份执行第二个脚本。不幸的是,我找不到将该用户的密码作为命令行参数传递的方法。省略密码会导致执行停止并提示用户输入密码,我想避免这种情况 - 因为这是在我的应用程序安装期间执行的。

有什么方法可以将密码作为参数传递,或者我可以使用其他命令行工具吗?

进一步解释环境。我使用 WiX 3.5 设置作为“MSI-Builder”。

【问题讨论】:

    标签: postgresql command-line wix command-line-arguments


    【解决方案1】:

    您可以使用 pgpass 文件作为 dbenhur 回答,也可以在调用 psql 之前设置环境变量 PGPASSWORD:

    SET PGPASSWORD=my_very_secret_password
    psql somedb someuser
    

    手册中记录了所有支持的环境变量:http://www.postgresql.org/docs/current/static/libpq-envars.html

    【讨论】:

    • 不会那么保密,每个人都可以从环境变量中看到密码。
    【解决方案2】:

    您不能通过 cmdline arg 提供密码(并且不希望这样做,因为这是一种糟糕的安全做法)。

    您可以提供 .pgpass 文件来支持自动脚本身份验证。这里是the docs

    【讨论】:

    • 在 Windows 上使用 WiX 安装我的应用程序期间如何提供该 .pgpass 文件?据我了解链接的文档,该文件位于 %APPDATA%\postgresql\pgpass.conf 下并且只有一个文件,我必须更改它才能添加通过第一个脚本创建的用户.我希望有一种更巧妙的方法来做到这一点。
    • @derSteve 正如链接文档所说,您可以将 pgpass 文件放在您想要的任何位置,并使用环境变量 PGPASSFILE 告诉 psql(实际上是 libpq)在哪里可以找到它。在 unix 上,pgpass 文件不能是组或世界可访问的。在 Windows 上,postgres lib 会假设你把它放在一个安全的地方,但不会检查或抱怨(所以要聪明并控制文件的权限)。
    【解决方案3】:

    更好的是,如果您有权创建 db 角色,那么您已经拥有所需的所有访问权限,而无需仔细使用密码登录。让第二个脚本在与第一个相同的用户下运行,但包含以下行以切换用户:

    set role my_new_user;
    

    其中my_new_user 是您要运行它的角色的名称。

    如果您只是因为不同的登录名而划分脚本,那么它们可以放在同一个文件中,只是在中途切换角色。


    注意: 如果您没有以超级用户身份创建数据库和新角色,这可能会稍微复杂一些。如果是这种情况,您将需要创建新角色:

    create role my_new_role ... ADMIN my_role;
    

    my_new_role 是您正在创建的角色,my_role 是您的当前用户。然后当你简单地完成时:

    revoke my_new_role from my_role;
    

    【讨论】:

      【解决方案4】:

      为了补全,也可以使用 URI (doc link)

      列出数据库

      psql "postgresql://username:password@localhost/postgres" -l
      

      我还设计了这个只有名字的命令(如果你知道更好的方法,请告诉我):

      psql "postgresql://username:password@localhost/postgres" -l | awk -F '|' '{print $1}'| sed -e '/^\s*$/ d' -e '1,3d'|sed '$d'|awk '{print $1}'
      

      你也可以使用unix socket来连接:

      # ss -x -a |grep postgres|awk '{print $5}'
      /var/run/postgresql/.s.PGSQL.5432
      

      注意使用socket的父目录:

      # sudo -u postgres psql -d "postgresql:///postgres?host=/var/run/postgresql/" -l
      

      只有在您的pg_hba.conf 中有此行​​时,您才能执行此操作:

      local   all     postgres                ident
      

      "ident" 使用 unix 用户进行身份验证

      转储一个数据库

      这里我添加了一个不同的端口号

      pg_dump -Fc "postgresql://username:password@localhost:9001/${db}" > "backup_${db}.pgdump"
      

      使用 dumpall 你需要一个超级用户或角色(CREATE ROLE ... SUPERUSER)。它必须有权访问所有数据库。默认postgres可以。

      但就我而言,我无法将 pg_dumpall 与 postgres 一起使用,因为他的密码已被开发人员删除。

      所以我用了:

       sudo -u postgres pg_dumpall -d "postgresql:///?host=/var/run/postgresql/" > all.dump
      

      测试版

      # cat /opt/postgresql/PG_VERSION
      9.6
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-22
        • 2016-11-08
        • 1970-01-01
        • 2018-12-20
        • 2021-12-15
        相关资源
        最近更新 更多