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


39

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

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

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

Q1. Как это сделать? Где конфиг?

Q2. Как мне это отключить?

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

Q3. В Debian sudo -sизменяет переменную $ HOME на /root. Из того, что я получаю от ответов и man sudoоболочка заливались sudo -sэто один дан в /etc/passwd, верно?

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


Вы ответили части вашего вопроса в комментарии на мой ответ, но я думал , что я бы поставил ссылку unix.stackexchange.com/questions/38175/... здесь. Я думаю, что в Q3 вы утверждаете , что некоторые люди настраивают свой профиль и rc-файлы на одинаковые действия независимо от того, находятся ли они в оболочке входа или нет. Я думаю, что это невероятно маловероятно, что sudoведет себя по-разному между Debian и Ubuntu.
MSS

@msw Что касается различий между Debian и Ubuntu (12.04) sudo, я думаю, что разница действительно есть по умолчанию. Тем не менее, я не ставлю на это, так как я нахожусь на коробке, которая была настроена кем-то другим и работает уже довольно давно. В любом случае, для всех, кто заинтересовался, я нашел security.stackexchange.com/questions/18369/… и bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140 .
alxs

Ответы:


51

У 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в домашний каталог целевого пользователя и вызов оболочки входа .


17

Используйте 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)).

-iподразумевает -H.
x-yuri

5

Это имеет мало общего с поведением 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 оболочки. Если команда не указана, выполняется интерактивная оболочка.


Спасибо за дополнительные детали, они разъяснили мне кое-что еще. Думаю, мне нужно проверить разницу между снарядами. Для тех, кто читает это, в той же ситуации со мной, проверьте это: unix.stackexchange.com/questions/38175/…
alxs

1
Нет, независимо от того, изменяется sudo HOMEили нет, все зависит от того, как настроен sudo.
Жиль "ТАК - перестань быть злым"

@Gilles: Итак, как настроено sudo? В том /etc/sudoers, что касается Debian и Ubuntu, нет ничего особенного в том, что касается $ HOME.
alxs

1
@alxs IIRC Debian и Ubuntu имеют разные значения по умолчанию во время компиляции. Вы можете переопределить их с параметрами always_set_homeи set_homeв sudoers.
Жиль "ТАК - перестань быть злым"

@ Жиль: Спасибо. Это именно тот ответ, который я ищу, и о том, почему это происходит, и о том, как это исправить. Если вы не против опубликовать это, я приму это как ответ. Я мог бы сделать это сам, но я не хочу брать кредит на это.
alxs

2

Довольно популярный способ получения root shell также использует:

 $ sudo su - 
 # id
 uid=0(root) gid=0(root) groups=0(root)
 # pwd
 /root

Я использую для использования sudo -i -H, но не удалось установить глобальный пакет npm от git. С sudo su -этим работает! Спасибо.
Лоран

0

Чтобы избавиться от разного поведения sudo -sUbuntu и 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"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.