使用不带密码的psql命令运行批处理文件

时间:2013-03-12 10:59:26

标签: postgresql shell connection psql

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

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

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

4 个答案:

答案 0 :(得分:44)

继续阅读, 最佳选项最后 。但我们首先澄清一些事情。

仅静音密码请求

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

  

-w
  --no-password

     

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

您可能不需要密码

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

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

本地连接的简单解决方案

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

  

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

...没有Unix域套接字,以pg_hba.conf开头的local行不适用于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\

答案 1 :(得分:1)

我有同样的问题:

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

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

local   all    all                     trust

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

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

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

host    all    all    localhost        trust

一些额外的读物:

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

10

`示例:

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

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