Skip to main content

Terminale tekstowe w systemie Linux - 14.1 Getty (używane w / etc / inittab)

Linux #2: Terminal - Strumienie i uprawnienia (Czerwiec 2026)

Linux #2: Terminal - Strumienie i uprawnienia (Czerwiec 2026)
Anonim

14.1 Getty (używane w / etc / inittab)

Wprowadzenie do Getty

Aby proces logowania był uruchamiany na porcie szeregowym (i podłączonym do niego terminalu) podczas uruchamiania komputera (lub przełączania poziomów uruchamiania), do pliku / etc / inittab należy wstawić komendę getty. Uruchomienie getty z wiersza poleceń może spowodować problemy (zobacz Jeśli getty run z wiersza poleceń: Program zostanie zatrzymany, aby zobaczyć, dlaczego). Getty GET uruchamia terminal TTY. Każdy terminal wymaga własnego polecenia getty. W każdym pliku / etc / inittab znajduje się również co najmniej jedno polecenie getty dla konsoli. Znajdź to i umieść komendy getty dla rzeczywistych terminali obok niego. Ten plik może zawierać przykładowe linie getty dla terminali tekstowych, które są komentowane, więc wszystko, co musisz zrobić, to odkomentować je (usunąć wiodący numer) i zmienić kilka argumentów.

Argumenty, które są dozwolone, zależą od używanego getty:Najlepszymi dwoma gettyami dla bezpośrednio podłączonych terminali są:

  • agetty (czasami tylko zwany getty): Bardzo łatwy w konfiguracji. Brak plików konfiguracyjnych. Zobacz agetty
  • getty (część getty_ps)

Dwa getty najlepsze dla modemów dial-in (unikaj dla bezpośrednio podłączonych terminali) to:

  • mgetty: najlepszy do modemów; działa również na terminalach, ale gorsze
  • uugetty: tylko dla modemów; część pakietu getty_ps

Proste getty do użycia, jeśli nie używasz prawdziwego terminalu tekstowego. Większość użytkowników systemu Linux używa jednego z nich na swoim monitorze:

  • mingetty
  • fbgetty
  • fgetty
  • Rungetty

Twoja dystrybucja Linuksa może pochodzić z ps_getty lub agetty dla terminali tekstowych. Niektóre dystrybucje nie dostarczają ani. Niestety, często nazywają to po prostu "getty", więc możesz potrzebować określić, który masz, ponieważ argumenty, które umieszczasz po nim w / etc / inittab, różnią się. Debian używa agetty (w pakiecie util-linux). RedHat i Fedora użyły ps_getty, który znajduje się w: ps_getty

W ostateczności, aby spróbować określić, jakie getty masz, możesz sprawdzić jego kod wykonywalny (zwykle w / sbin). ps_getty ma / etc / gettydefs osadzone w tym kodzie. Aby go wyszukać, przejdź do / sbin i wpisz:ciągi getty | grep getty Jeśli getty rzeczywiście jest agetne, powyższe nic nie da. Jednak jeśli masz agetty pisania:getty -hpowinien pokazać opcje -hiLmw.

Jeśli nie masz getty, chcesz sprawdzić inne dystrybucje i obcy program do konwersji między pakietami RPM i Debian. Kod źródłowy można pobrać z Getty Software.

Jeśli nie korzystasz z linii sterowania modemem (na przykład jeśli używasz tylko minimalnej liczby 3 przewodów: nadaj, odbierz i wspólny sygnał), powinieneś poinformować o tym używając flagi "lokalnej". Format tego zależy od używanego getty.

Getty wychodzi po zalogowaniu (i może się odrodzić)

Po zalogowaniu się zauważysz (używając "top", "ps -ax" lub "ptree"), że proces getty już nie działa. Co się z tym stało? Dlaczego getty ponownie się uruchamia, jeśli twoja powłoka zostanie zabita? Dlatego.

Po wpisaniu nazwy użytkownika getty bierze ją i wywołuje program do logowania podając jej nazwę użytkownika. Proces getty zostaje zastąpiony procesem logowania. Proces logowania prosi o podanie hasła, sprawdza je i uruchamia dowolny proces określony w pliku haseł. Ten proces jest często powłoką basha. Jeśli tak, uruchomi się bash i zastąpi proces logowania. Zauważ, że jeden proces zastępuje inny i że proces powłoki bash został początkowo uruchomiony jako proces getty. Konsekwencje tego zostaną wyjaśnione poniżej.

