Jak wyłączyć straszne polecenia terminalowe?

82

Jak wyłączyć przerażające polecenia terminala?

Korzystałem z SSH, aby uzyskać dostęp do zdalnego serwera Ubuntu bez dostępu do fizycznego serwera. Myślałem, że piszę „ shutdown” na serwerze NoSQL działającym w systemie operacyjnym Ubuntu, ale tak naprawdę powiedziałem serwerowi Ubuntu, aby się zamknął. Następnie musiałem powiedzieć administratorowi serwera, co zrobiłem, aby mógł dla mnie uruchomić serwer fizyczny. To było zawstydzające!

Jak mogę temu zapobiec?

MelodiousFires
źródło
100
Omówiono to szczegółowo, zwykle w odniesieniu do rmktórych ma gorsze skutki uboczne niż shutdown. Konkluzja: nie ma sposobu, aby zapobiec wystąpieniu złych rzeczy, jeśli będziesz uruchamiać losowe polecenia jako root.
Dmitrij Grigoryev,
5
Jak zauważyli inni ludzie w zakresie aliasingu, może to spowodować, że ludzie „przyzwyczają się do wykonywania polecenia w niestandardowy sposób”. Czy to komu innemu wydaje się złe, że głupi serwer NoSQL używa tego polecenia?
bmb,
Serwer NoSQL, którego używałem, to Redis.
MelodiousFires
60
Po prostu nie działają w ramach konta root.
alk
12
Śmiem twierdzić, że nauczyłeś się tej lekcji, więc nie będziesz musiał odczuwać potrzeby ponownego wyłączania poleceń. Dodałbym również, że nie jesteś głupi GNU / Linux, po prostu jesteś lepszy niż głupiec.

Odpowiedzi:

204

Standardowa odpowiedź brzmi: „nie loguj się jako root”. Wszystkie polecenia uruchamiane jako root są przerażające. Jeśli nie jest to opcja, możesz wstawić do swojego polecenia aliasy, .bashrcaby wyłączyć polecenia, które uważasz za szczególnie przerażające. Na przykład:

for scary in shutdown halt  reboot rm
do
    alias $scary="echo If you really want to do that, type: `which $scary`"
done

Następnie, jeśli wpiszesz polecenie shutdown, pojawi się następujący komunikat:

If you really want to do that, type: /sbin/shutdown

( Upewnij się, że Twój .bashrczaładowaniu pierwsze, zanim spróbujesz to na serwerze produkcyjnym)

Wyjście z bieżącej sshsesji i ponowne zalogowanie się lub użycie . ~/.bashrcpowinno załadować / uruchomić .bashrc. Być może spróbuj uruchomić rmbez żadnych argumentów, aby upewnić się, że Twój serwer nie wyłączył się automatycznie .bashrcpodczas logowania lub podobnie.

Pamiętaj, że jeśli martwisz się głównie zatrzymaniem i zamknięciem, możesz rozważyć zainstalowanie Molly-Guard , co spowoduje, że wpiszesz nazwę hosta przed wyłączeniem komputera. Jest to bardziej przydatne, jeśli regularnie zamykasz całe systemy operacyjne w linii poleceń, ale chcesz się upewnić, że zamykasz właściwy.

Możesz również przetestować, wypróbuj to za pomocą mniej przerażającego polecenia, takiego jak wylogowanie lub wyjście.

gmatht
źródło
70
nie loguj się jako root : to nie pomoże, jeśli mylisz komputer, na którym jesteś zalogowany. Sugeruję zmianę podpowiedzi na coś, co dałoby ci wizualną wskazówkę.
isanae
145
Aliasing „przerażających” poleceń mających na celu „bezpieczne” zachowanie jest, moim zdaniem, złym pomysłem. Wynika to z tego, że ludzie mają w zwyczaju wykonywanie poleceń w niestandardowy sposób, co może powodować, że robią bardzo godne pożałowania rzeczy, gdy są w systemie waniliowym. Prostą odpowiedzią jest troska bardzo ostrożnie po zalogowaniu się jako root.
TimGJ
22
@isanae Skrót, którego użyłem, aby otworzyć terminal z ssh na serwerze produkcyjnym, sprawiłby, że tło terminala stałoby się czerwone. To sprawiło, że zwróciłem uwagę.
Peter A. Schneider,
6
sourcejest aliasem .i nie jest obsługiwany przez wszystkie powłoki.
gronostaj
4
Zauważ też, że chociaż Debian i, przez rozszerzenie, Ubuntu mają defaulltowe ~/.bash_profileźródło .bashrc, które nie jest standardowym zachowaniem i w większości systemów, .bashrcnie jest odczytywane podczas logowania przez ssh, więc nie będzie to miało znaczenia. O wiele lepiej jest dodać aliasy do ~/.profilelub ~/.bash_profilezamiast tego.
terdon
73

