Como posso saber se um comando está disponível no $ PATH para o sudo?

2

Eu instalei um utilitário em um servidor recentemente e descobri que ele não estava disponível ao executar a partir de sudo . Ou seja, foo executado conforme o esperado. Comprar sudo foo resultou em sudo: foo: command not found .

Eu rastreei isso de volta para o comando sendo vinculado de /usr/local/bin e sudo usando um PATH que tinha apenas /usr/bin . Eu modifiquei o script de instalação para instalar o /usr/bin e tudo ficou feliz.

Eu gostaria de alterar o script de configuração do meu servidor para detectar este caso e informar um erro se algo mudar e o comando não estiver disponível por algum motivo no futuro. Estou trabalhando com essa pergunta do StackOverflow e sua respostas que sugerem usar um teste como este:

command -v foo >/dev/null 2>&1 || { echo "I require foo but it's not installed.  Aborting." >&2; exit 1; }

No entanto, isso não se comporta como esperado para sudo .

$ command -v foo
/usr/bin/foo
$ sudo command -v foo
sudo: command: command not found
$ sudo type foo
sudo: type: command not found
$ sudo hash -v foo
sudo: hash: command not found
$ sudo foo
   ...executes normally...
$ sudo bash
# command -v foo
/usr/bin/foo
# sudo command -v foo
sudo: command: command not found
# foo
   ...executes normally...
# sudo foo
   ...executes normally...

Curiosamente sudo which foo encontra o comando em /usr/bin/ ; quando executo sudo which bar , ele me diz which: no foo in (/sbin:/bin:/usr/sbin:/usr/bin) , indicando que o caminho para o sudo contém /usr/bin ao ativar subcomandos.

O que está acontecendo?
Que teste posso executar para determinar se um comando está disponível para ser chamado com sudo sem invocar o comando? (Além disso, sem invocar which , como vários comentários e respostas na questão vinculada avisar, senão eu ficaria bem com isso ...)

    
por Patrick M 02.03.2018 / 22:28

1 resposta

3

sudo é usado para executar um binário, portanto, os shell builtins não estão disponíveis a menos que um shell seja executado. bash -c diz ao bash para interpretar o próximo argumento, então sudo bash -c "command -V <exe>" diz sudo para executar bash , que interpreta a string command -V <exe> e invoca o próprio código.

    
por 02.03.2018 / 22:46