Algumas noções básicas sobre caminhos de pesquisa
Quando você executa um comando que não contém barras, como vim , o shell precisa saber qual arquivo (ou shell construído / função) executar. Ele encontra isso seguindo o caminho de pesquisa, definido na variável de ambiente PATH . A variável PATH é uma lista de caminhos separados por dois pontos e o shell procurará o nome do comando em cada um desses caminhos nessa ordem.
Por exemplo, um PATH básico de uma instalação Debian se parece com o seguinte:
/usr/local/bin:/usr/bin:/bin
Nesse caso, você encontra /usr/bin/vim primeiro, conforme mostrado pela saída de which vim e type vim .
Agora, quando você executar um comando via sudo , onde as opções env_reset e secure_path são especificadas, sudo redefinirá o caminho de pesquisa para o conteúdo de secure_path antes de executar o comando que você passa. Isso significa que um comando executado por meio de sudo poderia ter um caminho de pesquisa diferente e poderia encontrar um executável diferente da execução direta do comando.
Por exemplo, um% básicosudo PATH do Debian:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Seu cenário
O que eu suspeito que está acontecendo aqui é o seu secure_path especifica uma ordem em que /bin vem antes de /usr/bin ou o último não existe. Nesse caso, o shell procurará vim e, eventualmente, encontrará /bin/vim , desde que ele exista. E se apenas /usr/bin/vim estiver na lista de permissões, o primeiro não poderá ser executado.
Você pode verificar seu atual PATH com echo $PATH . Você pode verificar o sudo de PATH com sudo env | grep PATH . Se o seu administrador tiver definido listas de permissão somente permitindo vim , você poderá acessar sudo vim e executar o comando :echo $PATH .
Você deve conseguir contornar isso especificando um caminho absoluto, por exemplo, sudo /usr/bin/vim .
Por que o search_path existe?
Quanto a por que sudo define um caminho diferente, considere este cenário de ataque:
Seu PATH é apenas uma variável de ambiente. Pode ser definido de muitas maneiras diferentes, possivelmente invisíveis para o usuário. Você pode ter diretórios inseguros que permitem que qualquer um escreva para eles. Se alguém criar um arquivo executável mal-intencionado chamado algo como ls , quando você executar ls , estará executando esse arquivo em vez do ls real.
Mas o dano seria limitado ao que sua conta tem acesso. Agora, digamos que você execute sudo ls - se o PATH for retirado do seu atual PATH em vez de ser redefinido, você executará agora um executável mal-intencionado com privilégios de root - um ataque de escalonamento de privilégios. Muito mais dano possível do que apenas correr como seu próprio usuário.
Agora, você pode argumentar que um invasor com a capacidade de colocar arquivos no seu PATH ou modificar seu PATH já pode causar muitos danos. E você provavelmente está certo. Há opiniões de ambos os lados sobre a utilidade de secure_path , que não vou abordar aqui.