Il modo migliore per rimuovere il comando di spegnimento, ma continua a riavviare


27

Ho un dispositivo di tipo raspi in un data center e recentemente ho accidentalmente toccato e incollato un comando di spegnimento nel terminale sbagliato sul mio schermo. C'è un modo per mantenere shutdown -rma rimuovere le #poweroff #shutdown -P -Hopzioni?

Voglio mantenere il shutdown -r comando. Mi piace mettere un timer se riesco a bloccare il sistema o a bloccarmi con le regole della tabella ip. esempioshutdown -r +10

Risposte:


39

Dovresti usare una distribuzione Linux basata su systemd. In questo caso, dovresti essere in grado di mascherare il bersaglio di spegnimento, in modo che systemd si rifiuti di eseguirlo (e spegnerlo). per esempio:

systemctl mask poweroff.target

Ciò rende assolutamente impossibile arrestare il sistema, a parte il riavvio. Vedi che non succede nulla:

Demo animata Debian9

In questo caso, l'interruttore di alimentazione virtuale di questa VM non funziona nemmeno più per arrestare il sistema. Ma si riavvia ancora perfettamente bene.

Per annullare il cambiamento, ovviamente, basta smascherare il bersaglio. Quindi è possibile arrestare il sistema.

systemctl unmask poweroff.target

2
Esiste un comando systemd che elenca tutti i servizi / target / dispositivi con la loro descrizione (se disponibile)? Di recente ho iniziato a leggere su questo e mi piacerebbe esplorare le possibilità.
hjpotter92,

1
@ hjpotter92 Esegui systemctlsenza argomenti. Elencherà tutte le unità attive, il loro stato e le descrizioni. Aggiungi --alle elencherà anche le unità che non sono attive.
Michael Hampton

2
@ hjpotter92 Dai un'occhiata man systemd.special.
TooTea

16

Ci sono alcuni modi per raggiungere questo obiettivo. Si lavorerebbe con un normale account non privilegiato che richiederà l'esecuzione del comando con sudo e l'inserimento di una password. Quindi puoi aggiungere il seguente a / etc / sudoers (eseguendo visudo):

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

Inoltre, per disabilitare la memorizzazione nella cache delle credenziali sudo, aggiungere anche quanto segue:

Defaults timestamp_timeout=0

Ciò impedirà la memorizzazione nella cache delle credenziali nel caso in cui sia stato precedentemente richiamato un comando con sudo.

Esempio:

[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:

Nota come nell'esempio sopra non mi è stato richiesto di inserire la mia password durante l'esecuzione sudo shutdown -r +10, ma per il resto lo ero. Se si desidera rimuovere la necessità di digitare sudo prima del comando ( sudo shutdown -r +10), aggiungere quanto segue al proprio .bash_profile o .bashrc:

alias shutdown="sudo shutdown"

Esempio:

[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:

Si noti che è consigliabile lavorare con un account senza privilegi e intensificare con sudo quando richiesto.


1
Questo è fantastico, ad eccezione sudodella configurazione predefinita che avrà le credenziali della cache per qualche tempo dopo la prima chiamata. Ciò può essere utile quando l'esecuzione ripetuta di comandi rootè richiesta in una sessione utente. In una sessione del genere (o, in effetti, se una rootshell è in esecuzione), sarebbe del tutto possibile eseguire il comando shutdowne bypassare i controlli.
Cosmic Ossifrage,

Grazie per l'input. Tuttavia, in questo caso, stiamo configurando shutdown -rdi non richiedere la password durante l'esecuzione con sudo, quindi, se esegue, sudo shutdown -r ...le credenziali non verranno memorizzate nella cache poiché non verranno immesse. Guarda l'esempio che ho dato sopra, puoi vedere che l'ho eseguito seguito da un sudo shutdown -He mi è stata richiesta la password.
John Doe,

3
Anzi, questo è capito. Tuttavia, considera lo scenario in cui è stato anteposto l'ultimo comando sudoe non era NOPASSWDun'operazione; ad es. una chiamata per modificare un file di configurazione come root. In questo caso, la password verrà memorizzata nella cache e passerà una chiamata successiva a sudo shutdown -H. sudoLa cache della password dovrebbe essere disabilitata per evitarlo.
Cosmic Ossifrage,

2
In questo caso hai ragione, +1 per disabilitare la memorizzazione della password. Modificato il mio commento con il suggerimento. Grazie!
John Doe,

2
In realtà non mi piace affatto, proprio perché si basa sulla presenza della richiesta di password sudo per ricordare all'utente di non fare tutto ciò che non dovrebbe fare. Ma la richiesta della password non serve davvero a questo scopo. È così comunemente richiesto da sudodigitare semplicemente la password e andare avanti. Vedi qui per un approccio alternativo usando sudo (che probabilmente è molto meglio nonostante non sia molto buono).
Michael Hampton

10

Esiste uno strumento chiamato molly-guard che richiede di indicare il nome host della macchina che si desidera arrestare o riavviare.

Nel caso in cui non si stia usando Debian, dovrebbe essere banale compilarlo dal sorgente, dato che il programma è piuttosto primitivo.


9

Per evitare distribuzioni basate contrattempi RHEL già impostati alias rm, cpe mvche può essere un po 'più distruttivo quando eseguita dall'utente root.

Puoi aggiungere il tuo, ad esempio:

#/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."'

2
In che modo ciò mantiene shutdown -rdisabilitante il tempo shutdown -P -H?
Salterio

3

Rinomina l'eseguibile di spegnimento in qualcosa che è impossibile invocare accidentalmente.

Quindi alias shutdownessere(whatever) -r


1
Potresti spiegare come si fa a rinominare l'eseguibile? Potrebbe interrompere gli aggiornamenti dei pacchetti in futuro?
AL

2
@AL Potrebbe interrompere gli aggiornamenti dei pacchetti in futuro? Sì, potrebbe. Potrebbe anche rompere le cose già installate. In generale, fare confusione con parti dell'installazione del sistema operativo è una pessima idea.
Andrew Henle,

1
Essere d'accordo. È sufficiente alias shutdownper /sbin/shutdown -r. La ridenominazione non è necessaria; poiché l'espansione dell'alias si riferisce a un percorso assoluto, non è soggetta all'espansione ricorsiva dell'alias.
Salterio

Un avvertimento: penso che "niente è impossibile" - semplicemente improbabile
JosephDoggie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.