Por que executar o comando como sudo retorna o comando não encontrado?

12

Comando de amostra:

drush cc all

funciona, mas isso:

sudo drush cc all

me dá:

sudo: drush: command not found

Por quê? Como consertar isto?

Códio
fonte
Também tive esse problema algumas vezes, com comandos básicos como cd. Usando o dzdo cdretorno "comando não encontrado". Claro que mais tarde percebeu que cding em um diretório que não tenho permissões, não vai ajudar muito, então eu nem precisa de um shell de root ou necessidade de dzdo ls, dzdo mv, etc. o conteúdo de fora que dir.
Curinga
2
O problema sudo cdé que cdé um comando interno, não um programa. Se você deseja acessar um diretório ao qual não tem acesso e (por exemplo) renomear um arquivo lá, você pode (por exemplo) sudo mv dir/oldfile dir/newfile ou sudo sh -c "cd dir; mv oldfile newfile" .
G-Man Diz 'Reinstate Monica'

Respostas:

13

Quando você sudoobtém um pré-configurado $PATH, que é (supostamente) algo parecido com o caminho padrão do usuário root . Seu programa não está nessa lista de diretórios identificados por $PATH.

Veja por exemplo

O sudo tenta ser seguro ao executar comandos externos.

Existem duas maneiras distintas de lidar com variáveis ​​de ambiente. Por padrão, a opção env_reset sudoers está ativada. Este comando faz com que sejam executados com um ambiente mínimo que contém TERM, PATH, HOME, SHELL, LOGNAME, USERe USERNAME, além de variáveis do processo de chamada permitida pelos env_checke env_keep sudoers opções. Existe efetivamente uma lista de permissões para variáveis ​​de ambiente.

Se você não pode configurar sudopara preservar o seu $PATH, a solução alternativa usual é especificar o nome do caminho completo do programa. Isso pode não funcionar bem com scripts que chamam outros executáveis ​​no diretório (não acessado).

Thomas Dickey
fonte
0

Você deve especificar o caminho completo. Também é mais seguro; Se você não especificar o caminho, é possível que um invasor crie outro programa que será executado com permissões de root.

Além disso, você precisa inserir uma linha /etc/sudoerspara permitir isso. man sudoerspara a sintaxe, é demais colocar aqui.

Tom Zych
fonte