Jak zapobiec przypadkowemu wyjściu konsoli zepsucia terminala?


23

Istnieje wiele pytań dotyczących SE, które pokazują, jak odzyskać zepsuty terminal cat /dev/urandom. Dla tych, którzy nie znają tego problemu - tutaj chodzi o:

  1. Wykonujesz cat /dev/urandomlub równoważny (na przykład cat binary_file.dat).
  2. Śmieci są drukowane.
  3. To by było w porządku ... z tym wyjątkiem, że twój terminal drukuje śmieci nawet po zakończeniu polecenia! Oto zrzut ekranu niepoprawnie odczytanego tekstu, który w rzeczywistości jest wynikiem g ++:

    Przykładowy zrzut ekranu

    Sądzę, że ludzie mieli rację co do tego, że błędy C ++ są czasami zbyt tajemnicze!

Zwykle rozwiązaniem jest uruchamianie stty sane && reset, chociaż jest to trochę denerwujące, gdy jest to uruchamiane.

Z tego powodu w tym pytaniu chcę skupić się na pierwotnym powodzie, dla którego tak się dzieje, oraz na tym, jak zapobiegać zerwaniu terminala po wydaniu takiego polecenia. Nie szukam rozwiązań, takich jak przesyłanie niepoprawnych poleceń do trlub xxd, ponieważ wymaga to, abyś wiedział, że program / plik wypisuje dane binarne przed ich uruchomieniem / wydrukowaniem, i należy pamiętać o każdym wyjściu takich danych .

Zauważyłem to samo zachowanie w buforze ramek URxvt, PuTTY i Linux, więc nie sądzę, że jest to problem specyficzny dla terminala. Moim głównym podejrzeniem jest to, że losowe wyjście zawiera kod ucieczki ANSI, który zmienia kodowanie znaków (w rzeczywistości, jeśli uruchomisz cat /dev/urandomponownie, istnieje szansa, że rozbije terminal, co wydaje się potwierdzać tę teorię). Jeśli to prawda, co to za kod ucieczki? Czy są jakieś standardowe sposoby na wyłączenie?

Odpowiedzi:


22

Nie:

  • nie ma standardowego sposobu na „wyłączenie” i
  • szczegóły złamania są w rzeczywistości specyficzne dla terminala, ale
  • istnieją pewne powszechnie wdrażane funkcje, w przypadku których można źle się zachowywać.

W przypadku często zaimplementowanych funkcji zapoznaj się z alternatywnym zestawem znaków w stylu VT100, który jest aktywowany przez ^Ni ^O(włącz / wyłącz). Które mogą być tłumione w niektórych terminalach przy użyciu trybu UTF-8, ale te same zaciski mają wiele okazji do zaśmiecać ekranu (mowa o ekranie konsoli GNU, Linux, szpachlówki tutaj) z sekwencji ucieczki oni nie rozpoznają.

Niektóre inne sekwencje specjalne, na przykład, opierają się na odpowiedziach terminala na zapytanie (sekwencja specjalne) hosta. Jeśli host nie oczekuje tego, wynikiem jest kosz na ekranie.

W innych przypadkach (widoczne na przykład w urządzeniach sieciowych z zakodowanymi sekwencjami ucieczki dla konsoli Linux) inne terminale uznają to za błędnie zakodowane i wydają się zawieszać.

Więc ... możesz skupić się tylko na jednym terminalu, przyciąć coś, co wygląda na uciążliwe (jak na przykład niektórzy sugerują usunięcie możliwości używania myszy do pozycjonowania w edytorach), a możesz uzyskać coś, co nie ma widocznych dziur. Ale to tylko jeden terminal.


0

Jeśli masz kontrolę i wiesz, że polecenie cię spieprzy, zwykle wyświetlę wynik w mniejszym stopniu.

head -n4 /dev/urandom | less

Wydaje się, że to zwykle chwyta śmieci i drukuje je z rozsądną reprezentacją, nigdy nie miałem żadnych kłopotów, które pamiętam po wyjściu z q , co odważyłem, abyś nie zaznajomił się z rzuceniem rzadziej.


2
Pytanie wyraźnie mówi, że nie szuka rozwiązań, które wymagają wcześniejszej wiedzy, że program generuje dane binarne.
Barmar,

-1

Wklej dane wyjściowe polecenia itp. Do tee -


2
Jak to pomoże? Nadal wydrukuje dane wyjściowe, ale także zapisze je w pliku.
Barmar,

Może miałeś na myśli morelub less?
Barmar,

według OP z naciskiem: „... po wydaniu takiego polecenia. Nie szukam rozwiązań takich jak nadawanie złych poleceń”
Jeff Schaller
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.