Teraz w pliku / etc / inittab, getty powinien odradzać się (restart), jeśli został zabity. Mówi tak na linii, która wzywa getty. Ale jeśli powłoka bash (lub proces logowania) zostanie zabity, getty respawns (restartuje). Czemu? Cóż, zarówno proces logowania, jak i bash są zamiennikami getty i dziedziczenia

* Text Terminal Jak wykonać indeks

połączenia sygnałowe ustanawiają ich poprzednicy. W rzeczywistości, jeśli zauważysz szczegóły, zauważysz, że proces wymiany będzie miał ten sam identyfikator procesu co oryginalny proces. Tak więc bash to rodzaj getty w przebraniu z tym samym numerem identyfikacyjnym procesu. Jeśli bash zostanie zabity, to tak, jakby getty został zabity (nawet jeśli getty już nie działa). Powoduje to odradzanie się getty.

Po wylogowaniu wszystkie procesy na tym porcie szeregowym zostają zabite, łącznie z powłoką bash. Może się to również zdarzyć (jeśli jest włączone), jeśli sygnał zawieszenia zostanie przesłany do portu szeregowego przez spadek napięcia DCD przez modem. Dowolne wylogowanie lub upuszczenie DCD spowoduje odrodzenie się getty. Można zmusić getty do odrodzenia się, ręcznie zabijając bash (lub logując się) poprzez naciśnięcie klawisza k itd., Podczas gdy w "górze" lub przy użyciu polecenia "zabij". Prawdopodobnie będziesz musiał zabić go sygnałem 9 (którego nie można zignorować).

Jeśli getty zostanie uruchomione z wiersza poleceń: Programy zostaną zatrzymane

Powinieneś normalnie uruchomić getty od środka / etc / inittab a nie z linii poleceń, albo niektóre programy uruchomione na terminalu mogą zostać nieoczekiwanie zawieszone (zatrzymane). Oto dlaczego (przejdź do następnej sekcji, jeśli nie ma dla ciebie znaczenia). Jeśli uruchomisz getty na przykład ttyS1 z wiersza poleceń innego terminala, powiedzmy tty1, to będzie to tty1 jako "terminal kontrolny", nawet jeśli rzeczywisty terminal, na którym działa, to ttyS1. W ten sposób ma niewłaściwy terminal sterujący. Ale jeśli zostanie uruchomiony wewnątrz pliku inittab, to będzie miał ttyS1 jako terminal sterujący (poprawny).

Mimo że terminal kontrolny jest nieprawidłowy, logowanie na ttyS1 działa dobrze (ponieważ podałeś ttyS1 jako argument do getty). Standardowe wejście i wyjście są ustawione na ttyS1, mimo że terminal kontrolny pozostaje na tty11. Inne programy uruchamiane w ttyS1 mogą dziedziczyć standardowe wejście / wyjście (które jest połączone z ttyS1) i wszystko jest w porządku. Ale niektóre programy mogą popełnić błąd, próbując odczytać z kontrolnego terminalu (tty1), który jest nieprawidłowy. Teraz tty1 może myśleć, że programy te są uruchamiane w tle przez tty1, więc próba odczytu z tty1 (powinna to być ttyS1) powoduje zatrzymanie procesu, który próbował odczytać. (Proces w tle nie może odczytać z jego terminala sterującego.). Możesz zobaczyć komunikat typu: "1 + Zatrzymano"na ekranie W tym momencie utknąłeś, ponieważ nie możesz wejść w interakcję z procesem, który próbuje komunikować się z tobą za pośrednictwem niewłaściwego terminala .. Oczywiście, aby uciec od tego możesz przejść do innego terminalu i zabić proces, itp. .

agetty (może być nazywane getty)

Przykładowa linia w / etc / inittab:

S1: 23: respawn: / sbin / getty -L 19200 ttyS1 vt102

