在没有数据库的情况下验证PostgreSQL用户和密码

时间:2013-04-10 13:25:00

标签: validation postgresql authentication passwords

如果没有数据库,如何验证postgresql用户和密码是否有效?

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

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

其他数据库程序(如IBM和db2)具有attach命令,该命令允许用户连接到服务器或实例,而无需指定db名称。我找不到PostgreSQL的等价物。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这是一种从命令行检查用户名/密码组合是否有效的方便方法。这是从puppetlabs-postgresql模块中提取的:

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

...其中'somepass'是正在测试的密码,'username'是正在测试的帐户(通常是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%
)

psq上的-h强制本地基于TCP的连接,默认情况下(来自pg_hba.conf)强制进行密码检查,无密码用户无法绕过。

我很抱歉没有发布经过全面测试的Windows解决方案,但上面的代码很可能会直接运行,或只需要一点点修复。

答案 2 :(得分:-2)

只需在终端中使用此命令:

psql postgres