Na minha VM do fedora, ao executar com a minha conta de usuário, tenho /usr/local/bin
no meu caminho:
[justin@justin-fedora12 ~]$ env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
E da mesma forma ao executar su
:
[justin@justin-fedora12 ~]$ su -
Password:
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
No entanto, ao executar via sudo
, este diretório não está no caminho:
[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin
Por que o caminho seria diferente ao executar via sudo
?
sudo
preserve $ PATH?Respostas:
Dê uma olhada
/etc/sudoers
. O arquivo padrão no Fedora (assim como no RHEL, e também no Ubuntu e similares) inclui esta linha:O que garante que seu caminho esteja limpo ao executar binários no sudo. Isso ajuda a proteger contra algumas das preocupações mencionadas nesta pergunta . Também é conveniente se você não tiver
/sbin
e/usr/sbin
em seu próprio caminho.fonte
/usr/local/bin
essa diretiva, eu a veria no meu caminho ao executar viasudo
, certo?/usr/local/bin
. Muito obrigado por explicar isso!sudo
for necessário, por exemplo, um script em seu~/bin
(ou qualquer outro caminho que você use)? Acabei de fazer a alteração - funciona, só pensei que poderia haver um outro lado?O comando
su -
executará o perfil de usuários raiz e assumirá o ambiente do usuário, incluindo o caminho etc.sudo
, não o faz.Se você deseja
sudo
se comportar assimsu -
, use a opçãosudo -i [command
que executará o perfil do usuárioSe você gostaria de
su -
se comportar assimsudo
, não use o hífen - basta usarsu [command]
fonte
Você pode verificar o porquê (é diferente) executando
sudo sudo -V
.Por exemplo, no Linux, execute:
Nota: no MacOS / BSD, basta executar:
sudo sudo -V
.A lista acima é restrita devido ao plug-in de diretiva de segurança padrão em algumas distribuições do Linux.
Isso é explicado em
man sudoers
:Se for esse o caso, você pode alterar isso executando
sudo visudo
e editando o arquivo de configuração e modificando seusecure_path
(adicionando caminho extra separado por:
) ou adicione seu usuárioexempt_group
(para não ser afetado pelassecure_path
opções).Ou, para passar
PATH
temporariamente ao usuário , você pode executar:e você pode verificar isso:
Veja também: Como fazer
sudo
preservar$PATH
?Outro motivo pelo qual o ambiente pode ser diferente
sudo
é porque você pode ter aenv_reset
opção ativada no seusudoers
arquivo. Isso faz com que os comandos sejam executados com um ambiente novo e mínimo.Portanto, você pode usar a
env_keep
opção (não recomendada por razões de segurança ) para preservar as variáveis de ambiente do usuário:fonte
Na maioria dos linuxes, você instala programas por meio do gerenciamento de pacotes e recebe atualizações regularmente. Se você instalar algo que contorna o gerenciamento de pacotes, ele será instalado em / usr / local / bin (por exemplo, ou ... / sbin ou / opt) e não receberá atualizações regulares.
Acho que, portanto, os programas não são considerados tão seguros e não são colocados no PATH por padrão.
fonte
sudo
que excluir esse diretório por padrão.Eu tentei isso sozinho e não vi o comportamento que você estava vendo - meu caminho permaneceu o mesmo, então talvez sua configuração do sudo seja diferente. Se você verificar,
man sudoers
verá que existe uma opção chamadasecure_path
redefiniçãoPATH
- parece que essa opção pode ter sido ativada.fonte
Porque quando você usa
sudo bash
,bash
não age como um shell de login. Tente novamente comsudo bash -l
e você verá o mesmo resultado quesu -
.Se isso estiver correto, então a diferença de
PATH
mentiras nos arquivos de configuração:/etc/profile
,~/.bash_profile
,~/.bash_login
,~/.profile
são executados (nessa ordem) para um shell de login, enquanto~/.bashrc
é executada por um shell interativo não-login.fonte
Uma pergunta antiga, eu sei, mas entrei aqui agora porque estava investigando exatamente esse problema.
Por alguma razão,
/usr/local/bin
estava apenas no PATH ao se tornar root viasudo su -
. Ao usá-sudo -i
lo, não estava lá. É claro que agora sei que posso adicioná-lo ao / etc / sudoers, mas isso ainda não explica por que ele já está lá depoissu -
. De onde veio essa parte do PATH?Depois de muito grepping e pesquisa, encontrei a resposta:
O caminho padrão que contém '/ usr / local / bin' é realmente codificado em su (1).
Portanto, nenhuma configuração de pam, perfil, bashrc ou qualquer outra coisa foi responsável por adicionar seletivamente esse elemento. Sempre estava lá quando
su
assumia o controle. E comosudo
não chamasu
, mas usa sua própria configuração, estava faltando depoissudo -i
Eu achei isso verdade no RHEL6 e RHEL7. Não verifiquei nenhuma outra versão ou distribuição.
fonte
su
binário/usr/local/bin
em hexadecimal , mudei para outra coisa e invoquei a cópia. Meu PATH agora continha a string modificada ... É claro que crianças boas e administradores de sistemas não preguiçosos apenas baixam a fonte e fazem o check-in lá. ;-)