Por que o psql tenta se conectar com um nome de usuário diferente quando executado a partir de um script Perl?

1

Eu tenho um monte de scripts Perl que recentemente pararam de funcionar. Eu reduzi o problema para isso: quando eu me conecto a um banco de dados postgresql de um script perl, ele tenta usar o nome de usuário errado e a conexão falha.

Por exemplo se eu estou logado como algum usuário:

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

a saída é conforme o esperado.

Mas se eu tentar o mesmo de dentro do Perl:

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

O mesmo acontece ao usar o módulo DBI; Esta é apenas a maneira mais simples de reproduzir o problema. Obviamente, o executável psql está pegando o nome de usuário errado quando executado dentro do Perl; Alguma idéia de como isso está acontecendo?

    
por mojones 07.12.2009 / 14:56

3 respostas

1

O "recentemente parou de funcionar" indica que houve uma mudança recentemente. Você aplicou recentemente uma atualização Perl DBI ou PostgreSQL que coincide com a mudança de comportamento? Em caso afirmativo, informações sobre quais versões você moveu entre seriam úteis.

É possível que o seu intérprete perl seja SUID "anotheruser"?

O que perl -e 'imprime "Real: $ < Efetivo: $ > \ n";' saída ?

A autenticação é bastante flexível no PostgreSQL. Você fez personalizações no seu arquivo pg_hba.conf? Existe algum mapeamento de usuário no arquivo pg_ident.conf?

É possível que haja alguma variável de ambiente definida no seu shell (por exemplo, PGUSER) ou no seu arquivo ~ / .psqlrc?

Para garantir um comportamento determinístico, recomendo que, quando você se conectar ao banco de dados usando o DBI, especifique o nome de usuário que deve ser usado no DSN

por exemplo,

$dbh = DBI->connect ( "dbi:Pg:dbname=one","someuser","" ) ;
    
por 07.12.2009 / 15:11
0

A situação mais comum em que isso aconteceria, se você tivesse a variável PGUSER definida.

    
por 13.12.2009 / 21:25
0

Outra dica geral, não confie nas variáveis de ambiente para o psql em geral; os postgres dev não dão garantias de que irão funcionar. Em vez disso, use os sinalizadores psql (-U user, -d database, -h host, etc ...) em suas chamadas.

    
por 20.12.2009 / 06:36