Skip to main content

Text-terminaler på Linux - 14,1 Getty (används i / etc / inittab)

Shell Scripting Tutorial for Beginners 8 - Logical 'AND' Operator (Juni 2026)

Shell Scripting Tutorial for Beginners 8 - Logical 'AND' Operator (Juni 2026)
Anonim

14.1 Getty (används i / etc / inittab)

Introduktion till Getty

För att få en inloggningsprocess att köras på en seriell port (och terminalen ansluten till den) när datorn startar (eller byter körnivåer) måste ett getty-kommando läggas i filen / etc / inittab. Att köra Getty från kommandoraden kan orsaka problem (se Om Getty kör från kommandoraden: Programmen blir stoppade för att se varför). Getty får en TTY (en terminal) går. Varje terminal behöver sitt eget getty-kommando. Det finns också minst ett getty-kommando för konsolen i varje / etc / inittab-fil. Hitta detta och sätt getty-kommandon för de riktiga terminalerna bredvid den. Den här filen kan innehålla exempel getty linjer för textterminaler som kommenteras så att allt du behöver göra är att uncomment dem (ta bort ledande #) och ändra några argument.

Argumenten som är tillåtna beror på vilken getty du använder:Två gettys bästa för direktanslutna terminaler är:

  • agetty (ibland bara kallad getty): Mycket lätt att sätta upp. Inga konfigurationsfiler. Se agetty
  • getty (del av getty_ps)

Två gettys bästa för inbyggda modem (undvik för direktanslutna terminaler) är:

  • mgetty: det bästa för modemer; fungerar för terminaler också men sämre
  • uugetty: endast för modem del av getty_ps-paketet

Enkla gettys att använda om du inte använder en riktig textterminal. De flesta Linux-användare använder en av dessa på sin bildskärm:

  • mingetty
  • fbgetty
  • fgetty
  • rungetty

Din Linux-distribution kan komma med antingen ps_getty eller agetty för text-terminaler. Vissa distributioner levererar inte heller. Tyvärr kallar de ofta bara "getty" så det kan hända att du måste bestämma vilken du har sedan de argument du lägger efter i / etc / inittab skiljer sig åt. Debian använder agetty (i util-Linux-paketet). RedHat och Fedora använde ps_getty som är på: ps_getty

Som en sista utväg för att försöka bestämma vilken getty du har, kan du kolla in den exekverbara koden (vanligtvis i / sbin). ps_getty har / etc / gettydefs inbäddade i denna kod. För att söka efter det, gå till / sbin och skriv:strängar getty | grep getty Om getty är faktiskt agetty ovan kommer det att resultera i ingenting. Men om du har agetty typing:getty -hbör visa alternativen -hiLmw.

Om du inte har getty vill du kolla andra utdelningar och utomjording program för att konvertera mellan RPM och Debian-paket. Källkoden kan laddas ner från Getty Software.

Om du inte använder modemstyrningslinjer (till exempel om du bara använder minsta antal 3 ledare: sänd, ta emot och gemensam signal mark) ska du låta getty veta detta med hjälp av en "lokal" flagga. Formatet av detta beror på vilken getty du använder.

Getty utgångar efter inloggning (och kan respawn)

Efter att du loggat in kommer du att märka (med "top", "ps -ax" eller "ptree") att getty-processen inte längre körs. Vad hände med det? Varför startar Getty igen om ditt skal dödas? Här är varför.

När du har skrivit in ditt användarnamn tar Getty det och kallar inloggningsprogrammet vilket säger ditt användarnamn. Getty-processen ersätts av inloggningsprocessen. Inloggningsprocessen frågar efter ditt lösenord, kontrollerar det och startar vad som helst som anges i din lösenordsfil. Denna process är ofta bash-skalet. I så fall startar bash och ersätter inloggningsprocessen. Observera att en process ersätter en annan och att bash shell processen ursprungligen startade som getty-processen. Följderna av detta kommer att förklaras nedan.

Nu i filen / etc / inittab, ska Getty respawn (omstart) om den dödas. Det står så på linjen som kallar getty. Men om bash-skalet (eller inloggningsprocessen) dödas, respekterar Getty (omstartar). Varför? Tja, både inloggningsprocessen och bash är ersättare för getty och arv

* Text Terminal How-To Index

signalförbindelserna etableras av sina föregångare. Faktum är att om du observerar detaljerna märker du att ersättningsprocessen kommer att ha samma process ID som den ursprungliga processen. Således är bash slags getty i förklädnad med samma process ID-nummer. Om bash dödas är det precis som getty blev dödad (även om getty inte kör längre). Detta resulterar i getty respawning.

När en loggar ut, dödas alla processer på den seriella porten, inklusive bash-skalet. Detta kan också hända (om det är aktiverat) om en uppkopplingssignal skickas till seriell port med en droppe DCD-spänning av modemet. Antingen utloggningen eller droppen i DCD kommer att resultera i getty respawning. Man kan tvinga Getty att respawn genom att manuellt döda bash (eller inloggning) antingen genom att trycka på k-tangenten etc. under "topp" eller med "död" -kommandot. Du kommer sannolikt att behöva döda den med signal 9 (som inte kan ignoreras).

Om Getty kör från kommandoraden: Programmen blir stoppade

Du bör normalt köra Getty från insidan / Etc / inittab och inte från kommandoraden, annars kan vissa program som körs på terminalen vara oväntat avstängd (stoppad). Här är varför (Hoppa till nästa avsnitt om varför är inte viktigt för dig). Om du börjar getty för att säga ttyS1 från kommandoraden i en annan terminal, säg tty1, då kommer den att ha tty1 som dess "controlling terminal", trots att den faktiska terminalen den körs på är ttyS1. Således har den fel kontrollterminal. Men om det är startat inutabelfilen så kommer det att ha ttyS1 som kontrollterminal (korrekt).

Även om den kontrollerande terminalen är fel, fungerar inloggningen hos ttyS1 bra (eftersom du gav ttyS1 som ett argument till getty). Standardinmatningen och utgången är inställda på ttyS1 trots att kontrollterminalen förblir tty11. Andra program som körs på ttyS1 kan ärva denna standardinmatning / utgång (som är ansluten till ttyS1) och allt är OK. Men vissa program kan göra misstaget att försöka läsa från sin kontrollterminal (tty1) vilket är fel. Nu kan tty1 tro att dessa program körs i bakgrunden av tty1 så ett försök att läsa från tty1 (det borde ha varit ttyS1) resulterar i att stoppa processen som försökte läsa. (En bakgrundsprocess får inte läsa från sin kontrollterminal.). Du kan se ett meddelande som något liknande: "1 + Stoppad"på skärmen. Vid den här tiden är du fast eftersom du inte kan interagera med en process som försöker kommunicera med dig via fel terminal. Naturligtvis att fly från detta kan du gå till en annan terminal och döda processen etc .

agetty (kan kallas getty)

Ett exempel linje i / etc / inittab:

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

S1 är från ttyS1. 23 betyder att getty körs när man går in i körnivå 2 eller 3. respawn innebär att om getty (eller en process som ersätter den som bash) dödas, kommer gettyget automatiskt att starta (respawn) igen. / sbin / getty är getty kommandot. -L betyder Local (ignorera modemstyrsignaler). -h (inte visat i exemplet) möjliggör maskinflödesstyrning (samma som strikta kretsar). 19200 är baudräntan. ttyS1 betyder / dev / ttyS1 (COM2 i MS-DOS). vt102 är typen av terminal och denna getty ställer in miljövariabel TERM till detta värde. Det finns inga konfigurationsfiler. Skriv "init q" på kommandoraden efter redigering av getty och du bör se en inloggningsprompning.

Agetty auto-detektering av paritetsproblem

De agetty programmet försöker att automatiskt identifiera paritetsuppsättningen inom terminalen (inklusive ingen paritet). Den stöder inte 8-bits databytor plus 1-bitars paritet. Se 8-bits databytor (plus paritet). Om du använder stty att sätta paritet, agetty kommer automatiskt att stänga av det eftersom det initialt vill att paritetsbiten ska komma igenom som om det var en databit. Detta beror på att den behöver den sista biten (eventuellt en paritetsbit) när du skriver ditt inloggningsnamn så att det kan automatiskt detektera paritet. Således om du använder paritet, aktivera den bara inuti textterminalen och låt agetty auto-upptäcka det och ställa in det på datorn. Om din terminal stöder mottagen paritet kommer inloggningsprompten att bli förvrängd tills du skriver något så att Getty kan upptäcka

paritet. Den skräpade prompten kommer att avskräcka besökare etc. från att försöka logga in. Det kan vara precis vad du vill ha.

Det är ibland ett problem med automatisk detektering av paritet. Detta händer eftersom du först skriver ditt inloggningsnamn, agetty startar logga in program för att avsluta loggar in dig. Tyvärr, den logga in programmet kan inte upptäcka paritet så om getty programmet lyckades inte bestämma pariteten då logga in kommer inte heller att kunna bestämma det. Om det första inloggningsförsöket misslyckas, logga in kommer att låta dig försöka igen, etc. (alla med pariteten satt fel). Så småningom, efter ett antal misslyckade försök att logga in (eller efter en timeout) agetty kommer att starta igen och starta inloggningssekvenserna igen. När getty körs igen kan det vara möjligt att upptäcka pariteten vid det andra försöket så allting kan då fungera OK.

Med fel paritet, den logga in programmet kan inte läsa korrekt vad du skriver och du kan inte logga in. Om din terminal stöder mottagen paritet fortsätter du att se en skräpad skärm. Om getty misslyckas med att upptäcka paritet dumpas en / etc / issue-fil vanligtvis till skärmen strax innan prompten, så det kan visas mer skräpade ord på skärmen.

Varför kan det inte vara lätt att upptäcka paritet med det första bokstävet? Här är ett exempel: Antag att det upptäcker en 8-bit byte med sin paritetsbit 0 (högorderbit) och med ett udda antal 1-bitar. Vilken paritet är det? Jo, det udda antalet 1 bitar innebär att det är udda paritet. Men det kan också bara vara en 8-bitig karaktär utan paritet. Det finns inget sätt så långt att bestämma vilken. Men hittills har vi eliminerat möjligheten till jämn jämlikhet. Detekteringen av paritet fortsätter sålunda genom en elimineringsprocess.

Om den nästa byte typen liknar den första och också bara eliminerar möjligheten till jämn paritet är det fortfarande omöjligt att bestämma paritet. Denna situation kan fortsätta på obestämd tid och i sällsynta fall kommer inloggningen att misslyckas tills du ändrar ditt inloggningsnamn. Om agetty finner en paritetsbit på 1 antas det att detta är en paritetsbit och inte en högordningsbit i en 8-bitars tecken. Det förutsätter sålunda att du inte använder meta-tecken (hög bit uppsättning) i ditt användarnamn (det vill säga att ditt namn är i ASCII).

Man kan komma in i en "login loop" på olika sätt. Antag att du bara skriver ett bokstäver eller två för ditt inloggningsnamn och sedan slår tillbaka. Om dessa bokstäver inte är tillräckliga för paritetsdetektering, har inloggningsrutinerna före paritet upptäckts. Ibland händer detta problem om du inte har terminalen på och / eller ansluten när agetty först börjar.

Om du fastnar i den här "inloggningsslingan" är det ett sätt att dra tillbaka returnyckeln flera gånger tills du får Getty login prompt. Ett annat sätt är att bara vänta en minut eller så för en timeout. Då kommer getty login prompt sätta på skärmen av getty programmet och du kan försöka igen att logga in.

8-bitars databytor (plus paritet)

Tyvärr kan agetty inte upptäcka denna paritet.I slutet av 1999 har det inte någon möjlighet att inaktivera automatisk detektering av paritet och därmed detektera felaktig paritet. Resultatet är att inloggningsprocessen blir förvrängd och pariteten kommer att ställas in fel. Således verkar det inte vara möjligt att försöka använda 8-bitars databytor med paritet.

getty (del av getty_ps)

(Det mesta av detta är från den gamla Serial-HOWTO av Greg Hankins)För den här getty måste man både lägga in poster i en konfigurationsfil och lägga till en post i / Etc / inittab. Här är några exempel som ska användas för din terminal som du lägger in i konfigurationsfilen / etc / gettydefs.

Observera att DT38400, DT19200 etc. är bara etiketter och måste vara samma som du använder / Etc / inittab.

Om du vill kan du göra getty skriv ut intressanta saker i inloggningsbannern. I mina exempel har jag systemnamnet och serienummeret skrivet ut. Du kan lägga till andra saker: blockquote

skugga = yes

När du är redo att redigera / etc / gettydefs, kan du verifiera att syntaxen är korrekt genom att göra:

Se till att det inte finns någon annan getty eller uugetty config-fil för den seriella porten som din terminal är ansluten till såsom (/etc/default/{uu}getty.ttySN eller /etc/conf.{uu}getty.ttySN), eftersom detta förmodligen kommer att störa driften getty på en terminal. Ta bort sådana motstridiga filer om de lämnar.

Redigera din / Etc / inittab fil att köra getty på seriell port (ersätter rätt information för din miljö - port, hastighet och standardterminal):

Vid denna tidpunkt bör du se en inloggningsprompning på din terminal. Du kanske måste slå tillbaka för att få terminalens uppmärksamhet.

mgetty

"M" står för modem. Detta program är främst för modem och från och med mitten av 2000 kommer det att kräva omkompilering för att använda det för textterminaler (om du inte använder maskinflödesstyrning - och det kräver vanligtvis en handgjord kabel). För dokumentationen för direktanslutna terminaler, se avsnittet "Direkt" i handboken: mgetty.texi.

Titta på de sista raderna av /etc/mgetty/mgetty.config för ett exempel på att konfigurera den för en terminal. Om du inte säger "switch-dtr-nr" kommer det att tro att du har ett modem och släpp (neger) DTR-pin på datorn för ett förgäves försök att återställa det obefintliga modemet. I motsats till andra gettys kommer inte mgetty att ansluta sig till en terminal tills någon träffar någon nyckel i den terminalen så att du får se en? för terminalen i topp eller ps tills detta händer. Loggarna i / Var / log / mgetty / kan visa några varningsmeddelanden som bara gäller för modem som du kan ignorera.

Här är ett exempel på den enkla raden du lägger in / Etc / inittab: