关于bash:Perl-DBI和.pgpass

Perl - DBI and .pgpass

我可以使用以下命令成功创建到Postgres数据库的连接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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进行交互式查询。为了省去记住用户名/密码的麻烦,我将凭据放在了权限为600的文件(?/ .pgpass)中。该文件如下所示:

1
2
# host:port:database:user:passwd
myhost:5432:mydb:myuser:mypasswd

如何安全使用此文件("$ENV{HOME}/.pgpass")和DBI模块隐藏我的凭据?能做到吗什么是最佳做法?


是的!有更好的方法。

在测试之间进行更改


  • 按照上述问题,将登录凭据放入名为~/.pgpass的文件中。

  • 要打开连接,您需要对主机,数据库和用户名进行硬编码。但这没关系,因为至少您不需要在密码字段中进行编码。此字段保持隐藏在您的~/.pgpass文件中。

  • 确保将连接实例的密码字段设置为undef

  • 这是对我有用的东西:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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文件。我知道此文件有些不可思议,只是不确定该如何处理。文件连结:

    http://search.cpan.org/dist/DBI/DBI.pm#data_string_diff

    请注意,在该页面上搜索" pgpass"如何不会返回?我拒绝阅读所有内容。好吧,也许有一天..


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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;

    任何能够运行脚本的用户仍然可以看到证书。