{"id":491,"date":"2014-02-20T23:32:20","date_gmt":"2014-02-20T22:32:20","guid":{"rendered":"https:\/\/blog.pawel.usermd.net\/?p=491"},"modified":"2023-03-25T01:10:08","modified_gmt":"2023-03-25T00:10:08","slug":"wyswietlanie-danych-przy-logowaniu-skrypt","status":"publish","type":"post","link":"https:\/\/blog.ck.waw.pl\/index.php\/2014\/02\/20\/wyswietlanie-danych-przy-logowaniu-skrypt\/","title":{"rendered":"Wy\u015bwietlanie danych przy logowaniu &#8211; skrypt"},"content":{"rendered":"\n<p>Po do\u015b\u0107 d\u0142ugiej przerwie nareszcie mam troch\u0119 czasu, zeby co\u015b doda\u0107 na bloga :).<\/p>\n\n\n\n<p>Poni\u017cszy skrypt uruchamiany jest u mnie przy kazdym logowaniu, ale mo\u017cna go takze r\u0119cznie uruchomi\u0107. Wy\u015bwietla on kilka u\u017cytecznych informacji, tj. data ostatniego logowania, czas trwania sesji, ilo\u015b\u0107 wolnego miejsca itp. Skrypt ten dzia\u0142a w pow\u0142oce linuksowej bash.<\/p>\n\n\n\n<p>W trakcie opisywania tego skryptu, dojrza\u0142em kilka b\u0142\u0119d\u00f3w, kt\u00f3re nie s\u0105 zbyt uci\u0105\u017cliwe, ale jakby kto\u015b chcia\u0142 je poprawic, to zach\u0119cam do tego. Jak kto\u015b podrzuci poprawki, to wrzuc\u0119 je na bloga, lub jak sam znajde czas, to sprobuje to poprawi\u0107.<\/p>\n\n\n\n<p>Znalezione b\u0142\u0119dy:<br \/><strong>zmienna uptimeInt<\/strong> &#8211; po przekroczeniu roku (w sekundach), licznik si\u0119 przekr\u0119ca i pokazuje uptime 0d, 0h, 0m i 0s. Trzeba u\u017cyc innej funkcji (innej, ni\u017c strftime) do zamiany sekund, lub zrobi\u0107 warunek, sprawdzajacy, czy min\u0105\u0142 juz rok i wykona\u0107 dodatkowe obliczenia, wyliczajace ilo\u015b\u0107 lat.<\/p>\n\n\n\n<p><strong>Linia STILL LOGGED IN<\/strong> &#8211; jak u\u017cytkownik loguje si\u0119 do X-\u00f3w (u mnie przy u\u017cyciu 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\u017ca nast\u0119pn\u0105 kolumn\u0119 (kolumna z adresem ip, lub wpisem :0) za numer konsoli i wyswietla wpis :0 jako numer konsoli, do ktorej uzytkownik jest wciaz zalogowany<\/p>\n\n\n\n<p>Poni\u017cej zamieszczam zrzut ekranu po uruchomieniu skryptu podczas logowania, a tak\u017ce kod skryptu i skrypt do \u015bci\u0105gni\u0119cia w postaci archiwum tar:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.ck.waw.pl\/wp-content\/uploads\/2014\/02\/skrypt_logowanie.jpg\" alt=\"skrypt_logowanie\" class=\"wp-image-504\"\/><\/figure><\/div>\n\n\n<p><strong>Kod skryptu:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"Bash\" class=\"language-Bash\">#!\/bin\/bash\n\n#pobranie numeru konsoli na ktorej aktualnie jestesmy zalogowani(np. \/dev\/pts\/8)\ncurrentShell=`tty`\n\n#Pobranie daty, kiedy ostatni raz byl zalogowany dany uzytkownik (np. Fri 22 Mar)\nlastLoginDate=`last|grep $USER|head -n 2|tail -n 1|awk &#039;{print $4 &quot; &quot; $6 &quot; &quot; $5}&#039;`\n\n#Pobranie czasu, kiedy ostatni raz byl zalogowany dany uzytkownik. W sytuacji, gdy dany uzytkownik wciaz jest zalogowany,\n#to obok godziny zalogowania, wyswietla sie napis &quot;still logged in&quot; (np. 19:25   still logged in).\n#Gdy uzytkownik nie jest juz zalogowany, to sie wyswietli godzina zalogowania,\n#wylogowania i czas trwania sesji (np. 21:22 - 21:23  (00:00)). Czas trwania sesji nie jest zbyt dokladny,\n#gdyz nie uwzglednia sekund\nlastLoginTime=`last|grep $USER|head -n 2|tail -n 1|cut -c 51-`\n\n#Pobranie numeru konsoli, na ktorej byl zalogowany dany uzytkownik podczas ostatniego zalogowania (np. pts\/8)\nlastLoginTty=`last|grep $USER|head -n 2|tail -n 1|awk &#039;{print $2}&#039;`\n\n#Pobranie adresu IP, spod ktorego dany uzytkownik logowal sie podczas ostaniego zalogowania (np. 192.168.22.33).\n#W sytuacji, gdy logowanie nastapilo z lokalnej konsoli, to zamiast adresu sieciowego, wyswietli sie napis &quot;:0&quot;\nlastLoginAddress=`last|grep $USER|head -n 1|tail -n 1|awk &#039;{print $3}&#039;`\n\n\n#UPTIME-sekcja odpowiedzialna za pobranie informacji odnosnie czasu, jaki uplynal od ostatniego uruchomienia\n#pobranie daty i godziny o ktorej zostal uruchomiony komputer (np. 2013-03-22 17:49)\nlastRestartTime=`who -b | awk &#039;{print $3 &quot; &quot; $4}&#039;`\n\n#Pobranie z pliku \/proc\/uptime informacji o ilosci sekund jakie uplynely od uruchomienia systemu (np. 15445.60)\nuptimeSeconds=`cat \/proc\/uptime | awk &#039;{print $1}&#039;`\n#Ilosc sekund pobrana z pliku \/proc\/uptime (np. 15445.60) musi zostac zamieniona na wartosc calkowita (np. 15445),\n#gdyz wiekszosc programow konsolowych nie lubi liczb zmiennoprzecinkowych i moga pojawic sie problemy.\n#Wartosc &quot;15445.60&quot; jest dzielona na dwie czesci oddzielone kropka i zapisywana do tablicy &quot;seconds&quot;\nIFS=. read -r -a seconds &lt;&lt;&lt; &quot;$uptimeSeconds&quot;\n#Przypisanie do zmiennej secondsInt pierwszego elementu z tablicy &quot;seconds&quot;.\n#Jest to czesc calkowita (np. 15445) liczby zmiennoprzecinkowej pobranej z pliku \/proc\/uptime (np. 15445.60)\nsecondsInt=${seconds[0]}\n\n#Zamiana sekund(np. 15445) na dni, godziny, minuty i sekundy.\n#Szczegoly w dokumentacji: http:\/\/www.gnu.org\/software\/gawk\/manual\/html_node\/Time-Functions.html (funkcja strftime)\n#sekundy-&gt;sekundy(0-59)\nuptimeSec=`echo | awk &#039;{print strftime(&quot;%S&quot;, &#039;$secondsInt&#039; , 1)}&#039;`\n#sekundy-&gt;minuty(0-59)\nuptimeMin=`echo | awk &#039;{print strftime(&quot;%M&quot;, &#039;$secondsInt&#039; , 1)}&#039;`\n#sekundy-&gt;godziny(0-23)\nuptimeHour=`echo | awk &#039;{print strftime(&quot;%H&quot;, &#039;$secondsInt&#039; , 1)}&#039;`\n\n#sekundy-&gt;dni(1-365)\nuptimeDayTmp=`expr echo | awk &#039;{print strftime(&quot;%j&quot;, &#039;$secondsInt&#039; , 1)}&#039;`\n#Zmniejszenie o 1 zmiennej &quot;uptimeDayTmp&quot;, zeby wskazywala wlasciwa ilosc dni\nuptimeDay=`expr $uptimeDayTmp - 1`\n\n#przypisanie do zmiennej &quot;uptime&quot; czasu jaki uplynal od uruchomienia systemu i daty kiedy system zostal uruchomiony.\n#Tekst w zmiennej jest odpowiednio sformatowany. Minusem rozwiazania ktore zastosowalem, jest to, ze po przekroczeniu roku,\n#licznik sie przekreci i bedzie pokazywal od 0, czyli po roku czasu, bedzie pokazywalo, ze uptime wynosi 0 dni, godzin, minut i sekund\nuptime=`echo $uptimeDay&quot;d &quot;$uptimeHour&quot;:&quot;$uptimeMin&quot;:&quot;$uptimeSec `&quot; ( last boot: &quot;$lastRestartTime&quot; )&quot;\n#UPTIME\n\n#Ilosc otwartych konsol na ktorych jest zalogowany aktualny uzytkownik (np. 7)\nnumberOfUsers=`last| grep -P &quot;^$USER[\\S\\s]{1,}still logged in{1}\\s{1,}$&quot;|wc -l`\n#Numery konsol na ktorych jest zalogowany aktualny uzytkownik (np. pts\/9 pts\/7 pts\/4 pts\/3 pts\/2 pts\/1 pts\/0)\ntty=`last| grep -P &quot;^$USER[\\S\\s]{1,}still logged in{1}\\s{1,}$&quot;|awk &#039;{print $2}&#039;|tr &#039;\\n&#039; &#039; &#039;`\n\n#urzadzenia ktore chcemy monitorowac pod wzgledem ilosci wolnego miejsca.\nfirstDevice=&quot;\/dev\/sda5&quot;\t#partycja root\nsecondDevice=&quot;\/dev\/sda6&quot;\t#partycja home\n\n#Pobranie ilosci wolnego miejsca dla pierwszego i drugiego urzadzenia. Ta wartosc bedzie wyswietlona bezposrednio,\n#w formacie ulatwiajacym szybkie zrozumienie, bez koniecznosci konwersji. Bedzie pokazylo ilosc wolnego miejsca w GB,\n#jak jest wolne conajmniej 1 GB dysku, natomiast jak jest mniej niz GB, to bedzie pokazywalo w MB i td\nfreeSpaceFirst=`df -h|grep $firstDevice|awk &#039;{print $4}&#039;`\nfreeSpaceSecond=`df -h|grep $secondDevice|awk &#039;{print $4}&#039;`\n\n#Pobranie ilosci wolnego miejsca dla pierwszego i drugiego urzadzenia. Wartosc bedzie pokazana w bajtach.\n#Uzyte to jest podczas rysowania paska postepu (program dbar). Pokazuje on ile jest wolnego miejsca w postaci znakow ASCII.\n#Zrobione to jest tak, gdyz dane ze zmiennych &quot;freeSpaceFirst&quot; i &quot;freeSpaceSecond&quot; pokazuja dane mniej precyzyjnie,\n#a co za tym idzie, pasek postepu by nie pokazywal zmian, gdyby zmiany byly zbyt male.\nfreeSpaceFirstByte=`df|grep $firstDevice|awk &#039;{print $4}&#039;`\nfreeSpaceSecondByte=`df|grep $secondDevice|awk &#039;{print $4}&#039;`\n\n\n#Pobranie ilosci zajetego miejsca dla pierwszego i drugiego urzadzenia. Wartosc w bajtach. ZMIENNE OBECNIE NIE UZYWANE\nusedSpaceFirstByte=`df|grep $firstDevice|awk &#039;{print $3}&#039;`\nusedSpaceSecondByte=`df|grep $secondDevice|awk &#039;{print $3}&#039;`\n\n####################################################################\n#Obliczenie jaka sumaryczna pojemnosc ma dana partycja. Wersja dla nowszych i starszych wersji basha. ZMIENNE OBECNIE NIE UZYWANE\n\n#Dodawanie\/mnozenie itp liczb (dziala tylko na nowszych wersjach basha). w nawiasach mozna takze inkrementowac liczby(Sekcja &quot;Wyra\u017cenia&quot;) -&gt; http:\/\/wazniak.mimuw.edu.pl\/index.php?title=%C5%9Arodowisko_programisty\/Bash_-_pisanie_skrypt%C3%B3w\n#Jest to rozwiazanie szybsze i mniej pamieciozerne, gdyz jest interpretowane bezposrednio przez Basha, a nie jest uruchamiane osobne polecenie expr\n#((totalSpaceFirstByte=$freeSpaceFirstByte\\+$usedSpaceFirstByte))\n#((totalSpaceSecondByte=$freeSpaceSecondByte \\+ $usedSpaceSecondByte))\n\n\n#Dodawanie\/mnozenie itp liczb (wersja dla starszych wersji basha)\ntotalSpaceFirstByte=`expr $freeSpaceFirstByte + $usedSpaceFirstByte`\ntotalSpaceSecondByte=`expr $freeSpaceSecondByte + $usedSpaceSecondByte`\n####################################################################\n\n#Obliczenie  Ile jest zajetego miejsca na danej partycji i zamiana tej wartosci na wartosc procentowa. ZMIENNE OBECNIE NIE UZYWANE\n#Wykonywanie operacji artmetycznych na liczbach zmiennoprzecinkowych\nusedSpaceFirstBytePercent=`echo &quot;($usedSpaceFirstByte\/$totalSpaceFirstByte)*100&quot; | bc -l`\nusedSpaceSecondBytePercent=`echo &quot;($usedSpaceSecondByte\/$totalSpaceSecondByte)*100&quot; | bc -l`\n\n#Obliczenie  Ile jest wolnego miejsca na danej partycji i zamiana tej wartosci na wartosc procentowa.\n#Wykonywanie operacji artmetycznych na liczbach zmiennoprzecinkowych\nfreeSpaceFirstBytePercent=`echo &quot;($freeSpaceFirstByte\/$totalSpaceFirstByte)*100&quot; | bc -l`\nfreeSpaceSecondBytePercent=`echo &quot;($freeSpaceSecondByte\/$totalSpaceSecondByte)*100&quot; | bc -l`\n\n\n#######################\n#Wyswietlenie zawartosci zmiennych poustawianych we wczesniejszych liniach.\n#######################\n#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).\n#Jak jakas zmienna moze miec wartosc dwu, lub trzycyfrowa, to wpisujac znak - (minus) pomiedzy znakiem % (procent), a zmienna (np zmienna &quot;W&quot; wyswietlajaca numer tygodnia moze miec dwie cyfry),\n#nakazujemy programowani date wyswietlenie samej liczby, bez zer napoczatku, czyli jak jest np 7 tydzien, to wpisujac &quot;%-W&quot;, wyswietli sie sama wartosc &quot;7&quot;, a wpisujac %W, wyswietli sie &quot;07&quot;\n#wiecej informacji na temat formatowania mozna uzyskac w manualu, wpisujac w konsoli &quot;man date&quot;.\n\n#echo -ne - parametr &quot;-e&quot; nakazuje poleceniu echo interpretacje znakow spcjalnych pomiedzy podwojnymi cudzyslowamia np. znak tabulacji (\\t), znak powrotu karetki (\\r).\n#parametr &quot;-n&quot; nakazuje poleceniu echo usuniecie znaku nowej linii po wyswietleniu tekstu. Normalnie, echo po wyswietleniu tekstu przenosi kursor do nastepnej linii, a uzywajac &quot;-n&quot;,\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\n\n#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.\n#Pasek postepu wyswietla sie przy uzyciu programu dbar. Program dbar musi otrzymac dane z programu echo przez potok (znak | ). Wiecej informacji o programie dbar,\n#mozna uzyskac w manualu, wpisujac w konsoli &quot;man dbar&quot;\necho &quot; -------------------------------------------------------&quot;\necho &quot;    USER:\t\t\t$USER ($currentShell)&quot;\necho &quot;    LAST LOGIN:\t\t\t$lastLoginTty ( $lastLoginAddress ), $lastLoginDate, $lastLoginTime&quot;\necho &quot;    STILL LOGGED IN ($USER):\t$numberOfUsers shells ( $tty)&quot;\necho &quot; --&quot;\necho &quot;    DATE:\t\t\t`date &#039;+%A %-d %B %Y&#039;`&quot;\necho &quot;    TIME:\t\t\t`date &#039;+%k:%M:%S&#039;`&quot;\necho &quot;    WEEK:\t\t\t`date &#039;+%-W&#039;` tydzien `date &#039;+%Y&#039;` roku&quot;\necho &quot; --&quot;\necho &quot;    UPTIME:\t\t\t$uptime&quot;\necho &quot; --&quot;\necho -ne &quot;    FREE SPACE(root):\t\t$freeSpaceFirst \\t| &quot;; echo &quot;$freeSpaceFirstBytePercent 0 100&quot; | dbar -w 40 -s &quot;=&quot;\necho -ne &quot;    FREE SPACE(backup):\t\t$freeSpaceSecond \\t| &quot;; echo &quot;$freeSpaceSecondBytePercent 0 100&quot; | dbar -w 40 -s &quot;=&quot;\necho &quot; -------------------------------------------------------&quot;\necho\n<\/code><\/pre>\n\n\n\n<p><strong>Skrypt do \u015bci\u0105gni\u0119cia:<\/strong><br \/><a href=\"https:\/\/blog.ck.waw.pl\/wp-content\/uploads\/2014\/02\/logowanie.tar.bz2\">logowanie.tar<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Po do\u015b\u0107 d\u0142ugiej przerwie nareszcie mam troch\u0119 czasu, zeby co\u015b doda\u0107 na bloga :). Poni\u017cszy skrypt uruchamiany jest u mnie przy kazdym logowaniu, ale mo\u017cna go takze r\u0119cznie uruchomi\u0107. Wy\u015bwietla on kilka u\u017cytecznych informacji, tj. data ostatniego logowania, czas trwania &hellip; <a href=\"https:\/\/blog.ck.waw.pl\/index.php\/2014\/02\/20\/wyswietlanie-danych-przy-logowaniu-skrypt\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[14,24],"tags":[30,17,29],"_links":{"self":[{"href":"https:\/\/blog.ck.waw.pl\/index.php\/wp-json\/wp\/v2\/posts\/491"}],"collection":[{"href":"https:\/\/blog.ck.waw.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ck.waw.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ck.waw.pl\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ck.waw.pl\/index.php\/wp-json\/wp\/v2\/comments?post=491"}],"version-history":[{"count":7,"href":"https:\/\/blog.ck.waw.pl\/index.php\/wp-json\/wp\/v2\/posts\/491\/revisions"}],"predecessor-version":[{"id":593,"href":"https:\/\/blog.ck.waw.pl\/index.php\/wp-json\/wp\/v2\/posts\/491\/revisions\/593"}],"wp:attachment":[{"href":"https:\/\/blog.ck.waw.pl\/index.php\/wp-json\/wp\/v2\/media?parent=491"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ck.waw.pl\/index.php\/wp-json\/wp\/v2\/categories?post=491"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ck.waw.pl\/index.php\/wp-json\/wp\/v2\/tags?post=491"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}