SSH запускає оболонку входу. su
, за замовчуванням не робить.
Зокрема, це означає, що ~/.profile
(або подібний файл) для цього користувача не є джерелом. Тож зміни, внесені в ~/.profile
, не набудуть чинності. Можливо також, що:
- навіть якщо ви запускаєте оболонку для входу, в корені були внесені різні зміни
~/.profile
, які можуть забруднити середовище користувача.
/etc/profile
і /etc/profile.d/*
можуть застосовувати налаштування по-різному для різних користувачів (не за замовчуванням, хоча)
- можуть бути різні налаштування для різних користувачів у конфігурації SSH.
Конфігурація PAM відрізняється. Наприклад, /etc/pam.d/ssh
має:
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
тоді як /etc/pam.d/su
має:
session required pam_env.so readenv=1 envfile=/etc/default/locale
Це означає, що SSH завантажує ~/.pam_environment
, але su
ні. Це велике місце, оскільки ~/.pam_environment
це місце, незалежне від оболонки, для змінних оточуючих середовищ, і застосовується, якщо ви увійдете з GUI, TTY або SSH.
Щоб запустити оболонку для входу, запустіть будь-яке з:
su - <username>
sudo -iu <username>
Приклад:
# 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
Навіть із SSH, якщо ви запускаєте команду замість запуску оболонки, оболонка входу не буде запускатися (зауважте, відсутність ~/bin
у тесті SSH, який присутній у su -
та sudo -i
). Щоб отримати справжній результат, я запускаю свою оболонку як оболонку для входу:
# 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
Ось чому це sudo su
і sudo -s
хитрі способи отримання кореневої оболонки. Обидва ці способи забруднюються довкіллям.
Пов'язані: