我有一些 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 主机等)。