为什么 psql 在从 Perl 脚本运行时尝试使用不同的用户名连接

为什么 psql 在从 Perl 脚本运行时尝试使用不同的用户名连接

我有一些 Perl 脚本最近停止工作了。我把问题缩小到这个:当我从 perl 脚本连接到 postgresql 数据库时,它尝试使用错误的用户名,连接失败。

例如如果我以某个用户身份登录:

someuser$ psql -l
           List of databases
      Name       |  Owner   | Encoding 
-----------------+----------+----------
 one             | someuser | UTF8
 two             | someuser | UTF8

输出符合预期。

但如果我在 Perl 中尝试同样的事情:

someuser$ perl -e 'system("psql -l")'
psql: FATAL:  role "anotheruser" does not exist

使用 DBI 模块时也会发生同样的事情;这只是重现问题的最简单方法。显然,psql可执行文件在从 Perl 内部运行时会拾取错误的用户名;您知道这是怎么发生的吗?

答案1

“最近停止工作”意味着最近发生了变化。您最近是否应用了与行为变化相吻合的 Perl DBI 或 PostgreSQL 更新?如果是这样,那么有关您在哪些版本之间移动的信息将很有用。

你的 perl 解释器是否有可能是 SUID“anotheruser”?

什么是perl -e ‘打印‘实际:$<有效:$>\n’;’输出?

PostgreSQL 中的身份验证非常灵活。您是否对 pg_hba.conf 文件进行了自定义?pg_ident.conf 文件中是否有任何用户映射?

您的 shell(例如 PGUSER)或 ~/.psqlrc 文件中是否可能设置了任何环境变量?

为了确保确定性行为,我建议在使用 DBI 连接到数据库时,指定应在 DSN 中使用的用户名

例如

$dbh = DBI->connect ( "dbi:Pg:dbname=one","someuser","" ) ;

答案2

如果您设置了 PGUSER 变量,则最常见的情况是发生这种情况。

答案3

另一个一般提示是,通常不要依赖 psql 的环境变量;postgres 开发人员不保证它们会正常工作。相反,请在调用中使用 psql 标志(-U 用户、-d 数据库、-h 主机等)。

相关内容