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

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

例如,如果我以某个用户身份login:

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中运行时正在input错误的用户名; 任何想法如何发生?

“最近停止工作”意味着最近有一个变化。 你最近是否应用了一个Perl DBI或PostgreSQL更新,与行为的改变相吻合? 如果是的话,那么你在哪个版本之间移动的信息将是有用的。

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

perl -e'print'真实:$ <Effective:$> \ n“;' 输出?

PostgreSQL中的authentication非常灵活。 你有没有定制你的pg_hba.conf文件? 在pg_ident.conf文件中是否有用户映射?

是否有可能在您的shell(例如PGUSER)或您的〜/ .psqlrc文件中设置了任何环境variables?

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

例如

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

如果你有PGUSERvariables设置,最常见的情况就是发生这种情况。

另一个一般的提示,一般不要依赖psql的环境variables; postgres开发者不能保证他们会工作。 相反,在你的调用中使用psql标志(-U用户,-d数据库,-h主机等)。