Automatyczne logowanie użytkownika w Linuksie

Kategoria: Oprogramowanie Data publikacji: 2 komentarze

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)

  1. 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