SSH inicia un shell de inicio de sesión. su
, por defecto no lo hace.
En particular, esto significa que el ~/.profile
(o archivo similar) para ese usuario no se obtiene. Por lo tanto, los cambios realizados ~/.profile
no tendrán efecto. También podría ser el caso de que:
- incluso si inicia un shell de inicio de sesión, se realizaron diferentes cambios en la raíz
~/.profile
, lo que podría contaminar el entorno del usuario.
/etc/profile
y /etc/profile.d/*
puede aplicar configuraciones de manera diferente para diferentes usuarios (aunque no de forma predeterminada)
- puede haber diferentes configuraciones para diferentes usuarios en la configuración SSH.
La configuración de PAM es diferente. Por ejemplo, /etc/pam.d/ssh
tiene:
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
mientras que /etc/pam.d/su
tiene:
session required pam_env.so readenv=1 envfile=/etc/default/locale
Esto significa que SSH se carga ~/.pam_environment
, pero su
no lo hace. Este es uno grande, ya que ~/.pam_environment
es el lugar independiente de la shell para las variables de entorno, y se aplica si inicia sesión desde la GUI, TTY o SSH.
Para iniciar un shell de inicio de sesión, ejecute cualquiera de:
su - <username>
sudo -iu <username>
Ejemplo:
# 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
Incluso con SSH, si ejecuta un comando en lugar de iniciar un shell, no se ejecutará un shell de inicio de sesión (tenga en cuenta la ausencia de ~/bin
en la prueba SSH, que está presente en su -
y sudo -i
). Para obtener el verdadero resultado, ejecutaré mi shell como un shell de inicio de sesión:
# 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
Esta es también la razón sudo su
y sudo -s
son formas desagradables de obtener un shell raíz. Ambas formas están contaminadas por el medio ambiente.
Relacionado: