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

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

prompt via gui

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

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

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

cog-wheel menu

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

64
задан 19 October 2013 в 22:02

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, который вызывает за вас команду выключения.

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

50
ответ дан 19 October 2013 в 22:02

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

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

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

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

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

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

27
ответ дан 19 October 2013 в 22:02

Когда я перезагружаюсь через графический интерфейс, я могу делать это без моего пароля 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 - это не просто «необработанные байты», сообщения можно проверять.

- Free Desktop

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

Мои местоимения - Он / Его

14
ответ дан 19 October 2013 в 22:02

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

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

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

14
ответ дан 19 October 2013 в 22:02

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

То же самое с командами Halt и PowerOff.

5
ответ дан 19 October 2013 в 22:02

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

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

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

9
ответ дан 19 October 2013 в 22:02

Другие вопросы по тегам:

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