主机没有pg_hba.conf条目

当我尝试使用DBI进行连接时出现以下错误

 DBI connect('database = chaosLRdb; host = 192.168.0.1; port = 5433','postgres',...) 
失败:致命:没有pg_hba.conf项为主机“192.168.0.1”,用户“postgres”,数据库“chaosLRdb”,SSLclosures

这是我的pg_hba.conf文件:

# "local" is for Unix domain socket connections only local all all md5 # IPv4 local connections: host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5 host all postgres 127.0.0.1/32 trust host all postgres 192.168.0.1/32 trust host all all 192.168.0.1/32 trust host all all 192.168.0.1/128 trust host all all 192.168.0.1/32 md5 host chaosLRdb postgres 192.168.0.1/32 md5 local all all 192.168.0.1/32 trust 

我的Perl代码是

 #!/usr/bin/perl-w use DBI; use FileHandle; print "Start connecting to the DB...\n"; @ary = DBI->available_drivers(true); %drivers = DBI->installed_drivers(); my $dbh = DBI->connect("DBI:PgPP:database=chaosLRdb;host=192.168.0.1;port=5433", "postgres", "chaos123"); 

我可以知道我在这里想念什么吗?

在你的pg_hba.conf文件中,我看到一些不正确和令人困惑的行:

 # fine, this allows all dbs, all users, to be trusted from 192.168.0.1/32 # not recommend because of the lax permissions host all all 192.168.0.1/32 trust # wrong, /128 is an invalid netmask for ipv4, this line should be removed host all all 192.168.0.1/128 trust # this conflicts with the first line # it says that that the password should be md5 and not plaintext # I think the first line should be removed host all all 192.168.0.1/32 md5 # this is fine except is it unnecessary because of the previous line # which allows any user and any database to connect with md5 password host chaosLRdb postgres 192.168.0.1/32 md5 # wrong, on local lines, an IP cannot be specified # remove the 4th column local all all 192.168.0.1/32 trust 

我怀疑,如果你密码,这可能工作,如果你修剪线。 要获得md5,你可以使用perl或者下面的shell脚本:

  echo -n 'chaos123' | md5sum > d6766c33ba6cf0bb249b37151b068f10 - 

那么你的连接线就像这样:

 my $dbh = DBI->connect("DBI:PgPP:database=chaosLRdb;host=192.168.0.1;port=5433", "chaosuser", "d6766c33ba6cf0bb249b37151b068f10"); 

有关更多信息,请参阅postgres 8.X的pg_hba.conf文件 。

如果你可以改变这一行:

 host all all 192.168.0.1/32 md5 

有了这个:

 host all all all md5 

你可以看到解决这个问题。

但是,其他的行动是你的postgresql端口(5432)是非常开放的密码尝试与黑客(也许他们可以find)。 你可以改变你的postgresql端口5432为'33333'或其他。 所以他们不知道这个configuration。

你的postgres服务器configuration看起来是正确的

主机全部都是127.0.0.1/32 md5
主机全部全部192.168.0.1/32信任

这应该授予从客户端访问postgres服务器。 所以这导致我相信用户名/密码是失败的。

通过为该数据库创build一个特定的用户来testing

 createuser -a -d -W -U postgres chaosuser

然后调整你的Perl脚本来使用新创build的用户

我的$ dbh = DBI-> connect(“DBI:PgPP:database = chaosLRdb; host = 192.168.0.1; port = 5433”,“chaosuser”,“chaos123”);

要解决这个问题,你可以试试这个。

首先你已经找出你的pg_hba.conf并写下:

 local all all md5 

之后,重新启动PG服务器:

 postgresql restart 

要么

 sudo /etc/init.d/postgresql restart 

对于那些有类似的问题试图连接到本地数据库和尝试像
con = psycopg2.connect(database="my_db", user="my_name", password="admin") ,尝试传递附加参数,所以下面的内容保存了我一天:
con = psycopg2.connect(database="my_db", user="my_name", password="admin", host="localhost")

还要检查PGHOSTvariables:

ECHO $ PGHOST

看它是否与本地计算机名称匹配

如果您的错误如下所示:

 OperationalError: FATAL: no pg_hba.conf entry for host "your ipv6", user "username", database "postgres", SSL off 

然后用你的mac地址添加一个如下所示的条目。

 host all all [your ipv6]/128 md5