Le meilleur moyen de supprimer la commande d'arrêt, mais de continuer à redémarrer

27

J'ai un appareil de type Raspi dans un centre de données et j'ai récemment accidentellement touché du doigt et collé une commande d'arrêt dans le mauvais terminal sur mon écran. Existe-t-il un moyen de conserver shutdown -rmais de supprimer des #poweroff #shutdown -P -Hoptions?

Je veux garder le shutdown -r commandement. J'aime mettre une minuterie dessus si je réussis à geler le système, ou à me verrouiller avec les règles de la table ip. Exempleshutdown -r +10

foxtrot22
la source

Réponses:

39

Vous devez utiliser une distribution Linux basée sur systemd. Dans ce cas, vous devriez pouvoir masquer la cible de mise hors tension, de sorte que systemd refuse de l'exécuter (et s'éteigne). par exemple:

systemctl mask poweroff.target

Cela rend tout à fait impossible d'arrêter le système, sauf par redémarrage. Voyez que rien ne se passe:

Démo animée Debian9

Dans ce cas, l'interrupteur d'alimentation virtuel de cette machine virtuelle ne fonctionne même plus pour arrêter le système. Mais il redémarre toujours parfaitement bien.

Pour annuler le changement, bien sûr, il suffit de démasquer la cible. Ensuite, vous pouvez arrêter le système.

systemctl unmask poweroff.target
Michael Hampton
la source
2
Existe-t-il une commande systemd qui répertorie tous les services / cibles / périphériques avec leur description (si disponible)? J'ai récemment commencé à lire à ce sujet et j'aimerais explorer les possibilités.
hjpotter92
1
@ hjpotter92 Exécuté systemctlsans arguments. Il répertorie toutes les unités actives, leur statut et leurs descriptions. Ajoutez --allet il listera également les unités qui ne sont pas actives.
Michael Hampton
2
@ hjpotter92 Jetez un oeil à man systemd.special.
TooTea
16

Il existe plusieurs moyens d'y parvenir. L'un travaillerait avec un compte régulier non privilégié qui nécessitera l'exécution de la commande avec sudo et la saisie d'un mot de passe. Ensuite, vous pouvez ajouter le suivi à / etc / sudoers (en exécutant visudo):

## user is allowed to execute reboot -r only
jdoe ALL=NOPASSWD: /sbin/shutdown -r *

De plus, pour désactiver la mise en cache des informations d'identification sudo, ajoutez également les éléments suivants:

Defaults timestamp_timeout=0

Cela empêchera la mise en cache des informations d'identification au cas où vous auriez invoqué une commande avec sudo auparavant.

Exemple:

