Skip to main content

Tekstterminals onder Linux - 14.1 Getty (gebruikt in / etc / inittab)

Anonim

14.1 Getty (gebruikt in / etc / inittab)

Introductie van Getty

Om een ​​inlogproces op een seriële poort (en de daarop aangesloten terminal) te laten draaien wanneer de computer opstart (of overschakelt naar runniveaus), moet een getty-opdracht in het bestand / etc / inittab worden geplaatst. Getty uitvoeren vanaf de opdrachtregel kan problemen veroorzaken (zie Als getty wordt uitgevoerd vanaf de opdrachtregel: Programma's worden gestopt om te zien waarom). Getty krijgt een TTY (een terminal). Elke terminal heeft zijn eigen getty-opdracht nodig. Er is ook minstens één getty-opdracht voor de console in elk / etc / inittab-bestand. Zoek dit en zet de getty-opdrachten voor de echte terminals ernaast. Dit bestand bevat mogelijk getty-regels voor tekstterminals die zijn voorzien van commentaar, zodat je ze alleen maar hoeft te verwijderen (verwijder de leidende #) en een paar argumenten wijzigt.

De argumenten die zijn toegestaan, zijn afhankelijk van welke getty je gebruikt:Twee gettys die het beste zijn voor direct verbonden terminals zijn:

  • agetty (soms gewoon getty genoemd): Zeer eenvoudig in te stellen. Geen configuratiebestanden. Zie agetty
  • getty (onderdeel van getty_ps)

Twee gettys die het beste geschikt zijn voor inbelmodems (vermijd voor direct aangesloten terminals) zijn:

  • mgetty: de beste voor modems; werkt ook voor terminals, maar inferieur
  • uugetty: alleen voor modems; onderdeel van het getty_ps-pakket

Eenvoudige gettys om te gebruiken als je geen echte tekstterminal gebruikt. De meeste Linux-gebruikers gebruiken een van deze op hun monitor:

  • mingetty
  • fbgetty
  • fgetty
  • rungetty

Je Linux-distributie kan worden geleverd met ps_getty of agetty voor tekstterminals. Sommige distributies leveren geen van beide. Helaas noemen ze het vaak "getty", dus je moet misschien bepalen welke je hebt sinds de argumenten die je er achter zet in / etc / inittab verschillen. Debian gebruikt agetty (in het util-linux-pakket). RedHat en Fedora gebruikten ps_getty voor: ps_getty

Als een laatste redmiddel om te proberen te bepalen welke getty je hebt, kun je de uitvoerbare code (meestal in / sbin) bekijken. ps_getty heeft / etc / gettydefs ingebed in deze code. Om ernaar te zoeken, ga je naar / sbin en typ je:strings getty | grep getty Als getty echt agetty is, zal het bovenstaande niets opleveren. Maar als je agetty-typen hebt:getty -hzou de opties -hiLmw moeten laten zien.

Als je de getty die je wilt niet hebt, controleer dan andere distributies en de vreemdeling programma om te converteren tussen RPM- en Debian-pakketten. De broncode kan worden gedownload van Getty Software.

Als u geen modembesturingslijnen gebruikt (als u bijvoorbeeld alleen het minimumaantal van 3 geleiders gebruikt: verzenden, ontvangen en gemeenschappelijke signaalgrond), moet u dit laten weten via een "lokale" vlag. Het formaat hiervan hangt af van de getty die je gebruikt.

Getty sluit af na inloggen (en kan respawnen)

Nadat je bent ingelogd zul je merken (door "top", "ps -ax" of "ptree" te gebruiken) dat het getty-proces niet langer actief is. Wat is er mee gebeurd? Waarom herstart getty opnieuw als je shell wordt gedood? Dit is waarom.

Nadat je je gebruikersnaam hebt ingetypt, haalt getty het op en roept het inlogprogramma het jouw gebruikersnaam op. Het getty-proces wordt vervangen door het inlogproces. Het inlogproces vraagt ​​om uw wachtwoord, controleert het en start het proces dat in uw wachtwoordbestand is gespecificeerd. Dit proces is vaak de bashshell. Als dat zo is, start bash en vervangt het inlogproces. Merk op dat het ene proces het andere vervangt en dat het bash-shell-proces oorspronkelijk begon als het getty-proces. De implicaties hiervan zullen hieronder worden uitgelegd.

In het bestand / etc / inittab wordt getty nu respawt (herstart) als het wordt gedood. Het zegt het op de lijn die getty roept. Maar als de bash-shell (of het inlogproces) wordt gedood, krijgt getty respawns (herstart). Waarom? Nou, zowel het inlogproces als bash zijn vervangingen voor getty en erven

* Text Terminal How-To Index

de signaalaansluitingen vastgesteld door hun voorgangers. Als u de details in acht neemt, zult u merken dat het vervangingsproces hetzelfde proces-ID heeft als het oorspronkelijke proces. Dus bash is een beetje getty in vermomming met hetzelfde proces-ID-nummer. Als bash wordt gedood, is het net of getty is vermoord (hoewel getty niet meer draait). Dit resulteert in getty respawning.

Wanneer men uitlogt, worden alle processen op die seriële poort gedood inclusief de bash-shell. Dit kan ook gebeuren (indien ingeschakeld) als een ophangingssignaal wordt verzonden naar de seriële poort door een druppel DCD-spanning door de modem. Ofwel logout of drop in DCD resulteert in getty respawning. Je kunt getty naar respawn forceren door bash (of login) handmatig te doden door op de k-toets te drukken, enz. Terwijl je in "top" staat of met de opdracht "kill". Je zult het waarschijnlijk moeten doden met signaal 9 (wat niet kan worden genegeerd).

Als getty wordt uitgevoerd vanaf de opdrachtregel: programma's worden gestopt

Normaal gesproken moet getty van binnenuit worden uitgevoerd / Etc / inittab en niet van de opdrachtregel, anders kunnen sommige programma's die op de terminal worden uitgevoerd, onverwacht worden opgeschort (gestopt). Dit is de reden (ga naar het volgende gedeelte als het waarom niet belangrijk voor je is). Als u getty start voor bijvoorbeeld ttyS1 vanaf de opdrachtregel van een andere terminal, bijvoorbeeld tty1, heeft tty1 de "controlling terminal", ook al is de eigenlijke terminal waarop ttyS1 wordt uitgevoerd. Het heeft dus de verkeerde controleterminal. Maar als het in het inittab-bestand is gestart, heeft het ttyS1 als de controleterminal (correct).

Hoewel de controleterminal fout is, werkt de login op ttyS1 prima (aangezien je ttyS1 hebt gegeven als een argument voor getty). De standaard invoer en uitvoer worden op ttyS1 ingesteld, ook al blijft de besturende terminal tty11. Andere programma's die op ttyS1 worden uitgevoerd, kunnen deze standaardinvoer / -output (die is verbonden met ttyS1) erven en alles is in orde. Maar sommige programma's maken de fout om te proberen te lezen van hun controleterminal (tty1), wat fout is. Nu kan tty1 denken dat deze programma's op tty1 op de achtergrond worden uitgevoerd, dus een poging om te lezen vanaf tty1 (het had ttyS1 moeten zijn) resulteert in het stoppen van het proces dat probeerde te lezen. (Een achtergrondproces mag niet worden gelezen vanaf de controleterminal.). Mogelijk ziet u een bericht in de vorm van: "1 + gestopt"op het scherm. Op dit moment zit u vast omdat u geen interactie kunt hebben met een proces dat via de verkeerde terminal met u probeert te communiceren. Natuurlijk kunt u hieraan ontsnappen door naar een andere terminal te gaan en het proces te doden, enz. .

agetty (kan getty worden genoemd)

Een voorbeeld regel in / etc / inittab:

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

S1 is van ttyS1. 23 betekent dat getty wordt uitgevoerd bij het invoeren van runniveaus 2 of 3. respawn betekent dat getty (of een proces dat het vervangt zoals bash) wordt vermoord, getty zal automatisch opnieuw opstarten (respawn). / sbin / getty is de getty-opdracht. De -L staat voor Local (negeer modembesturingssignalen). -h (niet getoond in het voorbeeld) maakt hardwarestroombesturing mogelijk (hetzelfde als stty crtscts). 19200 is de baudrate. ttyS1 betekent / dev / ttyS1 (COM2 in MS-DOS). vt102 is het type terminal en deze getty zal de omgevingsvariabele TERM op deze waarde instellen. Er zijn geen configuratiebestanden. Typ 'init q' op de opdrachtregel na het bewerken van getty en er wordt een aanmeldprompt weergegeven.

Agetty's automatische detectie van pariteitsproblemen

De agetty programma probeert de pariteitsset binnen de terminal automatisch te detecteren (inclusief geen pariteit). Het ondersteunt geen 8-bits databytes plus 1-bit pariteit. Zie 8-bits gegevensbytes (plus pariteit). Als je gebruikt stty om pariteit in te stellen, agetty zal het automatisch uitschakelen omdat het initieel wil dat het pariteitsbit doorkomt alsof het een databit was. Dit komt omdat het het laatste bit (mogelijk een pariteitsbit) moet krijgen terwijl je je inlognaam typt, zodat het pariteit automatisch kan detecteren. Dus als u pariteit gebruikt, schakel deze dan alleen in de tekstterminal in en laat agetty automatisch detecteren en stel het op de computer. Als uw terminal pariteit ondersteunt, ziet de aanmeldingsprompt er vervormd uit tot u iets typt, zodat getty het kan detecteren

pariteit. De verminkte prompt zal bezoekers, enz. Ervan weerhouden om te proberen in te loggen. Dat zou precies kunnen zijn wat je wilt.

Er is soms een probleem met automatische detectie van pariteit. Dit gebeurt omdat nadat u eerst uw inlognaam hebt ingevoerd, agetty start de Log in programma om je in te loggen. Jammer genoeg, de Log in programma kan geen pariteit vinden, dus als het getty programma kon toen de pariteit niet bepalen Log in zal het ook niet kunnen bepalen. Als de eerste inlogpoging mislukt, Log in laat je het opnieuw proberen, etc. (allemaal met de pariteit verkeerd ingesteld). Uiteindelijk, na een aantal mislukte pogingen om in te loggen (of na een time-out) agetty zal opnieuw opstarten en de inlogsequenties opnieuw beginnen. Zodra getty opnieuw wordt uitgevoerd, kan het mogelijk de pariteit bij de tweede poging detecteren, zodat alles dan OK kan werken.

Met verkeerde pariteit, de Log in programma kan niet correct lezen wat u typt en u kunt niet inloggen. Als uw terminal ontvangen pariteit ondersteunt, blijft u een verminkt scherm zien. Als getty er niet in slaagt om pariteit te detecteren, wordt een / etc / issue-bestand meestal direct vóór de prompt naar het scherm gedumpt, zodat er meer onleesbare woorden op het scherm kunnen verschijnen.

Waarom kan pariteit niet door de eerste getypte letter worden gedetecteerd? Hier is een voorbeeld: stel dat het een 8-bits byte detecteert met zijn pariteitsbit 0 (bit van hoge orde) en met een oneven aantal 1-bits. Welke gelijkheid is het? Welnu, het oneven aantal van 1 bits impliceert dat het een oneven pariteit is. Maar het kan ook gewoon een 8-bits karakter zijn zonder pariteit. Er is geen manier tot nu toe om te bepalen welke. Maar tot nu toe hebben we de mogelijkheid van gelijkwaardigheid geëlimineerd. De detectie van pariteit verloopt dus via een eliminatieproces.

Als de volgende getypte byte overeenkomt met de eerste en ook alleen de mogelijkheid van gelijkmatige pariteit elimineert, is het nog steeds onmogelijk om de pariteit te bepalen. Deze situatie kan voor onbepaalde tijd worden voortgezet en in zeldzame gevallen zal inloggen mislukken totdat u uw inlognaam wijzigt. Als agetty een pariteitsbit van 1 vindt, zal het aannemen dat dit een pariteitsbit is en geen bit van een 8-bits bit van hoge orde. Het gaat er dus van uit dat je geen meta-tekens (hoge bitreeks) in je gebruikersnaam gebruikt (d.w.z. dat je naam in ASCII is).

Op verschillende manieren kan iemand in een "inloglus" terechtkomen. Stel dat u maar één letter of twee voor uw inlognaam typt en vervolgens op Return drukt. Als deze letters niet voldoende zijn voor pariteitsdetectie, worden aanmeldingsgegevens uitgevoerd voordat pariteit is gedetecteerd. Soms gebeurt dit probleem als u de terminal niet hebt ingeschakeld en / of verbonden wanneer agetty voor het eerst wordt opgestart.

Als u vast komt te zitten in deze "aanmeldingslus", is een uitweg om meerdere keren op de return-toets te drukken totdat u de getty-aanmeldprompt krijgt. Een andere manier is om gewoon een minuutje te wachten voor een time-out. Vervolgens wordt de getty-inlogprompt op het scherm weergegeven door het getty-programma en kunt u opnieuw proberen in te loggen.

8-bit data bytes (plus pariteit)

Helaas kan agetty deze pariteit niet detecteren.Vanaf eind 1999 heeft het geen optie voor het uitschakelen van de automatische detectie van pariteit en zal het dus een onjuiste pariteit detecteren. Het resultaat is dat het inlogproces onleesbaar wordt en dat pariteit verkeerd wordt ingesteld. Het lijkt dus niet haalbaar om 8-bits databytes met pariteit te gebruiken.

getty (onderdeel van getty_ps)

(Het meeste hiervan komt uit de oude Serial-HOWTO van Greg Hankins)Voor deze getty moet men beide vermeldingen in een configuratiebestand plaatsen en een vermelding toevoegen / Etc / inittab. Hier zijn enkele voorbeelditems die u voor uw terminal kunt gebruiken die u in het configuratiebestand hebt geplaatst / Etc / gettydefs.

Merk op dat de DT38400, DT19200, enz. Gewoon labels zijn en dezelfde moeten zijn die u gebruikt / Etc / inittab.

Als je wilt, kun je het maken getty druk interessante dingen af ​​in de login-banner. In mijn voorbeelden heb ik de systeemnaam en de seriële regel afgedrukt. U kunt andere dingen toevoegen: blockquote

schaduw = yes

Wanneer je klaar bent met bewerken / Etc / gettydefs, u kunt controleren of de syntaxis correct is door te doen:

Zorg dat er geen andere is getty of uugetty configuratiebestand voor de seriële poort waarop uw terminal is aangesloten, zoals (/etc/default/{uu}getty.ttySN of /etc/conf.{uu}getty.ttySN), omdat dit waarschijnlijk invloed heeft op het hardlopen getty op een terminal. Verwijder dergelijke conflicterende bestanden als ze worden afgesloten.

Bewerk je / Etc / inittab bestand om uit te voeren getty op de seriële poort (vervangen door de juiste informatie voor uw omgeving - poort, snelheid en standaardterminaltype):

Op dit moment ziet u een aanmeldingsprompt op uw terminal. Misschien moet u op de terugweg drukken om de aandacht van de terminal te trekken.

mgetty

De "m" staat voor modem. Dit programma is voornamelijk bedoeld voor modems en vanaf medio 2000 zal opnieuw compileren nodig zijn om het te gebruiken voor tekstterminals (tenzij u hardwarestroombesturing gebruikt - en dat meestal een handgemaakte kabel vereist). Raadpleeg de sectie "Direct" van de handleiding voor de documentatie voor direct aangesloten terminals: mgetty.texi.

Kijk naar de laatste regels van /etc/mgetty/mgetty.config voor een voorbeeld van het configureren voor een terminal. Tenzij u "toggle-dtr nee" zegt, zal het denken dat u een modem heeft en de DTR-pin op de pc laat vallen (teniet doen) in een vergeefse poging om de niet-bestaande modem opnieuw in te stellen. In tegenstelling tot andere gettys, zal mgetty zichzelf niet aan een terminal vastmaken totdat iemand een willekeurige toets van die terminal raakt, zodat je een a zult zien? voor de terminal in top of ps totdat dit gebeurt. Het logt in / Var / log / mgetty / kan enkele waarschuwingsberichten weergeven die alleen van toepassing zijn op modems die u mogelijk negeert.

Hier is een voorbeeld van de eenvoudige regel die u invoert / Etc / inittab: