Por que o sudo não sabe onde o psql está?

4

O problema

A documentação de instalação do CKAN mostra como listar os bancos de dados PostgreSQL instalados. / p>

O comando é assim:

sudo -u postgres psql -l

Quando eu tento isso no meu shell, recebo um erro:

$ sudo -u postgres psql -l
sudo: psql: command not found

A solução alternativa

Daniel2d2art no fórum do CentOS resolveu o problema ao qualificar totalmente o caminho para psql.

Meu psql mora no diretório /usr/pgsql-9.2/bin , então minha solução agora é assim:

sudo -u postgres /usr/pgsql-9.2/bin/psql -l

Quando eu tento isso no meu shell, funciona:

$ sudo -u postgres /usr/pgsql-9.2/bin/psql -l
                                   List of databases
     Name     |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
--------------+----------+----------+-------------+-------------+-----------------------
 postgis_test | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
              |          |          |             |             | postgres=CTc/postgres
 template1    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
              |          |          |             |             | postgres=CTc/postgres
(4 rows)

Como faço para corrigir isso corretamente?

Eu não deveria ter que qualificar totalmente o caminho, certo?

O usuário postgres já tem o psql em seu caminho:

$ sudo -u postgres echo $PATH
/usr/pgsql-9.2/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin

Como faço para corrigir isso corretamente?

    
por Iain Samuel McLean Elder 26.09.2013 / 14:46

2 respostas

7

Por que o sudo ignora seu caminho

sudo não usa o caminho do usuário ou o caminho do usuário do postgres. O sudo tem seu próprio caminho, definido pela variável secure_path no arquivo /etc/sudoers .

A saída de echo $PATH é enganosa neste caso. Para ver o caminho que o sudo realmente usa, use printenv PATH . No meu caso, a saída ficou assim:

$ sudo -u postgres printenv PATH
/sbin:/bin:/usr/sbin:/usr/bin

A saída não contém /usr/pgsql-9.2/bin , onde o psql mora, portanto não está no caminho do sudo.

Para corrigir o problema, você pode adicionar onde o psql vive para a variável secure_path .

Como dizer ao sudo onde o psql mora

Use sudo visudo para abrir /etc/sudoers no vi.

O arquivo deve conter uma linha como esta:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

Esta linha define o caminho para o sudo. A parte depois do sinal de igual é igual à saída do exemplo anterior de printenv PATH .

Substitua por algo assim:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/pgsql-9.2/bin

A substituição anexa /usr/pgsql-9.2/bin à lista de caminhos. O separador da lista de caminhos é dois pontos ( : ).

Salve e feche o arquivo.

Para verificar se funcionou, tente novamente o comando printenv PATH :

$ sudo -u postgres printenv PATH
/sbin:/bin:/usr/sbin:/usr/bin:/usr/pgsql-9.2/bin

Parece bom!

Agora tente o comando psql -l :

$ sudo -u postgres psql -l
                                   List of databases
     Name     |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
--------------+----------+----------+-------------+-------------+-----------------------
 postgis_test | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
              |          |          |             |             | postgres=CTc/postgres
 template1    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
              |          |          |             |             | postgres=CTc/postgres
(4 rows)

Funciona!

Obrigado ao Drew Khoury que me indicou um solução para um problema semelhante em Super User .

    
por 26.09.2013 / 16:20
0

uma pequena solução alternativa - se você não tem problema com a execução de mais comandos, você pode alternar o usuário

sudo su postgres

e depois

psql -l

deve funcionar.

    
por 26.09.2013 / 16:20