web-dev-qa-db-ja.com

権限がrwxr-xr-xのときにシャットダウンを実行できないのはなぜですか?

私は/sbinにいますが、shutdownにはrwxr-xr-xの権限があることがわかりました。これは誰でも実行できるということではないのですか?

34
Korgan Rivera

誰でもshutdownを実行できますが、システムのシャットダウンをトリガーするにはroot権限が必要です。ただし、shutdownはsetuidではないため、rootのみがを正常に実行できます実行します。 shutdownプログラムは、権限をチェックして問題があるかどうかを通知するのに十分なほど優れていますが、システムのシャットダウンを単純に試みたとしても、何も起こりません。

GLENDOWER:私は広大な深さから霊を呼ぶことができます。
HOTSPUR:なぜ、私も、あるいは誰もができるのです。しかし、あなたが彼らを呼ぶときに彼らは来るでしょうか?
(Henry IVから)

shutdown/bin/rmと同じです。誰でも実行できますが、通常のユーザーは/etc、または別のユーザーのホームディレクトリを削除できません。

具体的には、root権限(実効UID 0)で実行されているプロセスだけが init system にシステムサービスを停止し、すべてのユーザープロセスを終了し、実際に system call を発行するように指示できます。機械を停止します。 (shutdownがsetuidだった場合、誰が呼び出したとしてもrootとして実行されますが、そうではありません。)

GUIからshutdownを呼び出すことについてはどうでしょうか。 control-alt-del?その場合、shutdowninitによって直接開始され、root権限で実行されることを理解することが重要です。そのため、コンソールに近づくと全員がシャットダウンする可能性があります。これが望ましくない場合、control-alt-deleteは実際にはshutdown -aを実行します。 (@ some1が回答で引用したドキュメントを参照してください)。これは、現在ログインしているユーザーがその実行を許可されているかどうかを確認するようshutdownに指示しています。しかし、このシナリオではshutdownがrootとして実行されているため、これは関係があります。

76
alexis

バイナリshutdown自体が、UIDが0かどうかをチェックします。

次のstrace出力を参照してください。

strace /sbin/shutdown -r -h now
...
...
geteuid()                               = 10001
setuid(10001)                           = 0
getuid()                                = 10001
write(2, "shutdown: Need to be root\n", 26shutdown: Need to be root
) = 26
exit_group(1)                           = ?
15
chaos

はい !誰でもそのコマンドを実行できます。あなたが言ったように、それを実行することはできますが、permission deniedではなく「Need to root」メッセージが表示されます。 shutdownコマンドは、UIDをチェックして、rootであるかどうかを確認します。

5
Vinz