Como definir o caminho para os comandos sudo

37

Se eu emitir

sudo my-command

como o Linux procura isso my-command?

O my-commandestá no meu caminho. Eu posso invocá-lo sem nenhum problema. No entanto, quando eu o invocar sudo, eu atenderei command not found. Interessante, nunca experimente isso antes. Como superar?

EDIT: A resposta selecionada "Possível duplicada" está errada, bem, pelo menos não é o ponto. Esta resposta, de Terdon, é a correta.

xpt
fonte

Respostas:

48

Este é normalmente definido pela secure_pathopção /etc/sudoers. De man sudoers:

 secure_path   Path used for every command run from sudo.  If you don't
               trust the people running sudo to have a sane PATH environ‐
               ment variable you may want to use this.  Another use is if
               you want to have the “root path” be separate from the “user
               path”.  Users in the group specified by the exempt_group
               option are not affected by secure_path.  This option is not
               set by default.

Para executar comandos que não estão no padrão $PATH, você pode

  1. Use o caminho completo: sudo ~/bin/my-command; ou

  2. Adicione o diretório que contém o comando a secure_path. Execute sudo visudoe edite a linha do caminho seguro:

    Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/youruser/bin/"
    

    Salve o arquivo e, da próxima vez que executar sudo, o diretório ~/binestará no diretório $PATH.

Terdon
fonte
2
Ou apenas comente toda a linha se esta não é uma máquina de produção e não nos importamos. Em seguida, ele usará o PATH dos usuários. Ele diz que não está definido por padrão, mas que nem sempre pode ser verdade ...
Nagev 30/01
2

Isto é o que eu usei para uma solução alternativa:

sudo cp $(which my-command) /usr/bin
...

O whichcomando é executado em um subshell que não é raiz, para que seja possível encontrar my-command, então, o sudo copia o executável para um caminho que o rootusuário possa acessar. Não é bom para segurança, mas foi bom para mim executar uma imagem do Docker que estava sendo destruída logo após a execução do comando.

Brenden Smith
fonte