Por que não posso sudo alguns comandos? (por exemplo, vim)

16

Eu tenho acesso ao sudo no servidor dos meus amigos, executando o centos-6.3, mas quando tento executar alguns comandos, como sudo vim /var/www/html/index.htmlrecebo um erro sudo: vim: command not found, posso, no entanto, executar sudo sue depois vim /var/www/html/index.htmlfuncionar como esperado.

echo $PATHe sudo echo $PATHambos produzem:

/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/jared/bin

sudo which vim no entanto produz:

which: no vim in (/sbin:/bin:/usr/sbin:/usr/bin)

Eu tentei adicionar

export PATH=$PATH:/usr/local/bin

ao /root/.bashrcque corrigiu o problema ao usar, sudo sumas não apenas sudo <command>.

Como faço sudo <command>para trabalhar?

JaredMcAteer
fonte
Você já adicionou esse usuário aos sudoers no Centos OS?
AAlvz

Respostas:

18

Durante a execução sudo, muitos sistemas são configurados para limpar o ambiente de todos os valores não incluídos na lista de permissões e redefinir a variável PATH para um valor higienizado.

Você vai encontrar a primeira como Defaults env_resete vários Defaults env_keep += "SOME_VARIABLE_NAME"no /etc/sudoers. A última PATHsubstituição "segura" é especificada como Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin- exclua esta linha para remover esse comportamento ao sudoing.


Como qual variável de ambiente é manipulada é impressa quando você executa  sudo -Vcomo root.


Se você não quiser se livrar desses padrões, sempre poderá especificar programas usando o caminho completo ( sudo /usr/local/bin/vim).

Como alternativa, você pode permitir sua conta SETENVno sudoersarquivo, por exemplo:

%wheel  ALL=(ALL)       SETENV: ALL

Isso permite que você substitua os padrões do ambiente como este sudo PATH=$PATH which vim:, como a variável é interpretada pelo seu shell antes da execução do comando, resultando em uma herança PATH(que provavelmente não incluirá /sbinetc.).

Daniel Beck
fonte
Obrigado. Usarei a solução de Dennis até que o proprietário admita o arquivo sudoers.
JaredMcAteer
6
sudo echo $PATH

não faz o que você pensa. $PATHé substituído pelo (seu) shell antes de executar o comando.

Para realizar o comportamento desejado, você pode usar sudo -i.

Do man sudo :

-eu mando]

A opção -i ( simular login inicial ) executa o shell especificado na entrada passwd (5) do usuário de destino como um shell de login. Isso significa que os arquivos de recursos específicos de login, como .profileou .loginserão lidos pelo shell. Se um comando for especificado, ele será passado para o shell para execução.

Dennis
fonte
1
Essa é uma solução adequada até que eu consiga que o proprietário ajuste o arquivo sudoers.
JaredMcAteer
1

Como faço sudo <command>para trabalhar?

Até você resolver o problema com os caminhos, use um nome de caminho completo

  sudo /usr/local/bin/vim /var/www/html/index.html
RedGrittyBrick
fonte
5
Não vou te rebaixar, mas nunca gosto de resolver os problemas em vez de ir direto ao ponto de descobri-los e corrigi-los.
Nicole Hamilton