O SSH inicia um shell de logon. su
, por padrão, não.
Em particular, isso significa que o ~/.profile
(ou arquivo semelhante) para esse usuário não é originado. Portanto, as alterações feitas ~/.profile
não terão efeito. Também pode ser que:
- mesmo se você iniciar um shell de logon, diferentes alterações foram feitas no root
~/.profile
, o que pode poluir o ambiente do usuário.
/etc/profile
e /etc/profile.d/*
pode aplicar configurações de maneira diferente para usuários diferentes (embora não por padrão)
- pode haver configurações diferentes para usuários diferentes na configuração do SSH.
A configuração do PAM é diferente. Por exemplo, /etc/pam.d/ssh
possui:
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
considerando /etc/pam.d/su
que:
session required pam_env.so readenv=1 envfile=/etc/default/locale
Isso significa que o SSH carrega ~/.pam_environment
, mas su
não. Esse é um grande exemplo, pois ~/.pam_environment
é o local independente do shell para variáveis de ambiente e será aplicado se você efetuar login na GUI, no TTY ou no SSH.
Para iniciar um shell de logon, execute um dos seguintes:
su - <username>
sudo -iu <username>
Exemplo:
# su muru -c 'sh -c "echo $HOME $PATH"'
/home/muru /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
# su - muru -c 'sh -c "echo $HOME $PATH"'
/home/muru /home/muru/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
# sudo -iu muru sh -c 'echo $HOME $PATH'
/home/muru /home/muru/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# sudo -u muru sh -c 'echo $HOME $PATH'
/root /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ssh muru@localhost 'echo $HOME $PATH'
/home/muru /home/muru/devel/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Mesmo com o SSH, se você executar um comando em vez de iniciar um shell, um shell de login não será executado (observe a ausência de ~/bin
no teste SSH, que está presente em su -
e sudo -i
). Para obter o verdadeiro resultado, executarei meu shell como um shell de login:
# ssh muru@localhost '$SHELL -ilc "echo \$HOME \$PATH"'
/home/muru /home/muru/bin:/home/muru/devel/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
É também por isso sudo su
e sudo -s
são maneiras ruins de obter um shell raiz. Ambas as formas são poluídas pelo meio ambiente.
Relacionado: