Wyświetlanie danych przy logowaniu – skrypt

Po dość długiej przerwie nareszcie mam trochę czasu, zeby coś dodać na bloga :).

Poniższy skrypt uruchamiany jest u mnie przy kazdym logowaniu, ale można go takze ręcznie uruchomić. Wyświetla on kilka użytecznych informacji, tj. data ostatniego logowania, czas trwania sesji, ilość wolnego miejsca itp. Skrypt ten działa w powłoce linuksowej bash.

W trakcie opisywania tego skryptu, dojrzałem kilka błędów, które nie są zbyt uciążliwe, ale jakby ktoś chciał je poprawic, to zachęcam do tego. Jak ktoś podrzuci poprawki, to wrzucę je na bloga, lub jak sam znajde czas, to sprobuje to poprawić.

Znalezione błędy:
zmienna uptimeInt – po przekroczeniu roku (w sekundach), licznik się przekręca i pokazuje uptime 0d, 0h, 0m i 0s. Trzeba użyc innej funkcji (innej, niż strftime) do zamiany sekund, lub zrobić warunek, sprawdzajacy, czy minął juz rok i wykonać dodatkowe obliczenia, wyliczajace ilość lat.

Linia STILL LOGGED IN – jak użytkownik loguje się do X-ów (u mnie przy użyciu kdm), to zamiast numeru konsoli, pokazuje :0. Spowodowane to jest tym, ze polecenie last nie pokazuje w tej sytuacji kolumny z numerem konsoli i skrypt uważa następną kolumnę (kolumna z adresem ip, lub wpisem :0) za numer konsoli i wyswietla wpis :0 jako numer konsoli, do ktorej uzytkownik jest wciaz zalogowany

Poniżej zamieszczam zrzut ekranu po uruchomieniu skryptu podczas logowania, a także kod skryptu i skrypt do ściągnięcia w postaci archiwum tar:

skrypt_logowanie

Kod skryptu:

#!/bin/bash

#pobranie numeru konsoli na ktorej aktualnie jestesmy zalogowani(np. /dev/pts/8)
currentShell=`tty`

#Pobranie daty, kiedy ostatni raz byl zalogowany dany uzytkownik (np. Fri 22 Mar)
lastLoginDate=`last|grep $USER|head -n 2|tail -n 1|awk '{print $4 " " $6 " " $5}'`

#Pobranie czasu, kiedy ostatni raz byl zalogowany dany uzytkownik. W sytuacji, gdy dany uzytkownik wciaz jest zalogowany,
#to obok godziny zalogowania, wyswietla sie napis "still logged in" (np. 19:25   still logged in).
#Gdy uzytkownik nie jest juz zalogowany, to sie wyswietli godzina zalogowania,
#wylogowania i czas trwania sesji (np. 21:22 - 21:23  (00:00)). Czas trwania sesji nie jest zbyt dokladny,
#gdyz nie uwzglednia sekund
lastLoginTime=`last|grep $USER|head -n 2|tail -n 1|cut -c 51-`

#Pobranie numeru konsoli, na ktorej byl zalogowany dany uzytkownik podczas ostatniego zalogowania (np. pts/8)
lastLoginTty=`last|grep $USER|head -n 2|tail -n 1|awk '{print $2}'`

#Pobranie adresu IP, spod ktorego dany uzytkownik logowal sie podczas ostaniego zalogowania (np. 192.168.22.33).
#W sytuacji, gdy logowanie nastapilo z lokalnej konsoli, to zamiast adresu sieciowego, wyswietli sie napis ":0"
lastLoginAddress=`last|grep $USER|head -n 1|tail -n 1|awk '{print $3}'`


#UPTIME-sekcja odpowiedzialna za pobranie informacji odnosnie czasu, jaki uplynal od ostatniego uruchomienia
#pobranie daty i godziny o ktorej zostal uruchomiony komputer (np. 2013-03-22 17:49)
lastRestartTime=`who -b | awk '{print $3 " " $4}'`

#Pobranie z pliku /proc/uptime informacji o ilosci sekund jakie uplynely od uruchomienia systemu (np. 15445.60)
uptimeSeconds=`cat /proc/uptime | awk '{print $1}'`
#Ilosc sekund pobrana z pliku /proc/uptime (np. 15445.60) musi zostac zamieniona na wartosc calkowita (np. 15445),
#gdyz wiekszosc programow konsolowych nie lubi liczb zmiennoprzecinkowych i moga pojawic sie problemy.
#Wartosc "15445.60" jest dzielona na dwie czesci oddzielone kropka i zapisywana do tablicy "seconds"
IFS=. read -r -a seconds <<< "$uptimeSeconds"
#Przypisanie do zmiennej secondsInt pierwszego elementu z tablicy "seconds".
#Jest to czesc calkowita (np. 15445) liczby zmiennoprzecinkowej pobranej z pliku /proc/uptime (np. 15445.60)
secondsInt=${seconds[0]}

