comando sudo não origina /root/.bashrc

23

Eu adicionei um caminho personalizado à variável PATH em meu arquivo /root/.bashrc

Quando eu faço sudo su; echo $PATH , ele mostra a entrada, '/ caminho / para / custom / bins'.

Mas eu faço sudo sh -c 'echo $PATH' , mostra, /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Os caminhos das pastas adicionados no arquivo .bashrc não estão visíveis.

O comando sudo não possui o mesmo ambiente que um usuário root?

    
por Madhavan Kumar 08.09.2015 / 17:37

3 respostas

27

.bashrc é um arquivo de configuração do bash, apenas quando executado de forma interativa. Ele só é carregado quando você inicia o bash, não quando você executa algum outro programa como sh (nem mesmo se o bash é chamado através do nome sh ). E só é carregado quando o bash é interativo, não quando está executando um script ou um comando com -c .

sudo sh -c 'echo $PATH' ou sudo bash -c 'echo $PATH' não invoca um shell interativo, portanto .bashrc não está envolvido.

sudo su; echo $PATH executa uma instância interativa do shell do root. Se isso é bash, então ~root/.bashrc é carregado. Este fragmento executa echo $PATH quando este shell interativo terminar, portanto, o que acontecer no shell interativo não terá influência sobre o que o snippet imprime no final. Mas se você digitar echo $PATH no prompt do shell interativo iniciado por sudo su , verá o valor definido por ~root/.bashrc .

Como .bashrc é invocado em cada shell interativo, não por cascas de login (nem mesmo por cascas de login interativas, que é um defeito de projeto no bash), é o lugar errado para definir variáveis de ambiente. Use .bashrc para configurações bash interativas, como combinações de teclas, aliases e configurações de conclusão. Configure variáveis de ambiente em arquivos que são carregados quando você efetua login: ~/.pam_environment ou ~/.profile .

Portanto, defina PATH em .profile em vez de .bashrc e execute um shell de login com sudo -i 'echo $PATH' ou explique explicitamente .profile com sudo sh -c '. ~/.profile; echo $PATH' .

    
por 09.09.2015 / 02:42
11

Veja as opções -E e -i .

-E : Indica à política de segurança que o usuário deseja preservar suas variáveis de ambiente existentes. A política de segurança pode retornar um erro se o usuário não tiver permissão para preservar o ambiente.

-i : execute o shell especificado pela entrada do banco de dados de senhas do usuário alvo como um shell de login. Isso significa que arquivos de recursos específicos de login, como .profile ou .login, serão lidos pelo shell. Se um comando for especificado, ele será passado para o shell para execução por meio da opção -c do shell. Se nenhum comando for especificado, um shell interativo será executado. O sudo tenta mudar para o diretório inicial desse usuário antes de executar o shell. O comando é executado com um ambiente semelhante ao que um usuário receberia ao efetuar login. A seção do ambiente de comando nos sudoers (5) documenta manualmente como a opção -i afeta o ambiente no qual um comando é executado quando a política de sudoers é em uso.

    
por 08.09.2015 / 17:54
2

Você poderia sudo bash , que leu os arquivos de inicialização bash conforme documentado na página / manual do bash . Observe, no entanto, que ele pode não definir a variável de ambiente HOME corretamente. Isso pode ser corrigido no arquivo de inicialização bash em todo o sistema (em /etc , a localização exata depende da distribuição) - teste se o $uid é 0.

    
por 08.09.2015 / 17:58

Tags