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хитрі способи отримання кореневої оболонки. Обидва ці способи забруднюються довкіллям.
Пов'язані: