我可以使用以下命令成功创建与Postgres数据库的连接:
my $settings = {
host => 'myhost',
db => 'mydb',
user => 'myuser',
passwd => 'mypasswd'
};
my $connection = DBI->connect(
'DBI:Pg:dbname=' . $settings->{'db'} . ';host=' . $settings->{'host'},
$settings->{'user'},
$settings->{'passwd'},
{
RaiseError => 1,
ShowErrorStatement => 0,
AutoCommit => 0
}
) or die DBI->errstr;
但我在Perl模块中留下了有价值的登录凭据(是的,我更改了它们)。目前,我使用psql
以交互方式发出查询。为了节省必须记住我的用户名/密码,我已将凭据放在一个文件(〜/ .pgpass)中,权限为600.文件如下所示:
# host:port:database:user:passwd
myhost:5432:mydb:myuser:mypasswd
如何安全地使用此文件("$ENV{HOME}/.pgpass"
)和DBI
模块隐藏我的凭据?可以吗?什么是最佳做法?
答案 0 :(得分:9)
YES! IS 是一种更好的方式。
测试与测试之间的变化轻松实时服务。
~/.pgpass
(适用于psql
& pg_dump
)~/.pg_service.conf
(或/etc/pg_service.conf
)e.g:
#!/usr/bin/perl -T
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect
(
#"dbi:Pg:service=live",
"dbi:Pg:service=test",
undef,
undef,
{
AutoCommit => 0,
RaiseError => 1,
PrintError => 0
}
) or die DBI->errstr;
〜/ .pg_service.conf:
# http://www.postgresql.org/docs/9.2/static/libpq-pgservice.html
# /usr/local/share/postgresql/pg_service.conf.sample
# http://search.cpan.org/dist/DBD-Pg/Pg.pm
#
[test]
dbname=hotapp_test
user=hotusr_test
# localhost, no TCP nonsense needed:
host=/tmp
[live]
dbname=hotapp_live
user=hotusr_live
host=pgsql-server.example.org
〜/ .pgpass:
# http://www.postgresql.org/docs/9.2/static/libpq-pgpass.html
# hostname:port:database:username:password
localhost:5432:hotapp_test:hotusr_test:kq[O2Px7=g1
pgsql-server.example.org:5432:hotapp_live:hotusr_live:Unm£a7D(H
答案 1 :(得分:1)
open(my $fh, '<', "$ENV{HOME}/.pgpass") or die $!;
my $settings;
while (<>) {
chomp;
next if /^\s*(?:#.*)?\z/s;
@{$settings}{qw( host port database user passwd )} = split /:/;
}
die "No settings" if !$settings;
任何能够运行脚本的用户仍然可以看到信用卡。
答案 2 :(得分:0)
根据上述问题将您的登录凭据放在名为~/.pgpass
的文件中。
要打开连接,您需要在主机,数据库和用户名中进行硬编码。但是没关系,因为至少你不需要在密码字段中编码。此字段隐藏在~/.pgpass
文件中。
确保将连接实例的密码字段设置为undef
。
这对我有用:
my $settings = {
host => 'myhost',
db => 'mydb',
user => 'myuser'
};
my $connection = DBI->connect(
'DBI:Pg:dbname=' . $settings->{'db'} . ';host=' . $settings->{'host'},
$settings->{'user'},
undef,
{
RaiseError => 1,
ShowErrorStatement => 0,
AutoCommit => 0
}
) or die DBI->errstr;
连接成功建立,因为由于某种原因,至少我不知道,实例在尝试连接时搜索~/.pgpass
文件。我知道这个文件有一些魔力,我只是不确定如何处理它。 Doc链接:
http://search.cpan.org/dist/DBI/DBI.pm#data_string_diff
请注意该页面上搜索“pgpass”的方式如何?我拒绝阅读所有内容。好吧,有一天也许..