SSH запускает оболочку входа. su
по умолчанию нет.
В частности, это означает, что ~/.profile
(или аналогичный файл) для этого пользователя не получен. Поэтому внесенные изменения ~/.profile
не вступят в силу. Возможно также, что:
- даже если вы запускаете оболочку входа в систему, в root
~/.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
являются дрянными способами получить корневую оболочку. Оба эти способа загрязнены окружающей средой.
Связанный: