Почему мы должны быть root в терминале для выключения и перезапуска?

Когда мы устанавливаем / удаляем / обновляем пакеты или вносим какие-либо изменения, которые требуют административных привилегий, нам предлагается ввести пароль администратора, который имеет привилегии sudo - это происходит как через графический интерфейс, так и через терминал.

prompt via gui

Однако, если мы пытаемся выключиться и перезапустить через терминал, он жалуется, что мы должны быть root:

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

Но мы никогда не запрашивал пароль, когда мы выполняем эти действия с помощью зубчатого колеса в правом верхнем углу.

cog-wheel menu

Почему это расхождение?

65
задан 16.04.2020, 22:55

6 ответов

Выключение зубчатого колеса проверяет, разрешено ли отключение машины. Это делается с помощью PolicyKit. В случае отключения этот оператор в файле /usr/share/polkit-1/actions/org.freedesktop.consolekit.policy проверяется:

<action id="org.freedesktop.consolekit.system.stop">
  <description>Stop the system</description>
  <message>System policy prevents stopping the system</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>yes</allow_active>
  </defaults>
</action>

PolicyKit запускает команду dbus-send. В случае выключения это будет:

dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown

В фоновом режиме работает демон с привилегиями root, который вызывает для вас команду выключения.

Если вы хотите отключить машину «по-старому» через командную строку (shutdown, reboot, halt, ...), то вам нужно добавить бит suid к этим командам. Но имейте в виду, что каждый в вашей системе, имеющий доступ к оболочке, может отключить вашу машину.

50
ответ дан 16.04.2020, 22:55
  • 1
    Немного более безопасная опция состояла бы в том, чтобы позволить sudoers passwordless завершение работы и т.д. That' s легко выполненный: войдите sudo visudo, добавьте %sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/reboot, сохраните и выйдите. Таким образом, перезагрузка командной строки все еще потребует sudo reboot, но Вы won' t должны ввести Ваш пароль. – Chris Charabaruk 16.04.2020, 22:56

Поскольку Linux обычно используется как сервер или аналогичный, и SSHing в Linux-коробку, даже обычный ноутбук с Ubuntu, довольно распространен.

Дело в том, что вы, возможно, не захотите, чтобы люди с доступом по SSH могли отключить его, особенно когда могут использоваться другие удаленно зарегистрированные пользователи, использующие его. Кто-то с доступом к графическому интерфейсу & mdash; ну, в любом случае, он может отключить его самостоятельно с помощью кнопки физического питания.

Кроме того, удаленно вошедший в систему пользователь не сможет включить его снова.

14
ответ дан 16.04.2020, 22:56
  • 1
    Да. Это потребовало бы полномочиям пользователя root быть в состоянии установить пакеты и настроить по мере необходимости. Но этот сценарий появился по моему мнению при чтении ответа вчера, и я думал, что совместно использую его с Вами:-), – will 16.04.2020, 22:56
  • 2
    Это didn' t происходят со мной то время, когда я задал этот вопрос, но я предполагаю их, опции в Ubuntu, чтобы установить пакеты GUI в удаленном сервере и использовать удаленный сервер по GUI вместо командной строки. (Подобный, к как Windows Remote Desktop или работы Teamviewer). Таким образом, это делало бы недействительным предположение, что кто-то использующий Ubuntu по GUI может завершить работу с кнопкой физической силы. – Radderz 16.04.2020, 22:57
  • 3
    @aditya, которому нужен сервер, настроенный таким образом, который администратор должен решить сделать – Oliver Gondža 16.04.2020, 22:57

В многопользовательской системе последнее, что вам нужно, - это чтобы ваши пользователи входили в систему и могли произвольно перезагружать сервер в любое время, поэтому версия Reboot для командной строки является командой только для суперпользователя, поэтому вам необходимо быть корнем или иметь права sudo.

Также примените команды Halt и PowerOff.

5
ответ дан 16.04.2020, 22:57
  • 1
    Компоненты, такие как systemctl, loginctl, systemd, системные политики, и т.д. все позволяют, в настоящее время входил в систему пользователь для доступа к определенным корневым функциям, явно не требуя, чтобы корневой доступ сделал возможность рабочего стола более удобной для пользователя, но эти don' t обязательно называют команды командной строки для выполнения тех задач. – Usman Yaqoob 16.04.2020, 22:57
  • 2
    Спасибо за Ваш ответ я действительно понимаю что я как пользователь машины, используемой десятками shouldn' t быть в состоянии перезагрузить машину, но что делает Ubuntu (или в значительной степени все настольные дистрибутивы) делают, когда я принял решение перезагрузить через мышь вместо клавиатуры? Они позволяют это без priveliges. – user207421 16.04.2020, 22:58

Причина, по которой вам не нужно быть пользователем root, чтобы инициировать завершение работы с графическим интерфейсом, во многом является удобной для обычного пользователя настольного компьютера. Система знает , что вы - пользователь, вошедший в систему на консоли, поэтому, если вы выключите компьютер по ошибке, вы, вероятно, сможете снова включить его.

