comando não encontrado ao usar sudo

53

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

Meu sistema operacional é o Ubuntu 12.04. Eu mvninstalei /tools/noarch/apache-maven-3.1.1e 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 eu executo source /etc/profile.

Agora o meu problema é: quando eu executar mvn --versiono comando tiver êxito e mvnexecutável é encontrado, enquanto que, se eu executar: sudo mvn --versioneu recebo a saída: sudo: mvn: command not found. Eu sei que PATHpode ser diferente quando executo um comando com sudoe é 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 digitar mvn --version. Nesse caso, mvnfoi encontrado com sucesso e o comando foi bem-sucedido. O que está acontecendo aqui?

izomorphius
fonte

Respostas:

38

$PATH é avaliado pelo seu shell, para que sua verificação não funcione conforme o esperado.

/etc/sudoersestá configurado para substituir o seu PATHpor um padrão.

sudonão carrega um ambiente de shell de login antes de executar o comando, portanto, o padrão PATHde /etc/sudoersé usado. su -abre um shell de login, que envolve o carregamento /etc/profile. Consulte a man bashseção INVOCAÇÃO .

Basta remover a PATHredefinição /etc/sudoers. É provável que uma regra seja chamada secure_path.


CentOS

No CentOS você pode adicionar PATHà Defaults env_keepseção:

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"
Daniel Beck
fonte
Obrigado pela resposta. Ele resolve o problema, mas eu prefiro a sugestão de solução nas outras duas respostas, pois realiza uma alteração apenas para o maven, não para todos os comandos no meu PATH.
Izomorphius 31/01
FYI: Observe minha atualização de resposta.
Kriegaex #
como sudo executar binários no diretório atual sudo: ./<some_binary>: command not found. Estou usando o Arch Linux.
Necktwi
47

sudosua atual PATHcom:

sudo env "PATH=$PATH" your_command
opiar
fonte
Uma ótima resposta, que não requer modificação de configurações, permitindo que o chamador faça tudo o que for necessário. -EAlém disso, eu usaria a opção para preservar o restante do ambiente. De fato, isso é tão útil que pode ser colocado em um script / alias / function para facilitar o uso. Vou adicionar isso como uma resposta separada - mas parabéns ao @opyate!
Tom
Quando tento executar este comando, recebo env: cmd: No such file or directory- Alguma idéia de por que isso seria?
30515 Andy
2
@ Substitua cmd pelo seu comando real.
opyate
como sudo executar binários no diretório atual sudo: ./<some_binary>: command not found. Estou usando o Arch Linux.
Necktwi
12

Ao elaborar a resposta do @ opyate, estou usando o seguinte script de shell (que pode ser nomeado mysudo, por exemplo):

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -Ediz sudopara preservar o meio ambiente.
  • env "PATH=$PATH"é expandido fora da sudochamada, disponibilizando o externo também para PATHo interior sudo(isso é necessário além do -Eque PATHgeralmente recebe tratamento especial, além do tratamento que todo o ambiente recebe).
  • "$@"passa os argumentos que nosso script recebe para a sudolinha.

Salve o script em um arquivo em um diretório no diretório PATH, dê a ele +xpermissões e pronto.

Tom
fonte
Esta é uma solução muito melhor para aqueles que não desejam editar nenhum arquivo existente.
qaisjp
4

Como as respostas atuais são um pouco vagas, a configuração específica para /etc/sudoersmudar 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
mikemaccana
fonte
2

Eu tive o mesmo problema quando instalei o Maven pela primeira vez . O problema foi resolvido depois que adicionei 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é o meu nome de usuário Ubuntu):

/home/mehran/.bashrc
/home/mehran/.profile
Mehran Hatami
fonte
1

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

MariusMatutiae
fonte
1
Eu editei /root/.bashrc, mas não sou capaz de obtê-lo: sudo source /root/.bashrcgets: sudo: source: command not founde sem a sudopermissão, recebo negada (conforme o esperado). Eu acredito que iniciar um novo terminal deve, em teoria, fazer o mesmo que a fonte, mas depois de iniciar um novo terminal, sudo mvn --versionainda não encontramos nada.
Izomorphius 31/01
@izomorphius Você não pode sudo source. Você deve primeiro alternar para sudo com o comando sudo su , para poder originar o arquivo em questão. Não há outra maneira de fazer isso.
MariusMatutiae 31/01