Если у вас есть какой-либо сервер, вы можете получить к нему доступ, например, через ssh user1@ip
, и вы также можете сделать ssh root@ip
, чтобы перейти к своему корневому пользователю с su привилегиями, а затем перейти к su user1
. По моему мнению, оба эти способа должны привести меня к одной и той же пользовательской среде (в данном случае, «user1»), но в моем собственном опыте это не так, потому что в ssh user1@ip
установлены вещи, которые в su user1
не существуют .
Почему это так?
SSH запускает оболочку входа в систему. su
, по умолчанию не делает.
В частности, это означает что ~/.profile
(или подобный файл), поскольку тот пользователь не получен. Так изменения, внесенные в ~/.profile
не вступит в силу. Могло бы также иметь место что:
~/.profile
, который мог бы загрязнить среду пользователя. /etc/profile
и /etc/profile.d/*
может применить настройки по-другому для различных пользователей (не по умолчанию, хотя)Конфигурация 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
дрянные способы получить корневую оболочку. Оба этих пути загрязнены средой.
Похожие страницы:
В общем и целом это - главным образом стратегическое различие.
, Если Вы зарегистрированы как суперпользователь, можно изменить что-либо все время... т.е. - нет никакой защиты от катастрофических ошибок, необходимо было бы временно измениться на некоторого другого пользователя для безопасности.
принимая во внимание, что: если Вы зарегистрированы с ограниченными полномочиями, Вы избегаете некоторого риска катастрофических ошибок, потому что необходимо намеренно сместиться к su, поддерживают временный доступ к тому питанию, но теперь у Вас есть положение нейтрализации по умолчанию безопасному пользователю.
различие является поэтому действительно стратегическим, не техническим.