Jak zmusić użytkowników do wylogowania się, w Linuksie?

Tagi: , , , , , ,
Kategoria:

tux_kajdanki.png

Napisałem skrypt w Bashu, który zmusi wszystkich zalogowanych użytkowników do wylogowania się. Musiałem napisać, ponieważ mój skrypt do robienia automatycznych kopi zapasowych, o którym pisałem w Anacron + Tar = automat do robienia kopii zapasowych, wykłada się, gdy użytkownik robi coś w archiwizowanych katalogach. Użytkownik pewnie by się wylogował... gdyby pamiętał, że akurat tego dnia jest robiona kopia zapasowa.

Problem polega na tym, że użytkownik może być zalogowany na kilku terminalach tekstowych i na jednym graficznym, więc nie możemy ograniczyć powiadamiania tylko do jednego ostatnio używanego terminala, a tak by było w przypadku komendy wall. Ja chcę mieć pewność, że użytkownik mnie zauważy niezależnie od tego, co robi i że mnie posłucha (czyli się wyloguje).

glowny_skrypt.sh:
#!/bin/sh

command="xterm -e sh -c 'dialog --title "BACKUP SYSTEMU!" --backtitle "BACKUP SYSTEMU!" --msgbox "Wyloguj sie, robiona jest kopia zapasowa systemu i utworz plik /root/ready" 7 45;';";

no_root=1;
while [ $no_root != 0 -o ! -f '/root/ready' ]; do

Mamy tu początek pętli while, której zadaniem jest męczenie użytkowników dopóki dopóty nie istnieje plik /root/ready lub jest zalogowany co najmniej jeden zwykły użytkownik. Można tu jeszcze zauważyć zmienną command, którą dopiero później wykorzystamy.

	no_root=0;
	who > /root/temp;
	pies=`gawk -f s_gawk /root/temp`;
	lines=${pies##* };
	i=0;
	while [ $i -lt $lines ]; do

Liczba użytkowników zostaje ustawiona na 0. Wynik polecenia who, który może wyglądać tak, jest zapisywana do pliku /root/temp. Na tym pliku z kolei wykonuje swoje działanie skrypt gawka s_gawka (który później omówię), a jego wynik zapisywany jest do zmiennej pies (sorki za nazwę zmiennej ;) ). Do zmiennej lines zapisywane są znaki znajdujące się po ostatniej spacji w zmiennej pies - liczba linii w pliku /root/temp. Rozpoczynana pętlę wewnętrzną, która wykona się tyle razy, ile jest linii.

		echo $i;
	
		user=${pies%% *};
		echo $user;
		pies=${pies#* };

Znaki znajdujące się przed pierwszą spacji zapisywane są do zmiennej user i następnie w pies usuwamy te znaki.

		terminal=${pies%% *};
		echo $terminal;
		pies=${pies#* };

Tutaj tak samo jak powyżej, znaki przed pierwszą spacją do zmiennej terminal i następnie w pies usuwane są te znaki.

		display=${pies%% *};
		display=${display%%)};
		display=${display##(};
		echo $display;
		pies=${pies#* };

Do zmiennej display wstawiane są znaki znajdujące się przed pierwszą spacją, później usuwane są znaki '(' ')' z początku i końca zmiennej display i mamy numer wyjścia X-ów. Zmienna pies skracana jest o te znaki.

		if [ $user != "root" ]; then
			no_root=1;
		fi

Jeśli nasz użytkownik nie nazywa się "root", to zmienną no_root ustawiamy na 1.

		if [ $terminal = "tty7" ]; then
			export DISPLAY=$display
			su -c "$command" $user;
		else
			echo "BACKUP SYSTEMU! Wyloguj sie, robiona jest kopia zapasowa systemu i utworz plik /root/ready" > /root/temp1;
			write $user $terminal < /root/temp1;
		fi
		i=$((i+1));
	done

Jeśli terminal to tty7 (zazwyczaj graficzny używany przez X-y) to użytkownika zostanie podenerwowany okienkiem (na odpowiednim DISPLAY), jeśli natomiast jest to zwykły terminal, to zostanie podenerwowany przez wiadomość wysłaną na terminal (niezwykle denerwujące jak się używa elinks, MC lub innych z tekstowym GUI :D ).

	rm /root/temp1;
	sleep 120;

Usuwany jest plik tymczasowy i użytkownik ma 120 sekund spokoju.

done
rm /root/temp;
rm /root/ready;

Kończona jest praca, skrypt usuwa niepotrzebne pliki. Po tym kodzie możemy np. dodać kod odpowiedzialny za robienie kopi zapasowej.

Teraz pora na nasz skrypt napisany w gawku. Jest on bardzo prosty ;) BEGIN wykonuje się na początku wykonania skryptu, END na końcu skryptu, a środek dla każdego wiersza. W zmiennej licznik przechowywana jest ilość liczby wierszy, którą drukujemy na końcu. Dla każdego wiersza drukujemy wartości pól 1, 2, 5 oddzielone spacją, wiersze od siebie również są oddzielane spacją.

s_gawk:
BEGIN { licznik = 0 } 
{printf "%s %s %s ", $1, $2, $5}
{licznik=licznik+1} 
END { printf "n%d",licznik }

Podsumowanie

Pewnie zastanawiasz się, po jaką cholerę napisałem ten wpis. Najważniejszym powodem jest to, że stworzenie go zajęło mi dużo czasu, czyli jest to coś, czym warto się pochwalić. Drugim jest to, że skrypt pokazuje potęgę podstawowych narzędzi Linuksa. No i bym zapomniał, chciałem się po prostu podzielić wiedzą i przydatnym skryptem, który pewnie będzie wiele razy wykorzystywany.

Jeśli spodobał ci się wpis, zasubkrybuje kanał RSS

«Blog Day 2010
Potęga kokosa»
Podobne wpisy



1 komentarz»

godlark napisał 10 Września 2010 o 20:30

Eeeh... artykuł jest już tak długo, a nikt go nie skomentował?
A Ty jaką masz opinię, o tym co napisałem?

Roznica szesc i jeden
Nick
Email (będzie ukryty)
Webpage