Innego dnia robiłem kilka zadań konserwacyjnych na moim serwerze internetowym. Spieszyłem się i byłem śpiący, więc wszystko robiłem za pomocą sudo
poleceń.
A potem przypadkowo nacisnąłem Ctrl+ V, wysyłając to polecenie na mój serwer internetowy:
sudo rm -rf /*
Dla tych, którzy zastanawiają się, co robi powyższe polecenie: usunęło to cały mój serwer WWW
Na szczęście miałem kopie zapasowe i niestety musiałem spędzić dwie godziny na czuciu, aby naprawić ten niesamowity błąd. Ale od tego czasu zastanawiam się:
Czy istnieje sposób, aby zawsze wymuszać hasło sudo dla określonego polecenia?
Gdyby serwer poprosił mnie o hasło, oszczędziłbym sobie wielu kłopotów. Tak się nie stało, ponieważ wykonałem około 5 sudo
poleceń przed tym majestatycznym błędem.
Czy jest na to sposób? Potrzebuję tylko hasła z rm
poleceniem, aby zawsze być egzekwowanym. Inne polecenia, których używam, są zwykle nano
lub cp
które (do pewnego stopnia) można cofnąć.
źródło
/*
jest rozwijany przed przekazaniem go do polecenia rm. Dlatego polecenie nie widzi ani jednego argumentu, ale listę argumentów (/bin /boot /cdrom /dev /etc /home
...)rm
polecenie miało hasło. Chcą tylkosudo
zapytać o jeden za każdym razem, gdy używane jest polecenie rm. Rozwiązanie pytania, które podłączyłeś, stałoby się nieco irytujące, gdy twoje pierwsze polecenie jestsudo rm
. Ponieważ poprosi Cię o dwa hasła, jedno zasudo
jednorm
.Odpowiedzi:
Można ustawić
timestamp_timeout
TO0
dla poszczególnych poleceń/etc/sudoers
. Utwórz plikvisudo -f /etc/sudoers.d/pduck
o następującej treści:Teraz użytkownik
pduck
jest zawsze proszony o hasło podczas działaniasudo rm
(bez względu na podane dodatkowe parametry), nawet jeśli użytkownik jest członkiemsudo
grupy isudo
pamięta swoje hasło dla innych poleceń.Minusem jest to, że nie można łatwo dodać parametrów do
/bin/rm
wiersza w pliku, aby dodatkowo to ograniczyć. Cóż… możesz:ale wtedy zostaniesz poproszony o podanie dokładnie,
sudo rm -f
a nie (ponownie)sudo rm -rf
na przykład.źródło
Jedną z metod byłoby użycie safe-rm . Spowoduje to TYLKO zastosowanie słowa „rm” i zapobiegnie uruchomieniu określonych wersji „rm”. Obejmuje to usunięcie systemu głównego, ale można go również użyć do zapobiegania usuwaniu katalogów związanych z systemem, takich jak „/ usr /” lub „/ var /”. Z linku:
źródło
sudo
zapewnia opcję-k, --reset-timestamp
, patrzman sudo
:Możesz napisać proste opakowanie do
sudo
testowaniarm -rf /*
i uruchamianiazamiast tego, np. tak:
Przykładowe użycie
Testowanie
echo a
tutaj.Jeśli chcesz być pytany przy każdym uruchomieniu
rm
, możesz dostosować powyższą funkcję w następujący sposób:Jeśli chcesz połączyć zarówno ogólne wywołania poleceń, jak i określone wiersze poleceń, polecam użyć
case
np .:Zauważ, że te podejścia nie będzie działać po uruchomieniu
sudo
z opcjami - możliwe rozwiązania są[[ "$*" =~ " rm " ]]
w celu sprawdzenia smyczkowy „rm” otoczony spacjami lub*" rm "*)
zcase
złapać żadnego wiersza poleceń zawierające „rm”.źródło
[[ "$1" == "rm" ]] && opt="-k";
A co/bin/rm
?case
podejścia.Ta odpowiedź nie dotyczy
sudo
części twojego pytania, ale z drugiej strony stanowi sposób na ograniczenie ryzyka przypadkowegorm
wywołania przez dowolnego użytkownika.Możesz alias
rm
dorm -I
którego-f
co przesłania poprzednie-I
opcje.--one-file-system
to kolejne możliwe zabezpieczenie przed niezamierzonym usunięciem, którego używam w swoimrm
aliasie.Ustawiać
Aby utworzyć taki alias, użyj polecenia:
Możesz umieścić go w swoim
~/.bashrc
lub nawet/etc/bash.bashrc
.Stosowanie
Aby potwierdzić, wpisz
yes
jego tłumaczenie na język lokalny lub pierwszą literę dowolnego słowa i naciśnij Enter. Wszelkie inne dane wejściowe, w tym brak, przerywają działanie.źródło