Как настроить sudo так, чтобы он не изменял $HOME в Ubuntu, и как отключить это поведение?

Как настроить sudo так, чтобы он не изменял $HOME в Ubuntu, и как отключить это поведение?

В Ubuntu 12.04, когда sudo -sпеременная $HOME не изменяется, то, если мой обычный пользователь — regularuser, ситуация выглядит следующим образом:

$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser

Я давно отказался от Ubuntu, поэтому не могу быть уверен, но думаю, что это поведение по умолчанию. Итак, мои вопросы:

  1. Как это делается? Где конфиг?
  2. Как это отключить?

Редактировать: Спасибо за ответы, которые немного прояснили ситуацию, но, думаю, мне следует добавить пару вопросов, чтобы получить ответ, который я ищу.

  1. В Debian sudo -sменяет переменную $HOME на /root. Из того, что я получаю из ответов и man sudoоболочки, с которой запущено, sudo -sэто то, что указано в /etc/passwd, верно?
  2. Однако и в Ubuntu, и в Debian оболочка, указанная /etc/passwdдля root, — /bin/bash. В обеих системах я также не могу найти, где находится разница в файлах .profileили .bashrc, что касается $HOME, так что поведение отличается sudo -s. Есть ли помощь по этому вопросу?

решение1

Sudo имеет множество параметров конфигурации времени компиляции. Вы можете перечислить настройки в вашей версии с помощью sudo -V. Одно из различий между конфигурацией в Debian wheezy и в Ubuntu 12.04 заключается в том, что HOMEпеременная окружения сохраняется в Ubuntu, но не в Debian; оба дистрибутива стирают все переменные окружения, за исключением нескольких, которые явно помечены как безопасные для сохранения. Таким образом, sudo -sсохраняет HOMEв Ubuntu, тогда как в Debian HOMEстирается и sudoзатем устанавливает его в домашний каталог целевого пользователя.

Вы можете переопределить это поведение вsudoersфайл. Запустите visudo, чтобы отредактировать sudoersфайл. Есть несколько соответствующих опций:

  • env_keepопределяет, какие переменные среды сохраняются. Используйте Defaults env_keep += "HOME"для сохранения переменной среды вызывающего HOMEили Defaults env_keep -= "HOME"для ее стирания (и замены на домашний каталог целевого пользователя).
  • env_resetопределяет, сбрасываются ли переменные среды вообще. Сброс переменных среды часто необходим для правил, которые разрешают запуск определенной команды, но не имеет прямого преимущества безопасности для правил, которые в любом случае разрешают запуск произвольных команд.
  • always_set_home, если установлено, приводит HOMEк переопределению, даже если оно было сохранено из-за того, env_resetчто было отключено или HOMEнаходилось в env_keepсписке. Эта опция не имеет эффекта, если HOMEона не сохраняется в любом случае.
  • set_homeпохож на always_set_home, но применяется только к sudo -s, а не при вызове sudoс явной командой.

Эти параметры можно задать для определенного исходного пользователя, определенного целевого пользователя или определенной команды; sudoersподробности см. в руководстве.

Вы всегда можете переопределить HOMEопределенный вызов, sudoпередав параметр -H.

Оболочка никогда не переопределит значение HOME. (Оно бы установилось, HOMEесли бы оно было не установлено, но sudoвсегда устанавливает HOMEтем или иным способом.)

Если вы запустите sudo -i, sudoимитирует начальный вход в систему. Это включает установку HOMEв домашний каталог целевого пользователя и вызовоболочка входа.

решение2

Используйте sudo -H -iвместо , sudo -sчтобы получить интерактивную оболочку входа root:

sudo -H -i
cd
pwd -P  #  /private/var/root  (on Mac OS X 10.6.8)

От man sudo:

-H      The -H (HOME) option sets the HOME environment variable to
        the homedir of the target user (root by default) as
        specified in passwd(5).  By default, sudo does not modify
        HOME (see set_home and always_set_home in sudoers(5)).

решение3

Это мало связано с поведением sudoи больше связано с разницей между "оболочкой входа" и "оболочкой не входа". Быстрое решение -

$ sudo -i

как можно увидеть с помощью:

$ sudo -s
# id
uid=0(root) gid=0(root) groups=0(root)
# echo $HOME
/home/msw
# exit
$ sudo -i
# echo $HOME
/root
# pwd
/root

Как отмечено в руководстве по sudo:

Параметр -i (симулировать начальный вход в систему) запускает оболочку, указанную в записи базы данных паролей целевого пользователя, как оболочку входа в систему. Это означает, что файлы ресурсов, специфичные для входа в систему, такие как .profile или .login, будут прочитаны оболочкой. Если указана команда, она передается оболочке для выполнения через параметр оболочки -c. Если команда не указана, выполняется интерактивная оболочка.

решение4

Чтобы избавиться от разного поведения sudo -sв Ubuntu и Debian соответственно, можно использовать sudoоболочку (ответ на вопрос 4):

sudos() {
   local PATH="$(getconf PATH)" root_homedir
   root_homedir="$(sudo -H sh -c 'printf "%s" "$HOME"')"
   sudo sh -c 'export HOME="$0"; exec sh -i' "$root_homedir"
   return 0
}

sudo -k
sudos
{
logname
whoami
id -un
id -ur
echo "PATH: $PATH"
}
exit
echo "PATH: $PATH"

Связанный контент