postgresql – 使用psql命令运行批处理文件,而不需要密码

前端之家收集整理的这篇文章主要介绍了postgresql – 使用psql命令运行批处理文件,而不需要密码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使用批处理脚本来执行这个psql命令:
psql --host=localhost --dbname=<dbname> --port=<Port Number>
     --username=<dbuser> --file=C:\Psql_Script.txt --output=C:\Psql_Output.txt

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

关于无密码登录的问题不断弹出。继续阅读,最好的选择是最后的。但是让我们首先澄清几件事情。

只能静音密码请求

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

-w
--no-password

Never issue a password prompt. If the server requires password authentication and
a password is not available by other means such as
a .pgpass file,the connection attempt will fail. This option can be
useful in batch jobs and scripts where no user is present to enter a password. (…)

你可能不需要密码

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

local    all    postgres    peer

通常也是:

local    all    all         peer

这意味着,每个本地用户都可以登录到具有相同名称数据库用户的所有数据库,而无需密码。
然而,这里有一个常见的误解。 Quoting again

This method is only supported on local connections.

大胆强调我的
您正在连接到本地主机,这不是“本地连接”,即使它具有单词“本地”。这是一个到127.0.0.1的TCP / IP连接。 Wikipedia on localhost

On modern computer systems,localhost as a hostname translates to an
IPv4 address in the 127.0.0.0/8 (loopback) net block,usually 127.0.0.1,or ::1 in IPv6.

本地连接的简单解决方

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

If you omit the host name,psql will connect via a Unix-domain socket
to a server on the local host,or via TCP/IP to localhost on machines
that don’t have Unix-domain sockets.

视窗

…没有Unix域套接字,从本地开始的pg_hba.conf行不适用于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 behaves the same as the 07007 connection
parameter. Use of this environment variable is not recommended
for security reasons,as some operating systems allow non-root
users to see process environment variables via ps; instead
consider using the ~/.pgpass file (see 07008).

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.特别是请注意这里…

A host name of localhost matches both TCP (host name localhost) and Unix domain socket (pghost empty or the default socket directory) connections coming from the local machine.

确切的路径取决于系统。此文件可以为角色和端口(DB集群)的多个组合的密码:

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

在Windows机器上查找文件

C:\Documents and Settings\My_Windows_User_Name\Application Data\postgresql

猜你在找的Postgre SQL相关文章