S1 pochodzi z ttyS1. 23 oznacza, że ​​getty jest uruchamiane po przejściu na poziomy 2 lub 3 run. Respawn oznacza, że ​​jeśli getty (lub proces, który je zastąpił, taki jak bash) zostanie zabity, getty automatycznie ponownie się uruchomi (odradza). / sbin / getty to polecenie getty. -L oznacza Local (ignoruj ​​sygnały sterujące modemem). -h (nie pokazano w przykładzie) umożliwia sterowanie sprzętem (takie same jak stty crtscts). 19200 to szybkość transmisji. ttyS1 oznacza / dev / ttyS1 (COM2 w MS-DOS). vt102 jest typem terminala, a to getty ustawi zmienną środowiskową TERM na tę wartość. Nie ma plików konfiguracyjnych. Wpisz "init q" w linii poleceń po edycji getty i powinieneś zobaczyć okno logowania.

Automatyczne wykrywanie problemów parzystości przez Agetty

The agetty program spróbuje automatycznie wykryć zestaw parzystości wewnątrz terminala (w tym brak parzystości). Nie obsługuje 8-bitowych bajtów danych i 1-bitowej parzystości. Zobacz 8-bitowe bajty danych (z dodatkowym parzystością). Jeśli użyjesz stty ustawić parytet, agetty automatycznie usunie go, ponieważ początkowo chce, aby bit parzystości przyszedł tak, jakby był bitem danych. Dzieje się tak dlatego, że podczas wpisywania nazwy użytkownika trzeba uzyskać ostatni bit (ewentualnie bit parzystości), aby mógł on automatycznie wykryć parzystość. Dlatego jeśli używasz parzystości, włącz ją tylko w terminalu tekstowym i pozwól agetty automatycznie wykryć i ustawić go na komputerze. Jeśli twój terminal obsługuje odbierane parzystości, monit logowania będzie wyglądał na zniekształcony, dopóki nie wpiszesz czegoś, aby getty mogło wykryć

parytet. Nieczytelny monit odstrasza odwiedzających, itp. Przed próbą zalogowania. To może być dokładnie to, czego chcesz.

Czasami występuje problem z automatycznym wykrywaniem parzystości. Dzieje się tak, ponieważ po pierwszym wpisaniu nazwy użytkownika agetty uruchamia Zaloguj Się program do zakończenia logowania. Niestety, Zaloguj Się program nie może wykryć parzystości, więc jeśli getty program nie mógł wówczas ustalić parzystości Zaloguj Się także nie będzie w stanie go określić. Jeśli pierwsza próba zalogowania się nie powiedzie, Zaloguj Się pozwoli ci spróbować ponownie itd. (wszystko z błędnie ustawionym parzystością). W końcu po wielu nieudanych próbach logowania (lub po przekroczeniu limitu czasu) agetty uruchomi się ponownie i ponownie rozpocznie sekwencje logowania. Gdy getty znowu się uruchomi, może być w stanie wykryć parzystość przy drugiej próbie, aby wszystko mogło działać poprawnie.

Przy niewłaściwej parzystości, Zaloguj Się program nie może poprawnie odczytać tego, co piszesz i nie możesz się zalogować. Jeśli twój terminal obsługuje otrzymany parzystość, będziesz nadal widział zniekształcony ekran. Jeśli getty nie wykryje parzystości, plik / etc / issue jest zwykle umieszczany na ekranie tuż przed monitem, więc na ekranie mogą pojawić się bardziej zniekształcone słowa.

Dlaczego aget nie może wykryć parzystości przez wpisanie pierwszej litery? Oto przykład: Załóżmy, że wykrywa 8-bitowy bajt z jego bitem parzystości 0 (bit wyższego rzędu) i nieparzystą liczbą 1-bitów. Jaka to parytet? Cóż, nieparzysta liczba 1 bitów oznacza, że ​​jest nieparzysta. Ale może to być również postać 8-bitowa bez parzystości. Nie ma sposobu, aby tak daleko ustalić, który. Ale do tej pory wyeliminowaliśmy możliwość równego parzystości. Wykrywanie parzystości odbywa się zatem w procesie eliminacji.

Jeśli następny wpisany bajt jest podobny do pierwszego, a także eliminuje tylko możliwość parzystości, wciąż nie można ustalić parzystości. Ta sytuacja może trwać w nieskończoność, aw rzadkich przypadkach logowanie zakończy się niepowodzeniem, dopóki nie zmienisz nazwy użytkownika. Jeśli agetty znajdzie bit parzystości równy 1, zakłada, że ​​jest to bit parzystości, a nie bit wyższego rzędu 8-bitowego znaku. Zakłada się w ten sposób, że nie używasz meta-znaków (high bit set) w nazwie użytkownika (tzn. Że twoje nazwisko jest w ASCII).