#Zamiana sekund(np. 15445) na dni, godziny, minuty i sekundy.
#Szczegoly w dokumentacji: http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html (funkcja strftime)
#sekundy->sekundy(0-59)
uptimeSec=`echo | awk '{print strftime("%S", '$secondsInt' , 1)}'`
#sekundy->minuty(0-59)
uptimeMin=`echo | awk '{print strftime("%M", '$secondsInt' , 1)}'`
#sekundy->godziny(0-23)
uptimeHour=`echo | awk '{print strftime("%H", '$secondsInt' , 1)}'`

#sekundy->dni(1-365)
uptimeDayTmp=`expr echo | awk '{print strftime("%j", '$secondsInt' , 1)}'`
#Zmniejszenie o 1 zmiennej "uptimeDayTmp", zeby wskazywala wlasciwa ilosc dni
uptimeDay=`expr $uptimeDayTmp - 1`

#przypisanie do zmiennej "uptime" czasu jaki uplynal od uruchomienia systemu i daty kiedy system zostal uruchomiony.
#Tekst w zmiennej jest odpowiednio sformatowany. Minusem rozwiazania ktore zastosowalem, jest to, ze po przekroczeniu roku,
#licznik sie przekreci i bedzie pokazywal od 0, czyli po roku czasu, bedzie pokazywalo, ze uptime wynosi 0 dni, godzin, minut i sekund
uptime=`echo $uptimeDay"d "$uptimeHour":"$uptimeMin":"$uptimeSec `" ( last boot: "$lastRestartTime" )"
#UPTIME

#Ilosc otwartych konsol na ktorych jest zalogowany aktualny uzytkownik (np. 7)
numberOfUsers=`last| grep -P "^$USER[\S\s]{1,}still logged in{1}\s{1,}$"|wc -l`
#Numery konsol na ktorych jest zalogowany aktualny uzytkownik (np. pts/9 pts/7 pts/4 pts/3 pts/2 pts/1 pts/0)
tty=`last| grep -P "^$USER[\S\s]{1,}still logged in{1}\s{1,}$"|awk '{print $2}'|tr '\n' ' '`

#urzadzenia ktore chcemy monitorowac pod wzgledem ilosci wolnego miejsca.
firstDevice="/dev/sda5"	#partycja root
secondDevice="/dev/sda6"	#partycja home

#Pobranie ilosci wolnego miejsca dla pierwszego i drugiego urzadzenia. Ta wartosc bedzie wyswietlona bezposrednio,
#w formacie ulatwiajacym szybkie zrozumienie, bez koniecznosci konwersji. Bedzie pokazylo ilosc wolnego miejsca w GB,
#jak jest wolne conajmniej 1 GB dysku, natomiast jak jest mniej niz GB, to bedzie pokazywalo w MB i td
freeSpaceFirst=`df -h|grep $firstDevice|awk '{print $4}'`
freeSpaceSecond=`df -h|grep $secondDevice|awk '{print $4}'`

#Pobranie ilosci wolnego miejsca dla pierwszego i drugiego urzadzenia. Wartosc bedzie pokazana w bajtach.
#Uzyte to jest podczas rysowania paska postepu (program dbar). Pokazuje on ile jest wolnego miejsca w postaci znakow ASCII.
#Zrobione to jest tak, gdyz dane ze zmiennych "freeSpaceFirst" i "freeSpaceSecond" pokazuja dane mniej precyzyjnie,
#a co za tym idzie, pasek postepu by nie pokazywal zmian, gdyby zmiany byly zbyt male.
freeSpaceFirstByte=`df|grep $firstDevice|awk '{print $4}'`
freeSpaceSecondByte=`df|grep $secondDevice|awk '{print $4}'`


#Pobranie ilosci zajetego miejsca dla pierwszego i drugiego urzadzenia. Wartosc w bajtach. ZMIENNE OBECNIE NIE UZYWANE
usedSpaceFirstByte=`df|grep $firstDevice|awk '{print $3}'`
usedSpaceSecondByte=`df|grep $secondDevice|awk '{print $3}'`

####################################################################
#Obliczenie jaka sumaryczna pojemnosc ma dana partycja. Wersja dla nowszych i starszych wersji basha. ZMIENNE OBECNIE NIE UZYWANE

#Dodawanie/mnozenie itp liczb (dziala tylko na nowszych wersjach basha). w nawiasach mozna takze inkrementowac liczby(Sekcja "Wyrażenia") -> http://wazniak.mimuw.edu.pl/index.php?title=%C5%9Arodowisko_programisty/Bash_-_pisanie_skrypt%C3%B3w
#Jest to rozwiazanie szybsze i mniej pamieciozerne, gdyz jest interpretowane bezposrednio przez Basha, a nie jest uruchamiane osobne polecenie expr
#((totalSpaceFirstByte=$freeSpaceFirstByte\+$usedSpaceFirstByte))
#((totalSpaceSecondByte=$freeSpaceSecondByte \+ $usedSpaceSecondByte))


