Por que não consigo usar alguns comandos? (por exemplo, vim)

13

Eu tenho acesso sudo no meu servidor de amigos, rodando centos-6.3, mas quando eu tento rodar alguns comandos como sudo vim /var/www/html/index.html eu recebo um erro sudo: vim: command not found eu posso, no entanto, rodar sudo su e depois vim /var/www/html/index.html e funciona como esperado.

echo $PATH e sudo echo $PATH ambos produzem:

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

sudo which vim , no entanto, gera:

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

Eu tentei adicionar

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

para o /root/.bashrc que corrigiu o problema ao usar sudo su , mas não apenas sudo <command> .

Como faço para que sudo <command> funcione?

    
por JaredMcAteer 08.02.2013 / 18:07

3 respostas

17

Ao executar sudo , muitos sistemas são configurados para limpar o ambiente de todos os valores não permitidos e para redefinir a variável PATH para um valor higienizado.

Você encontrará o primeiro como Defaults env_reset e vários Defaults env_keep += "SOME_VARIABLE_NAME" em /etc/sudoers . O último "seguro" PATH override é especificado como Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin - exclua esta linha para remover esse comportamento quando sudo ing.

Como a variável de ambiente é manipulada é impressa quando você executa sudo -V as root .

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

Como alternativa, você pode permitir que sua conta seja SETENV no arquivo sudoers , por exemplo:

%wheel  ALL=(ALL)       SETENV: ALL

Isso permite que você substitua padrões de ambiente como este: sudo PATH=$PATH which vim , pois a variável é interpretada pelo seu shell antes que o comando seja executado, resultando em um PATH herdado (que provavelmente não incluirá /sbin etc. ).

    
por 08.02.2013 / 18:16
6
sudo echo $PATH

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

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

De homem sudo :

-i [command]

The -i (simulate initial login) option runs the shell specified in the passwd(5) entry of the target user as a login shell. This means that login-specific resource files such as .profile or .login will be read by the shell. If a command is specified, it is passed to the shell for execution.

    
por 08.02.2013 / 18:15
1

How do I get sudo <command> to work?

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

  sudo /usr/local/bin/vim /var/www/html/index.html
    
por 08.02.2013 / 18:15

Tags