O comando sudo não origina /root/.bashrc

27

PATHAdicionei um caminho personalizado à variável no meu arquivo /root/.bashrc

Quando o faço sudo su; echo $PATH, ele mostra a entrada '/ path / to / 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 da pasta adicionados ao arquivo .bashrc não são visíveis.

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


fonte

Respostas:

32

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

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

sudo su; echo $PATHexecuta uma instância interativa do shell do root. Se isso é bash, então ~root/.bashrcé carregado. Esse snippet é executado echo $PATHassim que o shell interativo termina, portanto, o que quer que aconteça no shell interativo não influencia o que o snippet imprime no final. Mas se você digitar echo $PATHno prompt do shell interativo iniciado sudo su, verá o valor definido por ~root/.bashrc.

Como .bashrcé invocado em cada shell interativo, não por shells de login (nem mesmo por shells de login interativo, que é um defeito de design no bash), é o lugar errado para definir variáveis ​​de ambiente. Use .bashrcpara configurações de bash interativas, como ligações de teclas, aliases e configurações de conclusão. Defina variáveis ​​de ambiente nos arquivos carregados quando você efetua login: ~/.pam_environmentou ~/.profile.

Portanto, defina PATHem .profilevez de .bashrce execute um shell de logon com sudo -i 'echo $PATH', ou explique .profilecom sudo sh -c '. ~/.profile; echo $PATH'.

Gilles 'SO- parar de ser mau'
fonte
1
abordou muitos pontos relevantes sobre conchas .... agradecimentos ....
1
Como faço para adicioná-lo .profile? Você quer dizer /root/.profileou /home/user/.profile? Eu tentei adicionar export PATH=$PATH:/mydiraos dois. Não funcionou. Eu tentei sem export, isso também não funcionou.
falsePockets 22/01
@falsePockets Não funcionou para quê? Você deve fazer uma nova pergunta e explicar exatamente o que está fazendo.
Gilles 'SO- stop be evil'
O que não funcionou é exatamente o mesmo que o OP está tentando fazer. Estou tentando adicionar um diretório ao PATH do meu superusuário. Não devo fazer uma nova pergunta, pois ela seria uma duplicata desta pergunta.
falsePockets 23/01
@falsePockets Mas, evidentemente, você não está fazendo a mesma coisa para acessar a conta de superusuário. E como você não disse o que está fazendo, não posso ajudá-lo a não ser repetir o que já está na minha resposta.
Gilles 'SO- stop be evil'
14

Veja as opções -Ee -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 senha do usuário de destino como um shell de logon. Isso significa que os 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 através 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 Ambiente de comando no manual sudoers (5) documenta como a opção -i afeta o ambiente em que um comando é executado quando a política de sudoers é em uso.

Vinz
fonte
3

Você pode sudo bash, que lê os basharquivos de inicialização conforme documentado na bashpágina / documentação do manual. Observe, no entanto, que ela pode não definir a HOMEvariável de ambiente corretamente. Isso pode ser corrigido no basharquivo de inicialização de todo o sistema ( /etca localização exata depende da distribuição) - teste se $uidé 0.

Ned64
fonte