Automatisches Login per USB-Stick
Login für mehrere Benutzer mit pamusb
Ziel dieses Artikels ist es, sich durch einen USB-Stick zu identifizieren und danach automatisch eingeloggt zu werden, inklusive Start der grafischen Benutzeroberfläche.
Skript zur Überprüfung
Das Skript heißt loginusb2 und wird in /usr/local/bin angelegt. Warum es loginusb2 heißen muss, wird gleich erklärt.
Das Skript sieht folgendermaßen aus (hier mit einem Beispiel für die Display-Manager KDM und GDM). Es steht als loginusb2_normal zum Download bereit.
#!/bin/bash IFS=" " Y=1 while [ $Y == 1 ]; do for X in `grep "<user id=" /etc/pamusb.conf | cut -d "\"" -f 2 | cut -d "\"" -f 1`; do if [ $X != "root" ] && [ $X != "scox" ]; then pamusb-check --quiet $X if [ $? == 0 ]; then Y=2 killall S99zloginusb kill `pidof fbi` <strong>#Beispiel-Konfiguration für den Display-Manager kdm:</strong> sed -i "s/\(^AutoLoginUser=\).*/\1$X/" /etc/kde3/kdm/kdmrc sed -i "s/\(^NoPassUser=\).*/\1$X/" /etc/kde3/kdm/kdmrc sed -i "s/\(^NoPassEnable=\).*/\1true/" /etc/kde3/kdm/kdmrc sed -i "s/\(^AutoLoginEnable=\).*/\1true/" /etc/kde3/kdm/kdmrc sed -i "s/\(^AutoLoginLocked=\).*/\1false/" /etc/kde3/kdm/kdmrc /etc/init.d/kdm start & <strong>#Beispiel-Konfiguration für den Display-Manager gdm:</strong> sed -i "s/\(^AutoLoginUser=\).*/1$X/" /etc/gdm/gdm.conf-custom sed -i "s/\(^AutoLoginEnable=\).*/1true/" /etc/gdm/gdm.conf-custom /etc/init.d/gdm start & else sleep 2 fi fi done; done;
Dieses Skript macht Folgendes: Zuerst wird die Datei /etc/pamusb.conf geöffnet und die dort registrierten Benutzer werden ausgelesen. Jetzt wird mit Hilfe des Programmes pamusb-check getestet, ob einer der registrierten Benutzer seinen USB-Stick an den Computer angeschlossen hat. Dies wird durch eine Endlosschleife immer wieder geprüft.
Hat sich dann ein Benutzer erfolgreich identifiziert, wird der Display-Manager vorbereitet. D.h. in der Konfigurationsdatei wird der Autologin aktiviert und der Autologin Benutzer eingetragen. Letztendlich wird der Display-Manger gestartet und das Skript beendet sich.
Nicht vergessen, die Datei ausführbar zu machen: chmod +x /usr/local/bin/loginusb2
Nun ergibt sich ein Problem: Wenn das Skript zuerst gestartet wird, kann man fbi zum Anzeigen des Bildes erst starten, wenn das Skript fertig ist. Wenn das Skript fertig ist, ist der Login aber schon vollzogen, das Bild also sinnlos.
Andersherum ist es ähnlich. Da fib ein Programm ist, wird das nachfolgende Programm in der init-Liste erst gestartet, wenn man fib beendet. Auch das ist nicht Sinn der Sache. Also werden das Login-Skript und fbi über ein zweites Skript im Hintergrund gestartet (das muss auf diese Weise gelöst werden, da man init-Skripte nicht im Hintergrund starten kann).
Dafür legen wir die Datei /usr/local/bin/loginusb anlegen, machen sie ausführbar und schreiben folgendes hinein:
#!/bin/bash /usr/local/bin/loginusb2 & while true; do fbi --noverbose /root/loginusb.jpg done
Die while-Schleife fängt den Fall ab, dass ein Benutzer fbi mit [q] beendet. In dieser Situation wird es einfach wieder neu gestartet.
Damit das Skript beim Starten ausgeführt wird, muss es in das init-System integriert werden (das z nach S99 ist wichtig, damit das Skript als letztes gestartet wird!):
ln -s /usr/local/bin/loginusb /etc/rc2.d/S99zloginusb
Ohne Framebuffer
Das Ganze geht auch ohne Framebuffer, wenn man ein anderes Aussehen bevorzugt. Zuerst muss der Link /etc/rc2.d/S99zloginusb auf loginusb2 zeigen und nicht auf loginusb:
ln -s /usr/local/bin/loginusb<b>2</b> /etc/rc2.d/S99zloginusb
Zweitens muss loginusb2 bearbeitet werden. Da fbi nicht mehr gestartet wird, muss es auch nicht beendet werden. Außerdem sollte noch eine kurze Nachricht erscheinen, damit der Benutzer weiß, was passiert. Das Resultat steht als loginusb2_ohne_fb zum Download bereit.
#!/bin/bash IFS=" " Y=1 clear echo "Willkommen" echo "Bitte identifizieren Sie sich mit Ihrem USB-Stick!" echo "Warte auf USB-Stick..." while [ $Y == 1 ]; do for X in `grep "<user id=" /etc/pamusb.conf | cut -d "\"" -f 2 | cut -d "\"" -f 1`; do if [ $X != "root" ] && [ $X != "scox" ]; then pamusb-check --quiet $X if [ $? == 0 ]; then Y=2 echo "USB-Stick identifiziert. Sie werden angemeldet..." <strong>#Beispiel-Konfiguration für den Display-Manager kdm:</strong> sed -i "s/\(^AutoLoginUser=\).*/\1$X/" /etc/kde3/kdm/kdmrc sed -i "s/\(^NoPassUser=\).*/\1$X/" /etc/kde3/kdm/kdmrc sed -i "s/\(^NoPassEnable=\).*/\1true/" /etc/kde3/kdm/kdmrc sed -i "s/\(^AutoLoginEnable=\).*/\1true/" /etc/kde3/kdm/kdmrc sed -i "s/\(^AutoLoginLocked=\).*/\1false/" /etc/kde3/kdm/kdmrc /etc/init.d/kdm start & <strong>#Beispiel-Konfiguration für den Display-Manager gdm:</strong> sed -i "s/\(^AutoLoginUser=\).*/1$X/" /etc/gdm/gdm.conf-custom sed -i "s/\(^AutoLoginEnable=\).*/1true/" /etc/gdm/gdm.conf-custom /etc/init.d/gdm start & else sleep 2 fi fi done; done;
Natürlich muss der Eintrag vga= wieder aus der Kernel-Zeile raus, ebensowenig braucht man für diese Methode das Programm fbi.
Ubuntu/Kubuntu: Konsolen manuell starten
Zuerst müssen die Konsolen aus upstart entfernt werden. Dazu werden die Startskripte einfach in den Backupordner unter /root/backup verschoben:
mv /event.d/tty1 /root/backup mv /event.d/tty2 /root/backup mv /event.d/tty3 /root/backup mv /event.d/tty4 /root/backup mv /event.d/tty5 /root/backup mv /event.d/tty6 /root/backup
Nun werden die Konsolen nicht mehr automatisch gestartet. Da natürlich nicht auf sie verzichtet werden kann, müssen sie manuell gestartet werden. Dies geschieht in /usr/local/bin/loginusb2, das hier als loginusb2_mit_getty zum Download bereitsteht.
#!/bin/bash IFS=" " Y=1 while [ $Y == 1 ]; do for X in `grep "<user id=" /etc/pamusb.conf | cut -d "\"" -f 2 | cut -d "\"" -f 1`; do if [ $X != "root" ] && [ $X != "scox" ]; then pamusb-check --quiet $X if [ $? == 0 ]; then Y=2 killall S99zloginusb kill `pidof fbi` <strong>getty 38400 tty1 &</strong> <strong>getty 38400 tty2 &</strong> <strong>getty 38400 tty3 &</strong> <strong>getty 38400 tty4 &</strong> <strong>getty 38400 tty5 &</strong> <strong>getty 38400 tty6 &</strong> <strong>#Beispiel-Konfiguration für den Display-Manager kdm:</strong> sed -i "s/\(^AutoLoginUser=\).*/\1$X/" /etc/kde3/kdm/kdmrc sed -i "s/\(^NoPassUser=\).*/\1$X/" /etc/kde3/kdm/kdmrc sed -i "s/\(^NoPassEnable=\).*/\1true/" /etc/kde3/kdm/kdmrc sed -i "s/\(^AutoLoginEnable=\).*/\1true/" /etc/kde3/kdm/kdmrc sed -i "s/\(^AutoLoginLocked=\).*/\1false/" /etc/kde3/kdm/kdmrc /etc/init.d/kdm start & <strong>#Beispiel-Konfiguration für den Display-Manager gdm:</strong> sed -i "s/\(^AutoLoginUser=\).*/1$X/" /etc/gdm/gdm.conf-custom sed -i "s/\(^AutoLoginEnable=\).*/1true/" /etc/gdm/gdm.conf-custom /etc/init.d/gdm start & else sleep 2 fi fi done; done;
Jetzt sollten die Konsolen erst starten, wenn die Identifikation durch den Benutzer erfolgreich war!
Danksagungen und letzte Hinweise
Nun sollte eigentlich alles funktionieren.
Bedanken möchte ich mich an dieser Stelle bei folgenden Personen, die mir beim Erstellen dieses Artikels geholfen haben: Gerrit, yaccin und mreczio!
Der ursprüngliche und möglicherweise aktuellere Artikel liegt auf virtualpixel.de. Falls noch irgendwelche Fragen bestehen, einfach die Kommentarfunktion dort nutzen oder mir eine E-Mail schicken!

