【问题标题】:Run batch file with psql command without password使用 psql 命令运行批处理文件,无需密码
【发布时间】:2013-02-27 20:31:23
【问题描述】:

我正在尝试使用批处理脚本执行此psql 命令:

psql --host=localhost --dbname=<dbname> --port=<Port Number>
     --username=<dbuser> --file=C:\PSQL_Script.txt --output=C:\PSQL_Output.txt

问题是每次我执行批处理脚本时都要求输入密码。如何通过批处理文件输入密码参数?

【问题讨论】:

    标签: postgresql shell connection psql


    【解决方案1】:

    我发现了这种将连接字符串传递给命令的技巧,即

    $ psql postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}
    

    `示例:

    $ psql postgresql://user:password@127.0.0.1:5432/database
    

    这样,如果您必须传递数据库密码,但又不想在提示符中继续传递,您可以在 bash 文件中执行此操作。

    【讨论】:

      【解决方案2】:

      postgres 文档 - https://www.postgresql.org/docs/9.6/static/app-psql.html

      -w --无密码 永远不要发出密码提示。如果服务器需要密码验证并且密码无法通过其他方式(例如 .pgpass 文件)获得,则连接尝试将失败。此选项在没有用户输入密码的批处理作业和脚本中很有用。

      【讨论】:

        【解决方案3】:

        继续阅读,最好的选项排在最后。但让我们先澄清几件事。

        只静默密码请求

        如果您的问题只是密码提示,您可以将其静音。我引用the manual here

        -w
        --no-password

        永远不要发出密码提示。如果服务器需要密码验证并且 无法通过其他方式获得密码,例如 .pgpass 文件,连接尝试将失败。这个选项可以 在没有用户输入密码的批处理作业和脚本中很有用。 (...)

        您可能不需要密码

        通常这是不必要的。默认的数据库超级用户postgres通常对应同名的系统用户。如果在您的 pg_hba.conf 文件中设置了authentication method peerident,则从此帐户运行psql 不需要密码。你可能有这样的一行:

        local    all    postgres    peer
        

        通常还有:

        local    all    all         peer
        

        这意味着,每个本地用户都可以以同名数据库用户身份登录到all数据库,而无需密码。
        但是 ,这里有一个常见的误解。 Quoting again:

        此方法仅在本地连接上受支持。

        我的大胆强调。
        您正在连接到 localhost,这不是“本地连接”,即使其中包含“本地”一词。这是到 127.0.0.1 的 TCP/IP 连接。 Wikipedia on localhost:

        在现代计算机系统上,localhost 作为主机名转换为 127.0.0.0/8(环回)网络块中的 IPv4 地址,通常为 127.0.0.1,或在 IPv6 中为 ::1

        本地连接的简单解决方案

        psql 调用中省略参数-h。再次引用the manual on psql

        如果您省略主机名,psql 将通过 Unix 域套接字连接 到本地主机上的服务器,或通过 TCP/IP 到机器上的localhost 没有 Unix 域套接字。

        窗口

        ... 没有 Unix 域套接字,pg_hba.conflocal 开头的行不适用于 Windows。在 Windows 上,您默认通过 localhost 连接,这让我们回到了起点。

        如果您的安全要求不严格,您可以只信任通过localhost 的所有连接:

        host    all    all    127.0.0.1/32     trust
        

        我只会在远程连接关闭的情况下进行调试。为了获得更高的安全性,您可以在 Windows 上使用 SSPI authentication。将此行添加到 pg_hba.conf 用于“本地”连接:

        host    all    all    127.0.0.1/32     sspi
        

        如果您确实需要密码

        可以设置一个环境变量,但这是不鼓励,尤其是对于Windows。 The manual:

        PGPASSWORD 的行为与password 连接相同 范围。不推荐使用此环境变量 出于安全原因,因为某些操作系统允许非 root 用户通过ps查看进程环境变量;反而 考虑使用~/.pgpass 文件(参见Section 32.15)。

        The manual on psql:

        conninfo 字符串是指定连接参数的替代方法:

         $ psql "user=myuser password=secret_pw host=localhost port=5432 sslmode=require"
        

        URI,用于代替数据库名称:

         $ psql postgresql://myuser:secret_pw@localhost:5432/mydb?sslmode=require
        

        密码文件

        但通常最好设置.pgpass file 而不是将密码放入脚本文件中。
        阅读short chapter in the manual carefully。特别要注意这里...

        主机名localhost 匹配来自本地计算机的 TCP(主机名 localhost)和 Unix 域套接字(pghost 空或默认套接字目录)连接。

        具体路径取决于系统。该文件可以存储多种角色和端口组合的密码(数据库集群):

        localhost:5432:*:myadmin:myadminPasswd
        localhost:5434:*:myadmin:myadminPasswd
        localhost:5437:*:myadmin:myadminPasswd
        ...
        

        Windows 机器上查找文件:

        %APPDATA%\postgresql\pgpass.conf
        

        %APPDATA% 通常解析为:C:\Documents and Settings\My_Windows_User_Name\Application Data\

        【讨论】:

          【解决方案4】:

          我也遇到了同样的问题:

          psql -hlocalhost -d<myDB> -U<myUser>
          

          总是提示我输入密码。正如@Erwin 解释的那样,因为-hlocalhost 是通过TCP 连接而不是通过Unix 域套接字(对于基于Unix 的操作系统)。因此,即使您已将 local 配置为受信任:

          local   all    all                     trust
          

          它仍然会提示输入密码。因此,为了配置 -hlocalhost 以通过 TCP 工作,我必须为 localhost 地址配置 host,如下所示:

          host    all    all    127.0.0.1/32     trust
          host    all    all    ::1/128          trust
          

          但这对我不起作用。我要做的就是将这两者结合起来:

          host    all    all    localhost        trust
          

          一些额外的阅读:

          【讨论】:

            猜你喜欢
            • 2018-09-08
            • 1970-01-01
            • 1970-01-01
            • 2016-07-17
            • 1970-01-01
            • 2018-07-31
            • 2017-11-30
            • 1970-01-01
            相关资源
            最近更新 更多