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 .