#Dodawanie/mnozenie itp liczb (wersja dla starszych wersji basha)
totalSpaceFirstByte=`expr $freeSpaceFirstByte + $usedSpaceFirstByte`
totalSpaceSecondByte=`expr $freeSpaceSecondByte + $usedSpaceSecondByte`
####################################################################

#Obliczenie  Ile jest zajetego miejsca na danej partycji i zamiana tej wartosci na wartosc procentowa. ZMIENNE OBECNIE NIE UZYWANE
#Wykonywanie operacji artmetycznych na liczbach zmiennoprzecinkowych
usedSpaceFirstBytePercent=`echo "($usedSpaceFirstByte/$totalSpaceFirstByte)*100" | bc -l`
usedSpaceSecondBytePercent=`echo "($usedSpaceSecondByte/$totalSpaceSecondByte)*100" | bc -l`

#Obliczenie  Ile jest wolnego miejsca na danej partycji i zamiana tej wartosci na wartosc procentowa.
#Wykonywanie operacji artmetycznych na liczbach zmiennoprzecinkowych
freeSpaceFirstBytePercent=`echo "($freeSpaceFirstByte/$totalSpaceFirstByte)*100" | bc -l`
freeSpaceSecondBytePercent=`echo "($freeSpaceSecondByte/$totalSpaceSecondByte)*100" | bc -l`


#######################
#Wyswietlenie zawartosci zmiennych poustawianych we wczesniejszych liniach.
#######################
#Linia DATE/TIME/WEEK - formatowanie daty zaczyna sie od znaku + (plusa) i dalej sie wpisuje zadane informacje jakie chce sie pobrac (godzina, minuta, sekunda, rok itp).
#Jak jakas zmienna moze miec wartosc dwu, lub trzycyfrowa, to wpisujac znak - (minus) pomiedzy znakiem % (procent), a zmienna (np zmienna "W" wyswietlajaca numer tygodnia moze miec dwie cyfry),
#nakazujemy programowani date wyswietlenie samej liczby, bez zer napoczatku, czyli jak jest np 7 tydzien, to wpisujac "%-W", wyswietli sie sama wartosc "7", a wpisujac %W, wyswietli sie "07"
#wiecej informacji na temat formatowania mozna uzyskac w manualu, wpisujac w konsoli "man date".

#echo -ne - parametr "-e" nakazuje poleceniu echo interpretacje znakow spcjalnych pomiedzy podwojnymi cudzyslowamia np. znak tabulacji (\t), znak powrotu karetki (\r).
#parametr "-n" nakazuje poleceniu echo usuniecie znaku nowej linii po wyswietleniu tekstu. Normalnie, echo po wyswietleniu tekstu przenosi kursor do nastepnej linii, a uzywajac "-n",
#kursor jest ustawiany po ostatnim wyswietlonym znaku, a co za tym idzie, uzywajac nastepnym razem polecenia echo, tekst wyswietli sie zaraz po poprzednim tekscie w tej samej linii

#Linia FREE SPACE - wyswietlenie ilosci wolnego miejsca na danej partycji pod postacia B/KB/MB/GB itd, a takze w postaci procentowej na pasku postepu.
#Pasek postepu wyswietla sie przy uzyciu programu dbar. Program dbar musi otrzymac dane z programu echo przez potok (znak | ). Wiecej informacji o programie dbar,
#mozna uzyskac w manualu, wpisujac w konsoli "man dbar"
echo " -------------------------------------------------------"
echo "    USER:			$USER ($currentShell)"
echo "    LAST LOGIN:			$lastLoginTty ( $lastLoginAddress ), $lastLoginDate, $lastLoginTime"
echo "    STILL LOGGED IN ($USER):	$numberOfUsers shells ( $tty)"
echo " --"
echo "    DATE:			`date '+%A %-d %B %Y'`"
echo "    TIME:			`date '+%k:%M:%S'`"
echo "    WEEK:			`date '+%-W'` tydzien `date '+%Y'` roku"
echo " --"
echo "    UPTIME:			$uptime"
echo " --"
echo -ne "    FREE SPACE(root):		$freeSpaceFirst \t| "; echo "$freeSpaceFirstBytePercent 0 100" | dbar -w 40 -s "="
echo -ne "    FREE SPACE(backup):		$freeSpaceSecond \t| "; echo "$freeSpaceSecondBytePercent 0 100" | dbar -w 40 -s "="
echo " -------------------------------------------------------"
echo

Skrypt do ściągnięcia:
logowanie.tar

This entry was posted in Programowanie, Skrypty i programy and tagged , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

five − 5 =