У меня есть несколько скриптов Perl, которые недавно перестали работать. Я сузил проблему до следующего: когда я подключаюсь к базе данных postgresql из сценария perl, он пытается использовать неправильное имя пользователя, и соединение не удается.
Например. если я вошел в систему как пользователь:
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; есть идеи, как это происходит?
«Недавно перестали работать» означает, что в последнее время произошли изменения. Применяли ли вы недавно обновление Perl DBI или PostgreSQL, которое совпадает с изменением поведения? В таком случае будет полезна информация о том, между какими версиями вы переходили.
Возможно ли, что ваш интерпретатор Perl - это SUID "anotheruser"?
Что значит perl -e 'print "Real: $ <Effective: $> \ n";' вывод?
Аутентификация в PostgreSQL довольно гибкая. Вы внесли изменения в свой файл pg_hba.conf? Есть ли сопоставления пользователей в файле pg_ident.conf?
Возможно ли, что в вашей оболочке (например, PGUSER) или в вашем файле ~ / .psqlrc установлены какие-либо переменные среды?
Чтобы обеспечить детерминированное поведение, я бы рекомендовал, чтобы при подключении к базе данных с помощью DBI вы указывали имя пользователя, которое должно использоваться в DSN.
например
$dbh = DBI->connect ( "dbi:Pg:dbname=one","someuser","" ) ;
Еще один общий совет: не полагайтесь на переменные окружения для psql вообще; разработчики postgres не дают никаких гарантий, что они будут работать. Вместо этого используйте в вызовах флаги psql (-U пользователь, -d база данных, -h хост и т. Д.).
Наиболее частая ситуация, в которой это может произойти, если у вас установлена переменная PGUSER.