Automatyczne logowanie użytkownika w Linuksie
Jakiś czas temu reanimowałem starego laptopa. Zainstalowałem tam system Manjaro. Stanąłem przed pozornie błahym problemem. Chciałem, by po uruchomieniu komputera następowało automatyczne logowanie na użytkownika „user” i do środowiska graficznego, jednak po wylogowaniu ze środowiska miało następować przejście do konsolowego ekranu logowania. System miał być pozbawiony menadżera wyświetlania.
Automatyczne uruchomienie środowiska
Gdy zaloguję się na konto „user” z konsoli pierwszej, ma nastąpić automatyczne uruchomienie środowiska graficznego. W dokumentacji XFCE znalazłem prostą sztuczkę. Do pliku /home/user/.bashrc
wystarczy wpisać taki skrypt:
if [ "$(tty)" = "/dev/tty1" ] ; then startxfce4 fi
Po zalogowaniu się z konsoli innej niż pierwsza środowisko nie uruchomi się samo.
Automatyczne zalogowanie użytkownika
Po uruchomieniu systemu ma zostać samoczynnie zalogowany użytkownik „user”. Tutaj znów pomaga dokumentacja, lecz tym razem Arch Linuksa — przykład konfiguracji programu getty. Wystarczy wydać polecenie systemctl edit getty@tty1
i zapisać w pliku takie ustawienie:
[Service] ExecStart= ExecStart=-/usr/bin/agetty --autologin <nazwa_uzytkownika> --noclear %I $TERM
Wszystko fajne działa, jest jednak jedno „ale”. Gdy wyloguję się ze środowiska graficznego, wracam do konsoli. Dodatkowo gdy wyloguję się w konsoli, natychmiast system loguje mnie ponownie, a nie o to chodziło.
Usprawnienie działania wylogowania
Po pierwsze, w skrypcie podanym na początku należy dodać polecenie exit
:
if [ "$(tty)" = "/dev/tty1" ] ; then startxfce4 exit fi
To jednak nie rozwiązuje problemu samoczynnego zalogowania zaraz po wylogowaniu. Po przeprowadzeniu dłuższego procesu myślowego oraz przejrzeniu zasobów Internetu udało mi się odnaleźć rozwiązanie. Uruchamiamy raz jeszcze systemctl edit getty@tty1
, by tym razem wskazać ścieżkę do własnego skryptu:
[Service] ExecStart= ExecStart=-/opt/autologin_service.sh %I $TERM
Lokalizacja jest dowolna. Skrypt w /opt/autologin_service.sh
ma zaś taką postać:
#!/bin/bash # Automatically log in „user” in first 60 seconds after system boot. # Otherwise run standard „agetty” command and show log in prompt. # This script should be used by systemd service only. # Trick based on this article from Arch Linux wiki: # https://wiki.archlinux.org/index.php/Automatic_login_to_virtual_console working_time=$(expr substr "$(cat /proc/uptime)" 1 "$(expr "$(expr index "$(cat /proc/uptime)" .)" - 1)") if [ $working_time -lt 60 ] then exec /bin/agetty --autologin user --noissue --noclear $1 $2 else exec /bin/agetty --noclear $1 $2 fi
Dzięki tym działaniom po uruchomieniu komputera nastąpi automatyczne zalogowanie na wskazane konto i uruchomienie z jego poziomu środowiska graficznego, ale po wylogowaniu ze środowiska użytkownik zostanie zupełnie wylogowany i ukaże się konsolowy ekran logowania.
Jak to działa? Skrypt pobiera ze ścieżki /proc/uptime
liczbę sekund, która upłynęła od uruchomienia komputera. W zależności od niej albo uruchamiane jest polecenie logujące samoczynnie użytkownika „user” albo to odpowiedzialne za zwyczajny ekran logowania.
Jeżeli wylogujesz się przed upłynięciem 60 sekund od uruchomienia komputera, sztuczka ujawni swą lukę i nie zadziała. ;-) Łatwo to naprawić. Wystarczy zamiast korzystać z czasu działania systemu, stworzyć w skrypcie choćby pusty plik w /tmp
i sprawdzać jego istnienie. Efekt będzie taki sam, a problem ten zniknie. Ja jednak wolałem uniknąć tworzenia zbędnych plików, dlatego wybrałem taką formę.
Komentarze (2)
winek
Ładnie.
krzysztof
Super wszystko. tyle że tam gdzie jest nazwa_użytkownika wpisujemy bez tych znaków Z dwie godziny się męczyłem. Poza tym właśnie tego szukałem :)
Dodaj komentarz