Automatisches Einloggen eines Users auf einer Workstation
Autor: Karsten Kruse
Wer eine Linux-Workstation sein Eigen nennt weiss, dass er sich einloggen muss. Dazu werden der Username und
das Passwort eingegeben, ein Vorgang der auf einer ohnehin nur von einem benutzen Workstation mitunter
lästig und ermüdend werden kann. Zwar gibt es Displaymanager die das automatische Login eines Users erlauben,
wie zum Beispiel kdm
, doch nicht jeder möchte sich einen solchen installieren; was bringt sonst die schöne,
schnelle Hardware wenn der Bootvorgang von einem Displaymanager verlangsamt wird.
Diese Anleitung macht also nur Sinn, wenn der User sich nicht grafisch per xdm/gdm/kdm
einloggt sondern
auf einem nackten tty
(auch bekannt als Konsole) und später die grafische Benutzeroberfläche
mit startx
startet.
Wichtig: Wenn deine Workstation in einem öffentlich zugänglichem Raum steht, sollte ein automatisierter Login aus Sicherheitsgründen nicht eingestellt werden.
Der Loginvorgang auf einer Linux-Workstation sieht normalerweise folgendermaßen aus:
init
liest die Datei /etc/inittab
und startet das Programm das für das
angegebene tty
(auch schlicht Konsole genannt) eingetragen ist. In den meisten Fällen ist
das getty
oder ein Programm mit ähnlicher Funktion.getty
startet login
.login
wartet auf die Eingabe von Usernamen und Passwort eines Benutzers und startet
seine Shell aus /etc/passwd
mit den Rechten des Users.Ein einfacher Weg einen User automatisch einzuloggen ist login
mit den richtigen Parametern
zu starten. Mit -f username
wird die Authentifikation übersprungen, login
nimmt
an, dass der User schon sein Passwort eingegeben hat.
Um das für einen User zu erledigen, könnte man es direkt in /etc/inittab
eintragen, je nach
init
-Version kommt es dann aber zu Problemen mit dem Einlesen der /etc/inittab
.
Deswegen schreiben wir ein kurzes Wrapper-Programm um das Kommando in /etc/inittab
zu
vereinfachen. So sieht es aus:
/* * teclogin.c * Karsten Kruse 2002 - tecneeq(at)tecneeq(dot)de * This code is in the Public Domain * */ #include <unistd.h> int main() { execlp( "login", "login", "-f", "username", 0); return 0; }
Für username
wird der Benutzer eingetragen, der automatisch eingeloggt werden soll. Dieses
Programm wird mit folgendem Kommando übersetzt:
gcc -Os -Wall -static -o /tmp/teclogin_username /tmp/teclogin.c
Das neue Programm /tmp/teclogin_username
wird nach /usr/local/sbin
kopiert und
in /etc/inittab
beim gewünschten tty
(üblicherweise tty1
) als
Argument für getty
eingetragen. Mein Benutzername ist karsten
, die Zeile in
/etc/inittab
sieht bei meinem Linux normalerweise so aus:
c1:12345:respawn:/sbin/agetty tty1 linux
Nach dem Eintragen des neuen Programms sieht sie so aus:
c1:12345:respawn:/sbin/agetty -n -l /usr/local/sbin/teclogon_karsten tty1
Ich befehle meinem getty
(in diesem Fall agetty
) also einfach nur mit den
Parametern -n -l /usr/local/sbin/teclogon_karsten
, dass er mein neues Programm starten soll, das
neue Programm startet dann login
mit den Parametern die benötigt werden um den Benutzer
karsten
automatisch einzuloggen.
Das wäre alles, nach einem Reboot würde der User auf tty1
angemeldet sein und könnte sofort
loslegen.
teclogin_install.sh
downloaden und ausführenDies wäre nicht Newbie-Net wenn wir nicht einen halbautomatischen Weg hätten um das ganze abzukürzen.
Dazu wurde das Script download/teclogin_install.sh
geschrieben. Das Script legt die Quelldatei für
teclogin_username.c
an, kompiliert und installiert es, und schlägt am Ende vor wie die
änderung in /etc/inittab
aussehen sollte. Das Script sollte als root
aufgerufen
werden, der einzige Parameter den das Script kennt ist der Username der automatisch eingeloggt werden
soll.
Hier sind die Kommandos die nötig wären um das Script auszuführen (nach dem downloaden ausführbar machen,
root
-Rechte erlangen, Script starten):
user@host:~> chmod +x teclogin_install.sh user@host:~> su Password: root@host:~> ./teclogin_install.sh karsten
Schliesslich rufen wir noch einen Editor auf um die vorgeschlagene Zeile die
teclogin_install.sh
ausgegeben hat in /etc/inittab
einzutragen:
root@host:~> mcedit /etc/inittab
Das wars, wenn ich teclogin_install.sh
richtig geschrieben habe und du die vorgeschlagene
Zeile in /etc/inittab
richtig eingetragen hast sollte alles fertig sein und beim nächsten
Reboot wird der Benutzer automatisch eingeloggt. Sollte das nicht der Fall sein, oder du willst du den
Benutzer nicht mehr automatisch einloggen, gehst du auf ein anderes tty
(z.B. mit der
Tastenkombination STRG+ALT+2
) und machst die Änderung in /etc/inittab
rückgängig.
Nach eine Reboot sollte der Benutzer jetzt automatisch eingeloggt werden. Wenn du, wie ich, die
grafische Benutzeroberfläche mit startx
starten würdest, könntest du das in eines deiner
Shell-Startscripte eintragen.
Ich benutze bash
als Loginshell und ein guter Platz um die grafische Benutzeroberfläche zu
starten wäre die Datei ~/.bashrc
. Da wir nur startx
ausführen wollen wenn wir
automatisch eingeloggt werden müssen wir eine Abfrage bauen. Diese Abfrage vergleicht die Ausgabe von
stty
mit einem Wert den wir ermitteln indem wir von Hand einmal tty
in der
Konsole aufrufen auf der wir automatisch eingeloggt wurden. Die Ausgabe könnte so aussehen:
user@host:~> tty /dev/vc/1
Mein Eintrag am Ende von ~/.bashrc
würde dann folgendermassen aussehen:
# Folgendes nur ausführen wenn wir uns interaktiv eingeloggt haben if [ "$PS1" ] ; then # Folgendes nur ausführen wenn die Variable $DISPLAY nicht gesetzt # ist und das tty "/dev/vc/1" ist if [ -z "$DISPLAY" ] && [ $(tty) = /dev/vc/1 ]; then startx fi fi
Rebooten wir jetzt, sollte der Benutzer automatisch eingeloggt werden und es startet sofort die grafische Benutzeroberfläche.
Ich hoffe alles hat bei dir so reibungslos funktioniert wie bei mir. Bei Problemen oder Fragen könnt ihr wie üblich den Chat, den Newsserver, das Forum oder die Mailingliste im Newbie-Net besuchen.
Karsten Kruse (tecneeq(at)tecneeq(dot)de) live aus dem Land des binären Weihwassers für www.Newbie-Net.de und www.Pro-Linux.de ... ich gebe zurück ins Studio ;)