sudoistnieje z jakiegoś powodu - użyj go. Po zakończeniu wykonywania polecenia (w tym przypadku interaktywnego interfejsu CLI) następuje powrót do powłoki na poziomie użytkownika, a nie do powłoki root. Istnieje bardzo niewiele godnych powodów, aby znaleźć się w powłoce root. (Dziwię się, że to już nie jest odpowiedź ...)

Mimo, że nie będzie muppet, który wykorzystuje sudodo wszystkiego . Zrozum, co robisz i zrozum, dlaczego to nie wymaga uprawnień roota.


Dodatkowo możesz rozróżnić monit o powłoki root / użytkownika. To również sprawia, że ​​bardziej oczywiste jest, że wróciłeś do powłoki, a nie „ inny CLI ”. Mój jest bardzo kolorowy i ma wiele przydatnych informacji (takich jak nazwa hosta), co sprawia, że bardzo łatwo jest wiedzieć, na którym hoście polecenie zostanie wykonane, a także ułatwia przeglądanie historii i lokalizowanie podpowiedzi - root powłoka używa domyślnego monitu.

Moje PS1

Jest to bardziej odpowiednie do użycia na „ swoim ” koncie, ale jeśli poważnie podchodzisz do bezpieczeństwa / administrowania systemem, nie będziesz udostępniać haseł / kont i nie będziesz siedział w powłoce root bez pełnej świadomości.


Jak ludzie powtarzali w kółko, „ aliasing poleceń w celu stworzenia bezpiecznego środowiska to zły pomysł ”. Będziesz czuć się komfortowo w swoim bezpiecznym środowisku, wpisując te „przerażające” polecenia tam, gdzie nie powinieneś. Pewnego dnia zmienisz pracę lub zalogujesz się na nowej maszynie, a potem rozlegnie się huk „ Whoopsy, nie chciałem, przepraszam ”…

Attie
źródło
2
Czy nie miałby tego samego problemu sudo shutdown? Jeśli wykona to na niewłaściwym komputerze, nadal będzie to katastrofa.
Barmar
2
@Barmar Czy NoSQL rozumie polecenie sudo?
Taemyr
2
@Taemyr sudoto polecenie powłoki, nie ma ono nic wspólnego z bazą danych.
Barmar
4
@Barmar: Właściwie myślę, że OP zamierzał wpisać go w programie cmdline NoSQL, a nie w bash. Więc nie napisaliby sudo shutdown, ponieważ zakładam, że sudonie jest poleceniem NoSQL. Brak bycia w powłoce root całkowicie rozwiązałby ten problem i był bardzo dobrym pomysłem. Więc uważnie spojrzał na monit przed uruchomieniem ważnych poleceń.
Peter Cordes
44

Pakiet „Molly-Guard” (przynajmniej w systemach pochodnych Debiana) zainstaluje opakowanie wokół zamykania, zatrzymywania, wyłączania i ponownego uruchamiania. Jeśli wykryje, że terminal jest zdalny, wyświetli monit o podanie nazwy hosta. Jeśli nie pasuje, polecenie jest anulowane.

CSM
źródło
4
co z innymi (prawdopodobnie bardziej przerażającymi) rzeczami rm -rf /?
marcellothearcane
9
@marcellothearcane set -umoże w niektórych przypadkach pomóc, na przykład podczas pisania rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT.
Alex Hall
4
@marcellothearcane Na czymkolwiek podobnym do nowoczesnego systemu Linux, potrzeb, --no-preserve-rootktórych nie można wpisać przypadkowo.
CVn
3
kim jest Molly, zastanawiam się ... prawdopodobnie czyjś kot.
the0ther
7
@ the0ther, 2-letni dzieciak, który dwa razy tego samego dnia uruchomił przełącznik SCRAM na maszynie dinozaura. Ludzie w pokoju przymocowali pokrywę do przełącznika. catb.org/jargon/html/M/molly-guard.html
CSM
4

Zaakceptowałem odpowiedź, którą bardzo lubię, jednak jeśli ktoś inny czyta i chce prostszej odpowiedzi, oto moja.

