Назад | Перейти на главную страницу

Почему psql пытается подключиться с другим именем пользователя при запуске из сценария Perl

У меня есть несколько скриптов 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.