
В Ubuntu 12.04, когда sudo -s
переменная $HOME не изменяется, то, если мой обычный пользователь — regularuser
, ситуация выглядит следующим образом:
$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser
Я давно отказался от Ubuntu, поэтому не могу быть уверен, но думаю, что это поведение по умолчанию. Итак, мои вопросы:
- Как это делается? Где конфиг?
- Как это отключить?
Редактировать: Спасибо за ответы, которые немного прояснили ситуацию, но, думаю, мне следует добавить пару вопросов, чтобы получить ответ, который я ищу.
- В Debian
sudo -s
меняет переменную $HOME на/root
. Из того, что я получаю из ответов иman sudo
оболочки, с которой запущено,sudo -s
это то, что указано в/etc/passwd
, верно? - Однако и в 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"