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


65

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

GUI経由のプロンプト

ただし、ターミナルを介してシャットダウンして再起動しようとすると、次の操作を実行する必要があるというエラーが表示されますroot

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

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

歯車メニュー

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


5
良い質問..あなたは私が同じことを尋ねようとしていたことを知っています。私のシナリオは、ショートカットキーでUbuntuをシャットダウンすることでした。つまり、ctrl + super + sのような割り当てられたキーを押すと、コマンドsudo shutdown -h nowが実行されますが、アクセス許可がないと機能しないという問題がありshutdownました。 ..私の状況を理解してください.. :)
Saurav Kumar


回答:


50

歯車のシャットダウンは、マシンのシャットダウンが許可されているかどうかを確認します。これは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を追加する必要があります。ただし、シェルにアクセスできるシステム上の全員がマシンをシャットダウンする可能性があることに注意してください。


14
少し安全なオプションは、sudoersにパスワードなしのシャットダウンなどを許可することです。これは簡単に実行できます:enter sudo visudo、add %sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/reboot、save、exit。この方法では、コマンドラインでの再起動にはが必要sudo rebootですが、パスワードを入力する必要はありません。
セバスチャン・テュルシュミット

27

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

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

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

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

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

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


14

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

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

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


この質問をしたのはその時ではありませんでしたが、リモートサーバーにGUIパッケージをインストールし、コマンドラインの代わりにGUI経由でリモートサーバーを使用するオプションがUbuntuにあると思います。(WindowsリモートデスクトップまたはTeamviewerの動作に似ています)。したがって、GUIを介してUbuntuを使用している人が物理的な電源ボタンでシャットダウンできるという仮定は無効になります。
アディティア

そのように設定されたサーバーを必要とする@adityaは、管理者が決定する必要があります
-Manishearth

はい。パッケージをインストールし、必要に応じて構成するには、root権限が必要です。しかし、昨日あなたの答えを読んでいる間にこのシナリオが思い浮かび、私はあなたとそれを共有すると思った:-)
Aditya

14

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誰かがログインしているかどうかだけをチェックしないのですか?それは正直に言って非営利的な機能のようです。時間が節約できることは想像できますが、多くの場合、一貫したコンソールが好まれます。コマンドの実行後にパスワード必要になることもあれば、必要にならないこともあります。

私の代名詞は彼/彼です


qdbusアプリを通じて短いバージョンもあります
Sergiy Kolodyazhnyy

DE(この場合はGNOME)からシャットダウン/ログアウトするときsudoに、GDM経由でログインしている別のユーザーやtty経由でログインしている別のユーザーのどちらにもroot /ユーザーのパスワードを求められません。
コス

@kos hu、それは奇妙です。そのスクリーンショットは、GNOME 3のものであり、私はGUIとTTYにログインしているんだ
ティム・

同じメッセージが表示されますが、「電源を切る」をクリックするとシステムがシャットダウンします。また、Fabbyにこれをテストするように依頼しましたが、彼にも同じことが言えます。
コス

@kosああ。胡
ティム

9

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

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

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


5

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

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


2
あなたの答えをありがとう、私は数十人が使用するマシンのユーザーとしてマシンを再起動できないはずであることを理解していますが、Ubuntu(またはほとんどすべてのデスクトップディストリビューション)はマウス経由で再起動することを選択したときに何をしますかキーボードの代わりに?彼らは特権なしでそれを可能にします。
asco

3
systemctl、loginctl、systemd、システムポリシーなどのコンポーネントはすべて、現在ログインしているユーザーが明示的にルートアクセスを必要とせずに特定のルート機能にアクセスできるようにし、デスクトップエクスペリエンスをよりユーザーフレンドリーにしますが、これらは必ずしもコマンドラインを呼び出すわけではありませんこれらのタスクを実行するコマンド。
ジェフ・セレーノ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.