Pourquoi ne puis-je pas exécuter l'arrêt lorsque la permission est rwxr-xr-x?

Je suis dans /sbin et je vois que l' shutdown a les permissions rwxr-xr-x . Cela ne signifie-t-il pas que n'importe qui peut l'exécuter?

N'importe qui peut exécuter l' shutdown , mais le triggersment d'un arrêt du système nécessite des privilèges root. Mais shutdown n'est pas setuid, et donc seul root peut l'exécuter avec succès . Le programme d' shutdown est assez agréable pour vérifier vos privilèges et vous faire savoir s'il y a un problème, mais même si il a naïvement essayé un arrêt du système, rien ne se passerait.

GLENDOWER: Je peux appeler les esprits de l'immensité profonde.
HOTSPUR: Pourquoi, puis-je, ou peut-être tout homme; Mais viendront-ils quand vous les appelez?
(d'Henri IV)

shutdown n'est pas différent de /bin/rm . Tout le monde peut l'exécuter, mais un user régulier ne peut pas supprimer /etc , ou le directory de base d'un autre user.

Spécifiquement: Seul un process exécutant des privilèges root (UID effectif 0) peut ordonner au système init d'arrêter les services système, de terminer tous les process user et d'émettre l' appel système qui arrête réellement la machine. (Si shutdown était setuid, il fonctionnerait comme root, peu importe qui l'invoque, mais ce n'est pas le cas).

Qu'en est-il d'appeler shutdown depuis une interface graphique, par exemple avec control-alt-del? Il est important de réaliser que dans ce cas, shutdown est démarré directement par init et il s'exécute avec les privilèges root. Donc, tout le monde qui marche vers la console pourrait potentiellement l'éteindre. Si cela n'est pas souhaitable, control-alt-delete va exécuter shutdown -a . (Voir la documentation que @ some1 cité dans leur réponse). Cela indique l' shutdown pour vérifier si l'user actuellement connecté est autorisé à l'exécuter. Mais ceci n'est pertinent que parce que shutdown s'exécute en tant que root dans ce scénario.

L' shutdown binary lui-même vérifie si votre UID est 0.

Voir la sortie strace de:

 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) = ? 

Oui ! Tout le monde peut exécuter cette command. Comme vous l'avez dit, vous pouvez l'exécuter mais vous devez faire face à un message "Need to be root", pas une permission denied . La command shutdown vérifie votre UID pour voir si vous êtes root, ou non.

Il semble que shutdown vérifiera une list d'access si vous la marquez avec -a:

 ACCESS CONTROL shutdown can be called from init(8) when the magic keys CTRL-ALT-DEL are pressed, by creating an appropriate entry in /etc/inittab. This means that every‐ one who has physical access to the console keyboard can shut the system down. To prevent this, shutdown can check to see if an authorized user is logged in on one of the virtual consoles. If shutdown is called with the -a argument (add this to the invocation of shutdown in /etc/inittab), it checks to see if the file /etc/shutdown.allow is present. It then compares the login names in that file with the list of people that are logged in on a virtual console (from /var/run/utmp). Only if one of those authorized users or root is logged in, it will proceed. Otherwise it will write the message shutdown: no authorized users logged in to the (physical) system console. The format of /etc/shutdown.allow is one user name per line. Empty lines and comment lines (prefixed by a #) are allowed. Currently there is a limit of 32 users in this file. 

Puisque vous l'appelez actuellement sans l'option -a, il est autorisé uniquement à autoriser les arrêts root.

Si vous souhaitez que des users supplémentaires puissent exécuter la command, configurez ce file et utilisez le drapeau.

 Why can't I execute shutdown when the permission is rwxr-xr-x? 

Les bits de permission n'excluent pas nécessairement le contrôle d'access basé sur un user ou un groupe.