web-dev-qa-db-fra.com

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

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 -r mais supprimez #poweroff#shutdown -P -H options?

Je veux garder shutdown -r commande. 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. exemple shutdown -r +10

27
foxtrot22

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:

Debian9 animated demo

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
40
Michael Hampton

Il existe plusieurs moyens d'y parvenir. On travaillerait avec un compte non privilégié régulier 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 de 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.

16
John Doe

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.

10
Simon Richter

Pour éviter les incidents, les distributions basées sur RHEL ont déjà configuré des alias pour rm, cp et mv qui 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."'
9
HBruijn

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

Alors alias shutdown pour être (whatever) -r

3
Wes Groleau