[root@ops ~]# su - jdoe
[jdoe@ops ~]$ sudo shutdown -c
[sudo] password for jdoe:
[jdoe@ops ~]$ sudo shutdown -r +10
Shutdown scheduled for Mon 2018-09-03 18:51:13 IDT, use 'shutdown -c' to cancel.
[jdoe@ops ~]$ sudo shutdown -H
[sudo] password for jdoe:
^[[A[jdoe@ops ~]$ sudo shutdown -c
[sudo] password for jdoe:

Remarquez que dans l'exemple ci-dessus, je n'étais pas obligé d'entrer mon mot de passe lors de l'exécution sudo shutdown -r +10, mais pour le reste, j'étais. Si vous souhaitez supprimer la nécessité de taper sudo avant la commande ( sudo shutdown -r +10), ajoutez ce qui suit à votre .bash_profile ou .bashrc:

alias shutdown="sudo shutdown"

Exemple:

[jdoe@ops ~]$ source ~/.bash_profile
[jdoe@ops ~]$ shutdown -r +10
Shutdown scheduled for Mon 2018-09-03 19:03:14 IDT, use 'shutdown -c' to cancel.
[jdoe@ops ~]$ shutdown -c
[sudo] password for jdoe:

Notez qu'il est recommandé de travailler avec un compte non privilégié et de remonter avec sudo si nécessaire.

John Doe
la source
1
C'est très bien, sauf que sudola configuration par défaut de lui aura des informations d'identification de cache pendant un certain temps après la première invocation. Cela peut être pratique lorsque l'exécution répétée de commandes rootest requise dans une session utilisateur. Dans une telle session, (ou en effet, si un rootshell est en cours d'exécution), il serait tout à fait possible de traiter la commande shutdownet de contourner les vérifications.
Cosmic Ossifrage le
Merci pour la contribution. Cependant, dans ce cas, nous configurons shutdown -rpour ne pas demander de mot de passe lors de l'exécution avec sudo, par conséquent, s'il exécute sudo shutdown -r ...les informations d'identification ne seront pas mises en cache car elles ne seront pas entrées. Regardez l'exemple que j'ai donné ci-dessus, vous pouvez voir que je l'ai exécuté suivi d'un sudo shutdown -Het on m'a demandé un mot de passe.
John Doe
3
En effet, c'est compris. Mais, considérez le scénario dans lequel la dernière commande a été préfixée sudoet n'était pas une NOPASSWDopération; par exemple un appel pour éditer un fichier de configuration en tant que root. Dans ce cas, le mot de passe sera mis en cache et un appel ultérieur à sudo shutdown -Hpasserait. sudoLa mise en cache du mot de passe devrait être désactivée pour éviter cela.
Cosmic Ossifrage
2
Dans ce cas, vous avez raison, +1 pour désactiver la mise en cache des mots de passe. Modifié mon commentaire avec la suggestion. Merci!
John Doe
2
En fait, je n'aime pas du tout cela, précisément parce qu'il repose sur la présence de l'invite de mot de passe sudo pour rappeler soi-disant à l'utilisateur de ne pas faire ce qu'il n'est pas censé faire. Mais l'invite de mot de passe ne sert vraiment pas cet objectif. Il est si souvent demandé par sudocela que nous tapons simplement le mot de passe et continuons. Voir ici pour une approche alternative utilisant sudo (c'est probablement beaucoup mieux malgré le fait qu'il ne soit pas très bon).
Michael Hampton
10

Il existe un outil appelé molly-guard qui vous oblige à indiquer le nom d'hôte de la machine que vous souhaitez arrêter ou redémarrer.

Dans le cas où vous n'utilisez pas Debian, il devrait être trivial de le compiler depuis la source, étant donné que le programme est plutôt primitif.

Simon Richter
la source
9

Pour éviter les incidents, les distributions basées sur RHEL ont déjà configuré des alias rm, cpet mvqui peuvent être un peu plus destructeurs lorsqu'ils sont effectués par l'utilisateur root.

Vous pouvez ajouter le vôtre, par exemple:

#/root/.bashrc
alias poweroff='echo  "poweroff: Command disabled - THINK before you type.
  Use /usr/sbin/poweroff if you really want to drive to the DC to restore power."'
HBruijn
la source
2
Comment cela conserve-t-il la shutdown -rdésactivation shutdown -P -H?
MSalters
3

Renommez l'exécutable d'arrêt en quelque chose d'impossible à invoquer accidentellement.

Puis alias shutdownpour être(whatever) -r

Wes Groleau
la source
1
Pourriez-vous expliquer comment renommer l'exécutable? Pourrait-il interrompre les mises à niveau des packages à l'avenir?
AL
2
@AL Pourrait-il interrompre les mises à niveau des packages à l'avenir? Oui, c'est possible. Cela pourrait également casser des choses déjà installées. En général, jouer avec des parties de l'installation du système d'exploitation est une très mauvaise idée.
Andrew Henle
1
Se mettre d'accord. Il suffit d'alias shutdownpour /sbin/shutdown -r. Le changement de nom n'est pas nécessaire; comme l'expansion d'alias fait référence à un chemin absolu, elle n'est pas soumise à une expansion d'alias récursive.
MSalters
Une mise en garde - je pense que «rien n'est impossible» - peu probable
JosephDoggie