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

60

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

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

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

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

Почему существует это несоответствие?

    
задан Aditya 19.10.2013 в 20:02
источник

6 ответов

47

Завершение работы на колесико проверяет, разрешено ли вы завершить работу машины. Это делается через 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-Privileges, которые вызывают для вас команду shutdown.

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

    
ответ дан chaos 19.10.2013 в 20:46
источник
27

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

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

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

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

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

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

    
ответ дан Paul Hänsch 19.10.2013 в 21:29
14

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

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

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

ответ дан Manishearth 20.10.2013 в 02:43
14
  

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

Только если вы вошли только в систему. Если есть другие пользователи (включая пользователей консоли), вам может потребоваться ввести пароль root. Это то же самое в ОС 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 не проверяет, зарегистрирован ли кто-либо? Честно говоря, это нечестная функция. Я могу себе представить, что это может сэкономить время, но постоянная консоль часто предпочтительнее. Я не хочу, чтобы команды иногда запрашивали пароль после запуска, а иногда и нет.

    
ответ дан Tim 07.02.2016 в 02:58
9

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

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

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

    
ответ дан Mark Bessey 19.10.2013 в 21:35
5

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

Кроме того, команды Halt и PowerOff тоже.

    
ответ дан Jeff Sereno 07.02.2016 в 02:38