2013-04-10 99 views
2

如何验证postgresql用户和密码在没有数据库的情况下是否有效?验证PostgreSQL用户和没有数据库的密码

我正在创建一个自动安装,它将创建一个数据库并运行sql脚本来创建表。安装需要在运行脚本之前验证用户和密码。自动安装调用Windows批处理文件。首先我设置密码,设置为PGPASSWORD=mypassword

设置密码后,什么命令可以验证用户和密码并返回错误代码或消息?

其他数据库程序(如IBM和db2)有一个附加命令,它允许用户附加到服务器或实例,而不指定数据库名称。我无法找到PostgreSQL的等价物。

如何在命令行上登录到PostgreSQL而不指定数据库名称?

+1

的Postgres始终安装一个名为“Postgres的数据库。使用那个与@Eric的答案,你会没事的。 – mistapink 2013-04-10 14:47:28

回答

3

使用系统表pg_roles

的Postgres始终安装一个名为 “Postgres的” 数据库。 postgres是当你没有连接到数据库时连接到的数据库。有一张名为pg_roles的表格。

使用此命令:

psql -U pgadmin -d postgres -c 'select * from pg_roles' 

它返回这样的:

rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcatupdate | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolconfig | oid 
----------+----------+------------+---------------+-------------+--------------+-------------+----------------+--------------+-------------+---------------+-----------+------- 
postgres | t  | t   | t    | t   | t   | t   | t    |   -1 | ******** |    |   | 10 
pgadmin | t  | t   | t    | t   | t   | t   | t    |   -1 | ******** |    |   | 16384 

(2行)

看到这个答案:How to check if a postgres user exists?

测试它在登录

只要尝试使用提供的用户名/密码登录并用try/catch将其包围,并且如果可以登录,那么它是有效的,否则它是无效的。

改变用户

你也许可以,如果你改变了一个不存在用户搭上一条错误消息:http://www.postgresql.org/docs/8.0/static/sql-alteruser.html

ALTER USER postgres WITH PASSWORD 'tmppassword'; 

删除并重新添加用户

如果您尝试删除并重新添加用户,您可能会收到错误消息。所以如果它是无效的,那么当你尝试删除一个非用户时,它会引发错误。 http://www.postgresql.org/docs/8.0/static/sql-createuser.html

+0

所以你想在安装postgresql系统表之前验证用户是否有效?这似乎有点奇怪,但确定。 – 2013-04-10 14:22:34

+0

自动安装正在创建一个新的数据库,然后运行脚本来创建表和加载数据。屏幕会提示输入凭据,并在调用createdb命令之前需要进行身份验证。没有必要使用错误的凭据运行其他命令。这是数据库安装的标准做法。 – 2013-04-10 14:31:57

+0

登录到PostgreSQL:其他db程序(如IBM db2)有一个attach命令,它允许用户附加到服务器或实例,而不指定db名称。我无法找到PostgreSQL的等价物。如何在命令行上登录到PostgreSQL而不指定数据库名称? – 2013-04-10 14:35:13

1

这里有一个方便的方法来检查命令行中的用户名/密码组合是否有效。这是从puppetlabs,PostgreSQL的模块拉:

su - username 
env PGPASSWORD=somepass psql -h localhost -c 'select 1' 
echo $? 

...其中“somepass”是被测试的密码,“用户名”是对被测试的帐户(通常是postgres用户本身)。

如果$?为0时,用户/密码组合有效。如果$?是1,密码错误或用户不存在。无论哪种方式,都有问题。

这就是Linux/bash的方式。在Windows的方法是沿着线的东西:

(run under the user account you're interested in) 

set PGPASSWORD=somepass 
psql -h localhost -c 'select 1' 

if errorlevel 1 (
    echo Failure Reason Given is %errorlevel% 
    exit /b %errorlevel% 
) 

上PSQL的-h强制本地基于TCP的连接,默认情况下(从pg_hba.conf的)强制密码检查没有可能性密码的用户可以旁路。

对于没有发布经过完全测试的Windows解决方案,我表示歉意,但上面的代码很可能会直接运行,或者只会稍微修复。

-1

在你的终端简单地使用这个命令:

psql postgres 
+0

这不起作用。 – 2017-11-16 05:07:10