web-dev-qa-db-ja.com

シャットダウンして再起動するためにターミナルでrootになる必要があるのはなぜですか?

パッケージのインストール/削除/更新、または管理者権限を必要とする変更を行うと、Sudo権限を持つ管理者ユーザーのパスワードの入力を求められます。これはGUIとターミナルの両方で発生します。

Prompt via gui

ただし、ターミナル経由でシャットダウンして再起動しようとすると、rootである必要があると文句を言います。

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

しかし、右上の歯車を介してこれらのアクションを実行するとき、パスワードを要求されることはありません。

cog-wheel menu

なぜこの矛盾があるのですか?

64
Aditya

歯車のシャットダウンは、マシンのシャットダウンが許可されているかどうかを確認します。これは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

シャットダウンコマンドを呼び出すルート権限でバックグラウンドで実行されているデーモンがあります。

コマンドライン(shutdown, reboot, halt, ...)を介してマシンを「古い方法で」シャットダウンできるようにしたい場合は、それらのコマンドにsuid-Bitを追加する必要があります。ただし、シェルにアクセスできるシステム上の全員がマシンをシャットダウンする可能性があることに注意してください。

50
chaos

UbuntuはGNU/Linux Operationg Systemのディストリビューションで、Unixシステムファミリに属します。これは、多くの最新のオペレーティングシステムに共通のアーキテクチャです。

伝統的に、Unixはメインフレームコンピューターで実行されていました。リモート端末を介して数十または数百のユーザーにサービスを提供する中央コンピューティング施設。すべてのユーザーがメインフレームの可用性に依存しているため、1人のユーザーがシャットダウンコマンドを発行することは許可されていません。 Unixアーキテクチャの基本である考え方-システムカーネルは、対応する関数がスーパーユーザープロセスによって呼び出されない限り、シャットダウンを初期化しません。

現代のデスクトップシステムでは、開発者はシャットダウンを単なるデスクトップユーザーが利用できるようにするための苦労を重ねてきました。一般的な手法は、通常rootユーザーのセキュリティコンテキストで実行されるログインマネージャーにシャットダウンと再起動を処理させることです。この場合、グラフィカルシェルはログインマネージャーにリクエストを発行してコンピューターをシャットダウンします。これには、通常はdbusサービスを介したプロセス間通信(IPC)の使用が含まれます。

上記のポリシーキットは、ログインマネージャー(またはシャットダウンサービスを提供するプログラム)がシャットダウンを許可するユーザーを確認できる標準化されたフレームワークを提供し、管理者がこれらのアクセス許可をそれぞれ構成できるようにすることで、このプロセスを拡張します。

一部のデスクトップ環境では、IPCベースのサービスを使用せず、ヘルパープログラムのセットを使用して、同じまたは同様の機能を提供します。これらのヘルパープログラムは、Sudo、suid、またはSudoに似たポリシーキットメカニズムなどのスーパーユーザーコンテキストに変更できるメカニズムを通じて呼び出されます。

いずれにせよ、シェル上の従来のシャットダウンプログラムはこのように機能しません。スーパーユーザーコンテキストで実行されていることを確認する必要があります。

27
Paul Hänsch

GUIを使用して再起動すると、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
Tim

Linuxは一般的にサーバーなどとして使用され、LinuxボックスへのSSH接続は、通常のUbuntuラップトップでも非常に一般的です。

特に、リモートでログインしている他のユーザーがSSHを使用している場合は、SSHアクセスを持つユーザーがシャットダウンできないようにする必要があります。 GUIにアクセスできる人—まあ、物理的な電源ボタンを使って自分でGUIをシャットダウンできます。

また、リモートでログインしたユーザーは、再度有効にすることはできません。

14
Manishearth

GUIからシャットダウンを開始するためにrootである必要がない理由は、主に一般的なデスクトップユーザーの利便性の問題です。システム認識コンソールにログインしているユーザーであるため、誤ってコンピューターをシャットダウンした場合、おそらくコンピューターの電源を入れることができます。

シェル内のユーザーの場合、リモートでログインしている可能性が非常に高いため、シャットダウンコマンドを発行するには、rootとしてログインする必要があります。これにより、通常のユーザーがサーバーにログインし、他の人がサーバーを使用しているときにサーバーをシャットダウンすることを防ぎます。

シャットダウンがスーパーユーザーパスワードのGUIプロンプトを提供しない理由は、おそらくそこに得られる実際のユーティリティがないからです-プロンプトが表示されるコンソールにいる場合は、単にcog-代わりにホイールメニュー。シャットダウン用のスーパーユーザーパスワードのコマンドラインプロンプトが必要な場合は、「Sudoシャットダウン」で既に利用可能です。

9
Mark Bessey

マルチユーザーシステムでは、最後に必要なのはユーザーがログインし、いつでもサーバーをランダムに再起動できることです。したがって、Rebootのコマンドラインバージョンはスーパーユーザーのみのコマンドであるため、rootまたは須藤の権利を持っています。

HaltおよびPowerOffコマンドも同様です。

5
Jeff Sereno