Najlepszy sposób na usunięcie polecenia zamknięcia systemu, ale kontynuuj restart

27

Mam urządzenie typu raspi w centrum danych, a ostatnio przypadkowo tłukłem palcami i wkleiłem polecenie wyłączania do niewłaściwego terminala na moim ekranie. Czy istnieje sposób na zachowanie, shutdown -rale usunięcie #poweroff #shutdown -P -Hopcji?

Chcę zachować shutdown -r dowodzenie. Lubię ustawić czas, jeśli uda mi się zamrozić system lub zablokować się regułami tabeli ip. przykładshutdown -r +10

foxtrot22
źródło

Odpowiedzi:

39

Powinieneś używać systemowej dystrybucji Linuksa. W takim przypadku powinieneś mieć możliwość maskowania celu wyłączenia, aby systemd odmówił jego wykonania (i wyłączenia zasilania). na przykład:

systemctl mask poweroff.target

Uniemożliwia to całkowicie zamknięcie systemu poza ponownym uruchomieniem komputera. Zobacz, że nic się nie dzieje:

Animowane demo Debian9

W takim przypadku wirtualny wyłącznik zasilania tej maszyny wirtualnej nie działa nawet w celu zamknięcia systemu. Ale nadal uruchamia się doskonale.

Aby cofnąć zmianę, po prostu zdemaskuj cel. Następnie możesz zamknąć system.

systemctl unmask poweroff.target
Michael Hampton
źródło
2
Czy istnieje polecenie systemd, które wyświetla listę wszystkich usług / celów / urządzeń wraz z opisem (jeśli są dostępne)? Niedawno zacząłem o tym czytać i chciałbym zbadać możliwości.
hjpotter92
1
@ hjpotter92 Uruchom systemctlbez argumentów. Wyświetla listę wszystkich aktywnych jednostek, ich status i opisy. Dodaj, --alla także wyświetli listę jednostek, które nie są aktywne.
Michael Hampton
2
@ hjpotter92 Spójrz na man systemd.special.
TooTea,
16

Istnieje kilka sposobów na osiągnięcie tego. Ktoś mógłby pracować ze zwykłym nieuprzywilejowanym kontem, które będzie wymagało uruchomienia komendy sudo i wprowadzenia hasła. Następnie możesz dołączyć obserwację do / etc / sudoers (uruchamiając visudo):

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

Ponadto, aby wyłączyć buforowanie poświadczeń sudo, dodaj również następujące elementy:

Defaults timestamp_timeout=0

Zapobiegnie to buforowaniu poświadczeń, ponieważ wcześniej wywołałeś polecenie w sudo.

Przykład:

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

Zauważ, że w powyższym przykładzie nie było wymagane wpisywanie hasła podczas pracy sudo shutdown -r +10, ale przez resztę tak było. Jeśli chcesz usunąć potrzebę wpisywania sudo przed poleceniem ( sudo shutdown -r +10), dodaj do pliku .bash_profile lub .bashrc:

alias shutdown="sudo shutdown"

Przykład:

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

Pamiętaj, że najlepszą praktyką jest praca z kontem nieuprzywilejowanym i eskalacja z sudo, gdy jest to wymagane.

nieznany z nazwiska
źródło
1
Jest to świetne, poza tym sudo, że domyślna konfiguracja będzie miała pamięć podręczną przez pewien czas po pierwszym wywołaniu. Może to być wygodne, gdy wielokrotne wykonywanie poleceń rootjest wymagane w sesji użytkownika. W takiej sesji (a nawet jeśli działa rootpowłoka) byłoby całkowicie możliwe wykonanie polecenia shutdowni ominięcie kontroli.
Kosmiczny Ossifrage,
Dzięki za wkład. Jednak w tym przypadku konfigurujemy, shutdown -raby nie pytać o hasło podczas działania z sudo, dlatego jeśli uruchomi, sudo shutdown -r ...poświadczenia nie zostaną zapisane w pamięci podręcznej, ponieważ nie zostaną wprowadzone. Spójrz na przykład, który podałem powyżej. Widać, że uruchomiłem go, a następnie a sudo shutdown -Hi zostałem poproszony o hasło.
John Doe,
3
Rzeczywiście, to zrozumiałe. Zastanów się jednak nad scenariuszem, w którym ostatnie polecenie było poprzedzone sudoi nie było NOPASSWDoperacją; np. wywołanie edycji pliku konfiguracyjnego jako root. W tym przypadku hasło zostanie zapisane w pamięci podręcznej i nastąpi kolejne wywołanie sudo shutdown -H. sudoBuforowanie haseł musiałoby zostać wyłączone, aby tego uniknąć.
Kosmiczny Ossifrage,
2
W tym przypadku masz rację, +1 za wyłączenie buforowania hasła. Edytowałem mój komentarz z sugestią. Dzięki!
John Doe,
2
Właściwie to wcale mi się nie podoba, właśnie dlatego, że opiera się na obecności hasła sudo, które rzekomo przypomina użytkownikowi, aby nie robił tego, czego nie powinien robić. Ale pytanie o hasło naprawdę nie służy temu celowi. Jest to tak często wymagane sudo, że po prostu wpisujemy hasło i idziemy dalej. Zobacz tutaj alternatywne podejście z użyciem sudo (prawdopodobnie jest znacznie lepsze, mimo że nie jest zbyt dobre).
Michael Hampton
10

Istnieje narzędzie o nazwie Molly-Guard, które wymaga podania nazwy hosta komputera, który chcesz zamknąć lub uruchomić ponownie.

Jeśli nie używasz Debiana, skompilowanie tego ze źródła powinno być banalne, biorąc pod uwagę, że program jest raczej prymitywny.

Simon Richter
źródło
9

Aby zapobiec dystrybucje oparte wpadek RHEL już utworzone aliasy rm, cpa mvco może być nieco bardziej destrukcyjny, gdy wykonywana przez użytkownika root.

Możesz dodać własne, na przykład:

#/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
źródło
2
Jak to utrzymuje się shutdown -rpodczas wyłączania shutdown -P -H?
MSalters
3

Zmień nazwę pliku wykonywalnego zamykania na coś niemożliwego do wywołania przypadkowo.

Następnie alias shutdownbyć(whatever) -r

Wes Groleau
źródło
1
Czy możesz wyjaśnić, jak zmienić nazwę pliku wykonywalnego? Czy może w przyszłości przerwać aktualizacje pakietów?
AL
2
@AL Czy może w przyszłości uszkodzić aktualizacje pakietów? Tak, może. Może również uszkodzić rzeczy już zainstalowane. Ogólnie bałagan z częściami instalacji systemu operacyjnego jest bardzo złym pomysłem.
Andrew Henle,
1
Zgodzić się. Wystarczy pseudonim shutdowndo /sbin/shutdown -r. Zmiana nazwy nie jest konieczna; ponieważ rozwinięcie aliasu odnosi się do ścieżki bezwzględnej, nie podlega rekursywnemu rozszerzeniu aliasu.
MSalters
Jedno zastrzeżenie - pomyślałem, że „nic nie jest niemożliwe” - po prostu mało prawdopodobne
JosephDoggie