sudo: source: comando não encontrado

39

Eu atualizei alguns dos perfis padrão do bash, e vi nos tutoriais que estava seguindo que eu poderia recarregar o novo perfil com as novas configurações de ambiente usando:

source /etc/bash.bashrc

A única coisa é - as novas variáveis de ambiente só estavam disponíveis para o meu usuário atual - e foram ignoradas quando eu usei o sudo. Eles só se tornaram disponíveis para o sudo quando eu fechei minha sessão de terminal e me juntei novamente.

Quando tento usar:

sudo source /etc/bash.bashrc

Eu recebo o erro:

sudo: source: command not found

Existe uma maneira simples de carregar as novas configurações do perfil bash para o sudo sem ter que fechar o terminal e reiniciar?

Inicialmente, eu estava usando alguns scripts de instalação que referenciavam as variáveis. Descobri que, embora eles pudessem acessar as variáveis quando eu chamei os scripts diretamente (embora, isso causaria um problema posterior ao criar diretórios, já que eu precisava ser o root), chamar os scripts de instalação usando sudo não seria.

Eu provei isso testando com estes comandos simples:

echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE

O primeiro produziria o valor da variável, mas o segundo não produziria nada.

    
por HorusKol 10.01.2011 / 23:25

6 respostas

47

O problema é que source é um comando embutido bash (não é um programa - como ls ou grep ). Eu acho que uma abordagem é fazer o login como root e, em seguida, executar o comando de origem.

sudo -s
source /etc/bash.bashrc
    
por Marcos Roriz Junior 10.01.2011 / 23:31
10

O problema não é que source seja um comando interno do shell. O fato de que é é o que realmente está causando o erro command not found , mas isso não significa que funcionaria se fosse.

O problema real é como as variáveis de ambiente funcionam. E eles funcionam assim: toda vez que um novo processo é iniciado, se nada acontecer, ele herda o ambiente de seu pai. Devido a isso, usar um subshell (por exemplo, digitar bash dentro de uma instância do bash) e observar a saída de env deve fornecer resultados semelhantes aos do seu pai.

No entanto, devido a como sudo funciona (como indicado em sua manpage), o sudo tenta remover o ambiente do usuário e criar um ambiente "padrão" para o usuário suplantante, para que o comando seja executado como se o usuário que o invocou fosse o usuário chamador (que é o comportamento esperado) e, portanto, executar o nautilus como sudo nautilus deve abrir uma pasta na pasta /root , e não /home/yourusername .

Então:

Fazendo algo como sudo source script.sh e, em seguida, sudo command , mesmo que funcione, não seria bem-sucedido definir qualquer variável para o último sudo command .

Para passar variáveis de ambiente, você pode dizer ao sudo para preservar o ambiente (através da -E switch; e ter as permissões apropriadas no seu arquivo sudoers) e / ou defini-lo para o comando como sudo VAR1=VALUE1 VAR2=VALUE2 command . / p>     

por ssice 18.11.2013 / 20:28
2

Fechar e reabrir o terminal não deve mudar as coisas. Por padrão, o sudo remove o ambiente. Para desabilitar isso, adicione -E ao sudo.

    
por psusi 11.01.2011 / 03:55
1

Como Marcos diz , seu principal problema aqui é que source é um comando interno do shell que afeta apenas o processo do shell no qual ele é executado.

A solução fácil é apenas iniciar um novo shell como root, e o bash lerá automaticamente /etc/bash.bashrc quando for iniciado. Isso é tão simples quanto dizer

sudo bash
    
por poolie 11.01.2011 / 00:03
0

Tente executar este sudo su -c "source /etc/bash.bashrc"

Isso permitirá que você faça login temporariamente no código-fonte raiz do arquivo e sairá da sessão raiz automaticamente

    
por Vishal Seshagiri 25.07.2017 / 09:01
0

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 Anonymous Platypus 08.03.2018 / 10:49