comando não encontrado ao usar o sudo

44

Existem algumas perguntas no site que parecem relacionadas ao meu problema, mas não consegui encontrar uma solução em nenhuma delas.

Meu sistema operacional é o Ubuntu 12.04. Eu tenho mvn instalado em /tools/noarch/apache-maven-3.1.1 e adicionei as seguintes linhas no final do meu /etc/profile :

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

Depois disso, executo source /etc/profile .

Agora, meu problema é: quando eu executo mvn --version o comando é bem-sucedido e mvn executável é encontrado, enquanto se eu executo: sudo mvn --version eu recebo a saída: sudo: mvn: command not found . Eu sei que PATH pode ser diferente quando executo um comando com sudo e é por isso que tentei isso:

$>sudo echo $PATH
/tools/noarch/apache-maven-3.1.1/bin:... some other stuff ...

Outra coisa que tentei é executar sudo su - e, em seguida, digitar mvn --version . Nesse caso, mvn é encontrado com sucesso e o comando é bem-sucedido. O que está acontecendo aqui?

    
por izomorphius 31.01.2014 / 09:57

7 respostas

31

$PATH é avaliado pelo seu shell, portanto, sua verificação não funciona conforme o esperado.

/etc/sudoers está configurado para substituir seu PATH por um padrão.

sudo não carrega um ambiente de shell de login antes de executar o comando, portanto, o padrão PATH de /etc/sudoers é usado. su - abre um shell de login, que envolve o carregamento de /etc/profile . Veja man bash , seção INVOCATION .

Basta remover o PATH reset em /etc/sudoers . É provável que uma regra seja chamada secure_path .

CentOS

No CentOS, você pode adicionar PATH à seção Defaults env_keep :

Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY PATH"
    
por 31.01.2014 / 10:06
38

Conceda sudo do seu atual PATH com:

sudo env "PATH=$PATH" your_command
    
por 23.03.2015 / 11:34
7

Elaborando a resposta do @opyate, estou usando o seguinte shell script (que pode ser denominado mysudo , por exemplo):

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -E diz sudo para preservar o ambiente.
  • env "PATH=$PATH" é expandido fora da chamada sudo , disponibilizando o PATH externo dentro do sudo (isso é necessário além do -E , pois o PATH geralmente recebe tratamento especial além do tratamento todo o ambiente recebe).
  • "$@" passa os argumentos que nosso script recebe para a linha sudo .

Salve o script em um arquivo em um diretório no PATH , atribua +x permissions, et voilà.

    
por 01.04.2015 / 01:14
3

Como as respostas atuais são um pouco vagas, a configuração específica em /etc/sudoers alterando seu caminho é secure_path :

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

Você pode modificá-lo com sudo visudo ou, melhor ainda, adicionar os diretórios necessários:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
    
por 03.10.2015 / 23:39
2

Eu tive o mesmo problema quando instalei pela primeira vez o Maven . O problema foi resolvido depois de adicionar as duas linhas,

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

para quatro arquivos:

/root/.bashrc
/root/.profile

e para o usuário atual ( mehran é meu nome de usuário do Ubuntu):

/home/mehran/.bashrc
/home/mehran/.profile
    
por 31.01.2014 / 10:22
1

Você deve modificar a variável PATH do root exatamente como você fez para si mesmo, isto é, adicionando essas duas linhas no perfil do sudo, que está localizado em /root/.bashrc e, em seguida, fonte.

    
por 31.01.2014 / 10:07
1

O erro ocorre porque o binário que você está tentando chamar da linha de comando é apenas parte da variável PATH do usuário atual, mas não faz parte do PATH do usuário root.

Você pode verificar isso localizando o caminho do binário que você está tentando acessar. No meu caso eu estava tentando chamar "bettercap-ng". Então eu corri,

$ which bettercap-ng

output: /home/user/work/bin/bettercap

Eu verifiquei se esse local é parte do PATH do meu usuário root.

$ sudo env | grep ^PATH

saída: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

Então o sudo não consegue encontrar o binário que estou tentando chamar da linha de comando. Daí retorna o comando de erro não encontrado.

Você pode direcionar o sudo para usar o PATH do usuário atual ao chamar um binário como abaixo.

$ sudo -E env "PATH=$PATH" [command] [arguments]

Na verdade, pode-se criar um alias:

$ alias mysudo='sudo -E env "PATH=$PATH"'

Também é possível nomear o próprio alias sudo, substituindo o sudo original.

Por favor, consulte este vídeo para a solução passo a passo

    
por 08.03.2018 / 10:49