Для пользователя в оболочке вы можете войти в систему удаленно, поэтому система требует, чтобы вы вошли в систему как пользователь root, чтобы выдать команду завершения работы. Это не позволяет обычному пользователю, вошедшему в систему на сервере, выключать его, пока другие люди его используют, и хотя не обязательно, чтобы кто-то физически там запускал компьютер для резервного копирования.

Причина, по которой завершение работы не предоставляет приглашение с графическим интерфейсом для пароля суперпользователя, заключается, вероятно, просто в том, что там нет реальной утилиты, которую можно получить - если вы находитесь на консоли, где появится приглашение, вы можете просто меню зубчатого колеса вместо. Если вы хотите, чтобы в командной строке запрашивался пароль суперпользователя для выключения, он уже доступен с «sudo shutdown».

9
ответ дан 16.04.2020, 22:57

Когда я перезагружаюсь через графический интерфейс, я могу сделать это без моего пароля sudo.

Только если вы единственный, кто вошел в систему. Если есть другие пользователи (включая пользователей консоли), вам может потребоваться ввести пароль root. Это то же самое на OS X и более новых версиях Windows.

Почему это так? Что там происходит внутри системы Ubuntu?

Следующая команда:

/usr/bin/dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop

D-Bus - это механизм IPC - среда для локальной связи между процессами. работает на том же хосте.

D-Bus «умнее», чем низкоуровневые протоколы передачи сообщений, такие как UDP. С другой стороны, он несет сообщения как отдельные элементы, а не как непрерывные потоки данных.

D-Bus имеет структурированное представление данных, которые она переносит, и имеет дело с данными в двоичной форме; целые числа различной ширины, строки и так далее. Поскольку данные не являются просто «необработанными байтами» для D-Bus, сообщения могут быть проверены.

- Свободный рабочий стол

Почему команда shutdown просто не проверяет, вошел ли кто-нибудь в систему? Честно говоря, эта черта кажется наемницей. Я могу себе представить, что это иногда экономит время, но часто предпочитают последовательную консоль. Я не хочу, чтобы команды иногда запрашивали пароль после запуска, а иногда нет.

14
ответ дан 16.04.2020, 22:57
  • 1
    @kos ohh. Hu держится. – Sheo 16.04.2020, 22:58
  • 2
    There' s также более короткая версия через qdbus приложение – Chris Charabaruk 16.04.2020, 22:58
  • 3
    При закрытии / регистрирующийся из DE (GNOME в этом случае) I' m не попросивший корня / user' пароль s sudo ни с другим пользователем, зарегистрированным на пути GDM, ни с другим пользователем, зарегистрированным на пути tty. – Hightower 16.04.2020, 22:59
  • 4
    @kos hu, that' s странный. Тот снимок экрана имеет Gnome 3 и I' m вошел в систему на gui и tty – M.C. 16.04.2020, 22:59
  • 5
    Я подразумеваю, что получаю то же сообщение, но нажимающий " Питание off" просто идет вперед и закрывает систему. Я также попросил, чтобы Fabby протестировал это, и он делает то же для него также, не уверенный что that' s о. – CodeToLife 16.04.2020, 23:00

Ubuntu - это дистрибутив операционной системы GNU / Linux, которая, в свою очередь, принадлежит к семейству систем Unix - общей архитектуры для ряда современных операционных систем.

Традиционно Unix используется для работы на мэйнфреймах. Центральные вычислительные средства, которые обслуживают десятки или сотни пользователей через удаленные терминалы. Поскольку все пользователи полагались на доступность мэйнфрейма, ни одному из пользователей не разрешалось выдавать команду отключения. Идея, которая является фундаментальной для архитектуры Unix - ядро ​​системы никогда не инициализирует выключение, если соответствующая функция не вызывается процессом суперпользователя.

В современных настольных системах разработчики приложили определенные усилия, чтобы сделать отключение доступным для простого пользователя настольного компьютера. Обычный метод - позволить менеджеру входа в систему, который обычно работает в контексте безопасности пользователя root, обрабатывать завершение работы и перезагрузку. В этом случае графическая оболочка выдает диспетчеру входа запрос на выключение компьютера. Это предполагает использование межпроцессного взаимодействия (IPC), как правило, через службу dbus.

Вышеупомянутый policykit расширяет этот процесс, предоставляя стандартизированную структуру, посредством которой менеджер входа в систему (или какая-либо программа, предоставляющая сервис выключения) может проверять, каким пользователям разрешено вызывать выключение, и через которого администратор может настроить эти разрешения соответственно. .

В некоторых средах настольных компьютеров не используются службы на основе IPC, а скорее набор вспомогательных программ для обеспечения тех же или аналогичных функций. Эти вспомогательные программы будут вызываться с помощью механизмов, позволяющих перейти в контекст суперпользователя, например, sudo, suid или механизм политикита, похожий на sudo.

В любом случае, глупая традиционная программа завершения работы оболочки не работает таким образом, она требует, чтобы вы видели, что она запускается в контексте суперпользователя.

27
ответ дан 16.04.2020, 22:58

Теги

Похожие вопросы