Znajdź plik .bashrc i wstaw jako ostatni wiersz:

alias shutdown=notforuse

Następnie, gdy wpiszesz polecenie shutdown, otrzymasz coś takiego ~bash: notforuse is not a command

To może być głupie, ale jest proste i działa. Doceniam odpowiedzi z lepszymi sposobami na to!

MelodiousFires
źródło
4
Hm, robiłem to z rmtrollowaniem ludzi -alias rm='echo "You can't use rm!" #'
MD XF,
52
Myślę, że to zły pomysł z trzech powodów. Po pierwsze, jest mylące dla każdego, kto ma dostęp do roota na maszynie. Po drugie, uczy cię, że możesz wpisać „zamknij” i naciśnij Enter, co oznacza, że ​​prawdopodobnie popełnisz ten sam błąd w następnym systemie, do którego masz dostęp do roota. Po trzecie, stanie się to bardzo mylące, jeśli notforusena ścieżce kiedykolwiek zostanie wydane prawidłowe polecenie .
David Richerby,
5
Jestem z @DavidRicherby w tej sprawie. To nie jest dobry pomysł.
Tico
Jeśli naprawdę chcesz użyć aliasów, możesz przynajmniej umieścić wszystkie przerażające aliasy poleceń w pliku, powiedzmy ~/.SaveMyReputationi dodaj jako ostatni wiersz .bashrclinii jako [ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputation. Możesz w końcu dodać dodatkową linię echo "#Scaring command protected shell, comment the last line of .bashrc and log again to have a full working shell"do tego pliku. Przynajmniej ten plik aliasu możesz zabrać ze sobą na inny komputer (tak powinno być .bash_aliases, ale w tym „przestarzałym” przypadku lepiej jest użyć innej nazwy).
Hastur
Jeśli masz zamiar to zrobić, uczyń to mniej mylącym, używając nazwy takiej jak alias shutdown=shutdown-disabled-by-an-alias. (To rozwiązuje tylko trzeci i najbardziej drobny problem, na który zwrócił uwagę @DavidRicherby.) Chociaż następna osoba prawdopodobnie prawdopodobnie zajmie tylko 2 sekundy, od przejścia notforuse is not a commanddo uruchomienia type -a shutdowni znalezienia aliasu, a następnie wpisania w sudo \shutdowncelu wyłączenia rozszerzenia aliasu. (Zakładając, że aliasy sudodo, sudo='sudo 'więc rozwija aliasy w pierwszym argrze).
Peter Cordes
1

Dla shutdown( reboot, halti pokrewne): Mam kopię z pytają mnie, czy jestem pewien (a to i tak nic nie robi). Przechowuję takie skrypty w /usr/local/sbin. W Debianie ma to priorytet inne /sbin(jest to pierwszy katalog PATH).

Skrypty systemowe wykorzystują pełną ścieżkę, więc taki hack uniemożliwia mi zatrzymanie zdalnego serwera zamiast lokalnego komputera (złe zachowanie z Awesome WM), ale nie ma innego pośredniego efektu, i nadal mogę ich używać jako / sbin / shutdown, gdy naprawdę jest potrzebny .

Giacomo Catenazzi
źródło
Takie włamania działają tylko wtedy, gdy zastosujesz je do każdego komputera, na którym kiedykolwiek się zalogujesz ... co jest często dość niepraktyczne i nie dowiesz się, dopóki nie będzie za późno: wpisując shutdownkrytyczny system, który nie ma włamania.
jpaugh
@jpaugh: tak, to jest hack i używam go tylko do moich osobistych serwerów, na których często się loguję, a terminale pozostają otwarte przez zbyt długi czas. [Uwaga: Używam również różnych kolorów podpowiedzi dla moich komputerów osobistych: zdalny root, zdalny użytkownik, lokalny root, lokalny użytkownik]. W przypadku prawdziwych serwerów i zdalnej maszyny unikam rootowania i rootuję tak mało, jak to możliwe, i na pewno, nie zapominając o wyjściu z nich. Po prostu używam moich pilotów jako „chmury” (przed szumem w chmurze, więc obsługiwane w dawny sposób).
Giacomo Catenazzi
1

Plik Sudoers pozwala na znacznie dokładniejszy poziom szczegółowości niż tylko * 'może używać sudo' *, w szczególności możesz użyć aliasów poleceń, aby utworzyć białe listy grup poleceń, do których ograniczony jest dany użytkownik lub grupa. Pracowałem ze zdalnymi serwerami, które były ograniczone do dostępu ssh i zezwalały na sudo bez hasła (wymagaliśmy kluczy ssh chronionych hasłem). Jest kilka dobrych powodów, aby to zrobić, ale wiąże się to z niebezpieczeństwami, więc użyliśmy aliasów poleceń, aby umożliwić nieograniczony dostęp do rzeczy, które muszą zrobić (ponowne uruchomienie serwerów itp.) Bez przyznawania im uprawnień do rzeczy, których nie zrobili.

Istnieje również składnia, która mówi „nie można uruchomić tego polecenia” . Można go obejść, więc nie należy go używać jako prawdziwego środka bezpieczeństwa, ale działałoby w opisanym scenariuszu.

Człowiek sudoers ma kilka dobrych przykładów, jak to wszystko skonfigurować.

Oczywiście wymaga to użycia sudo, ale powinno to być oczywiste.

Tallus
źródło
1

Być może padłeś ofiarą nowej głupoty Ubuntu.

Ubuntu posiadało normalne, klasyczne shutdownpolecenie, które wymaga obowiązkowego argumentu czasu.

Oto, co dzieje się na Ubuntu 12, jeśli piszę shutdown, nawet jako zwykły użytkownik:

$ shutdown
shutdown: time expected
Try `shutdown --help' for more information.

Następnie

$ shutdown +100
shutdown: need to be root.

Teraz jest Ubuntu 16.10. Nie jestem rootem:

$ date ; /sbin/shutdown
Fri Jun 23 16:00:16 PDT 2017
Shutdown scheduled for Fri 2017-06-23 16:01:16 PDT, use 'shutdown -c' to   cancel.

Bez żadnych argumentów planuje zamknięcie systemu na 60 sekund później, a nawet jeśli nie jesteś rootem - tylko konto z uprawnieniami administratora.

Obwiniaj kanoniczny.

Kaz
źródło
6
/sbin/shutdown jestsystemd-sysv domyślnie dostarczany przez pakiet , więc nie jest to głupota Ubuntu, to systemdgłupota, i nie pochodzi ona od Ubuntu, ale przynajmniej od Debiana, który z kolei wydaje się przejmować cały systemdruch od Red Hata. Obwiniając winę, obwiniaj właściwy byt - nie tylko ten, którego nie lubisz.
Ruslan
1
@Ruslan Nikt, kto pakuje te bzdury do swojej dystrybucji, nie unika winy głupoty.
Kaz
0

Do wyłączenia służy molly-guard. Wystarczy go zainstalować, a gdy spróbujesz zamknąć system za pomocą ssh, pojawi się monit o wpisanie nazwy hosta.

Do usuwania plików istnieją rozwiązania takie jak libtrash, który emuluje kosz za pośrednictwem LD_PRELOADbiblioteki.

I możesz przetestować pliki, które zmieniasz / usuwasz / ... za pomocą programu może . To całkiem fajne podczas testowania czegoś.

allo
źródło
1
Ta maybesprawa wydaje się być uszkodzony przez wzorem: stubbing niektóre syscalli bez-ops ma zamiar rozbić każdą nietrywialne program, który opiera się na tych syscalli do osiągnięcia sukcesu.
Dmitrij Grigoriew
-2

Spróbuj tego: gdy używasz zdalnej powłoki, za każdym razem, gdy masz zamiar wpisać klawisz „return”, zatrzymaj się na 5 sekund, przesuwając palcem po klawiszu „return” i ponownie przeczytaj polecenie, które masz zamiar wysłać. Czy to jest w porządku? Jesteś pewny?

Wydaje się to trudne, ale z drugiej strony nie powinniśmy spędzać dużo czasu na zdalnych powłokach. Powinniśmy znaleźć wszystkie sposoby na zautomatyzowanie naszych prac konserwacyjnych, aby rzadko, jeśli w ogóle, logowaliśmy się na zdalnym serwerze.

xpmatteo
źródło
Próbowałem tego, nie działa. Wszedłem shutdown, zatrzymałem się na 5 sekund, ponownie przeczytałem polecenie (na głos!) I jestem pewien, że było poprawne. Następnie naciśnij klawisz Enter, a polecenie zostało właśnie wykonane. Obawiam się, że nie wyłączało to przerażających poleceń. Spróbuję z tym unoszeniem palca, może odległość była zbyt mała / duża.
wojciech_rak