Як встановлюється 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.
msw

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

Відповіді:


51

Судо має багато варіантів конфігурації часу компіляції. Ви можете перелічити налаштування у своїй версії за допомогою 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щоб отримати інтерактивну кореневу оболонку входу:

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

Як зазначається в посібнику по судо:

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


Дякую за додаткові подробиці, вони трохи прояснили речі для мене. Здогадайтесь, я повинен перевірити різницю між оболонками. Для всіх, хто читає це, у тій же ситуації зі мною, перевірте це: unix.stackexchange.com/questions/38175/…
alxs

1
Ні, змінюється HOMEчи не судо, все стосується того, як налаштовано sudo.
Жил "ТАК - перестань бути злим"

@Gilles: Отже, як налаштовано sudo? У програмі /etc/sudoersDebian і Ubuntu немає нічого іншого, що стосується $ HOME.
alxs

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

@Gilles: Дякую Саме таку відповідь я шукаю, як про те, чому це відбувається, так і як повернути це. Якщо ви не проти опублікувати його, я прийму це як відповідь. Я міг би це зробити сам, але не хочу брати за це кредит.
alxs

2

Досить популярним способом отримання кореневої оболонки є також використання:

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

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

0

Щоб позбутися від різної поведінки sudo -sна Ubuntu та Debian відповідно, ви можете скористатися sudoобгорткою (відповідь на Q4):

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.