Można dostać się do "pętli logowania" na różne sposoby. Załóżmy, że wpisujesz tylko jedną literę lub dwie dla swojego loginu, a następnie naciśnij przycisk powrotu. Jeśli te litery nie są wystarczające do wykrycia parzystości, logowanie rozpoczyna się przed wykryciem parzystości. Czasami ten problem występuje, jeśli nie masz włączonego terminala i / lub połączenia, gdy agetty po raz pierwszy się uruchamia.

Jeśli utkniesz w tej "pętli logowania", wyjście z niej polega na kilkukrotnym naciśnięciu klawisza Return, aż pojawi się monit logowania getty. Innym sposobem jest po prostu poczekać minutę lub dłużej na timeout. Następnie program getty wyświetli monit getty login i możesz spróbować ponownie, aby się zalogować.

8-bitowe bajty danych (plus parzystość)

Niestety, agetty nie może wykryć tej parzystości.Pod koniec 1999 r. Nie ma możliwości wyłączenia automatycznego wykrywania parzystości, a tym samym wykryje niepoprawną parzystość. W rezultacie proces logowania zostanie zniekształcony, a parzystość źle ustawiona. Dlatego wydaje się niewykonalne, aby spróbować użyć 8-bitowych bajtów danych z parzystością.

getty (część getty_ps)

(Większość tego pochodzi ze starego Serial-HOWTO Grega Hankinsa)Do tego getty należy wstawić wpisy do pliku konfiguracyjnego i dodać wpis / etc / inittab. Oto kilka przykładowych wpisów do użycia dla twojego terminala, które umieściłeś w pliku konfiguracyjnym / etc / gettydefs.

Zauważ, że DT38400, DT19200 itd. Są tylko etykietami i muszą być takie same, jakich używasz / etc / inittab.

Jeśli chcesz, możesz zrobić getty wydrukuj interesujące rzeczy w banerze logowania. W moich przykładach mam wydrukowaną nazwę systemu i linię szeregową. Możesz dodać inne rzeczy: blockquote

shade = yes

Po zakończeniu edycji / etc / gettydefs, możesz sprawdzić, czy składnia jest poprawna, wykonując:

Upewnij się, że nie ma innych getty lub uugetty plik konfiguracyjny portu szeregowego, do którego jest podłączony twój terminal, taki jak (/etc/default/{uu}getty.ttySN lub /etc/conf.{uu}getty.ttySN), ponieważ prawdopodobnie zakłóci to działanie getty na terminalu. Usuń takie pliki będące w konflikcie, jeśli zostaną usunięte.

Edytuj swoje / etc / inittab plik do uruchomienia getty na porcie szeregowym (zastępując poprawną informacją dla twojego środowiska - port, prędkość i domyślny typ terminala):

W tym momencie na terminalu powinien pojawić się znak logowania. Być może będziesz musiał nacisnąć przycisk powrotu, aby zwrócić uwagę terminalu.

mgetty

"M" oznacza modem. Ten program jest przeznaczony głównie dla modemów i od połowy 2000 r. Będzie wymagać rekompilacji, aby móc go używać do terminali tekstowych (chyba że używa się sprzętowej kontroli przepływu - i zwykle wymaga to ręcznie wykonanego kabla). Dokumentacja podłączonych bezpośrednio terminali znajduje się w części "Bezpośrednia" instrukcji: mgetty.texi.

Spójrz na ostatnie wiersze /etc/mgetty/mgetty.config na przykład konfigurowania go dla terminala. O ile nie powiesz "toggle-dtr no", pomyślisz, że masz modem i upuszczasz (negujesz) pin DTR na PC, na próżno usiłując zresetować nieistniejący modem. W przeciwieństwie do innych getty, mgetty nie przyłączy się do terminala, dopóki ktoś nie uderzy żadnego klucza tego terminala, więc zobaczysz? dla terminala w Top lub ps dopóki to się nie stanie. Loguje się / var / log / mgetty / może wyświetlać kilka komunikatów ostrzegawczych, które dotyczą tylko modemów, które możesz zignorować.

Oto przykład prostej linii, którą umieścisz / etc / inittab: