首页 文章

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

提问于
浏览
221

如何调用 psql 以便它 doesn't prompt for a password

这就是我所拥有的:

psql -Umyuser < myscript.sql

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

13 回答

  • 2

    有几种方法可以对PostgreSQL进行身份验证 . 您可能希望在https://www.postgresql.org/docs/current/static/client-authentication.html调查密码验证的替代方法 .

    要回答您的问题,有几种方法可以为基于密码的身份验证提供密码 . 显而易见的方法是通过密码提示 . 您可以在pgpass文件中或通过 PGPASSWORD 环境变量提供密码,而不是这样 . 看到这些:

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

    PGPASSWORD=yourpass psql ...
    
  • 245
    PGPASSWORD=[your password] psql -Umyuser < myscript.sql
    
  • 4

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

    set PGPASSWORD=[your password]
    
  • 11

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

    脚步:

    • 创建〜/ .pgpass文件 . 使用以下格式输入您的信息hostname:port:database:username:password

    • 不要在字段值周围添加字符串引号 . 您还可以使用*作为端口/数据库字段的通配符 .

    • 在bash配置文件中创建一个别名,为您运行psql命令 . 例如: alias postygresy='psql --host hostname database_name -U username' 这些值应与您输入到〜/ .pgpass文件的值相匹配 .

    • 来源您的bash档案 .

    • 从命令行键入别名 .

    请注意,如果您设置了导出PGPASSWORD =''变量,则它将优先于该文件 . 更改文件的权限以便从其他用户隐藏内容也是明智之举 . 这可以通过 chmod 600 ~/.pgpass 实现

  • 129

    您必须创建密码文件:有关详细信息,请参阅http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html .

  • 6

    如果你're having problems on windows like me (I' m使用Windows 7 64位)和 set PGPASSWORD=[Password] 不起作用 .

    然后,正如Kavaklioglu在其中一条评论中所说的那样,

    export PGPASSWORD=[password]
    

    您需要将其保存在文件的顶部,或者在任何使用之前保存,以便在调用之前将其保存 .

    当然可以在Windows上工作:)

  • 6

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

    • 使用您要使用的密码编写自己的临时pgpass文件 .

    • 使用PGPASSFILE环境变量告诉psql使用该文件 .

    • 删除临时pgpass文件

    这里有几点值得注意 . 第1步是为了避免与用户可能存在的〜/ .pgpass文件混淆 . 您还必须确保该文件具有0600或更低的权限 .

    有人建议利用bash来快捷方式如下:

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

    这使用<()语法来避免需要将数据写入实际文件 . 但它不起作用,因为psql检查正在使用的文件,并将抛出这样的错误:

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

    Build 在mightybyte's answer上的那些不熟悉* nix shell脚本的人,这是一个工作脚本:

    #!/bin/sh
    PGPASSFILE=/tmp/pgpasswd$$
    echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
    chmod 600 $PGPASSFILE
    export PGPASSFILE
    psql mydb
    rm $PGPASSFILE
    

    第2行 /tmp/pgpasswd$$ 中的双美元符号( $$ )将进程ID号附加到文件名,这样该脚本可以多次运行,甚至可以同时运行,没有副作用 .

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

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

    psql mydb jdoe
    

    不要忘记使脚本可执行

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

  • -5

    它可以简单地使用PGPASSWORD完成 . 我正在使用psql 9.5.10 . 在你的情况下,解决方案将是

    PGPASSWORD=password psql -U myuser < myscript.sql

  • 58
  • 12

    这可能是一个老问题,但有可能直接在连接URI中指定密码 . 文档可以在here找到,或者here .

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

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

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

  • -1

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

相关问题