主机没有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