Shell script-el kapcsolatos információ kérés

Fórumok

a problémám a következő:
adott 1 feladat:
írjon egy shell-t, ami az első paraméterben megadott felhasználók (max 5 db) bejelentkezését figyeli a 2. paraméterben megadott időközönként.
Ha ez megtörténik levelet küld az administrator - nevű felhasználónak amelynek a tárgya: " Felhasznalo: XY be van jelentkezve: DATUM".
adott 1 megoldás:
HIBA=128
case $# in
0|1) echo -e "Használat: $0 felhasználó1 [felhasználó2..5] -fPP\n\tLegalább egy felhasználót meg kell adnod\n\t-f:hány percenként (PP=0-59) ellenőrizze a felhasználókat"
exit $HIBA
;;
esac

a="+administrator+"
u="+$(users)+"

if [ "$(echo \" ${u// /+ +}]\" | cut -f2- -d\ | tr ' ' '\n' | grep -n $a | cut -f1 -d: )" = "" ]
then
echo Nincs administrator nevű felhasználó a rendszerben
exit $HIBA
fi
if [ "$(echo $@ | grep -v '\-f')" != "" ]
then
echo Nem adtál meg frissítési időközt -fPP paraméter
exit $HIBA
fi

for arg in "$@"
do
if [ "${arg:0:2}" = -f ] && [ "${arg:2:1}" != _ ]
then
if [ "$(echo ${arg:2:2} | grep -v '[0-5][0-9]')" != "" ]
then
echo "A perceket nem megfelelően adtad meg!!!"
exit $HIBA
fi
prg=$0
if [ "${prg:0:2}" = ./ ]
then prg=${prg:2}
fi
perc="*/${arg:2:2}"
if [ "$perc" = */00 ]
then perc="*"
fi
tmp=$(echo "$*" | sed "s/$arg//")
cmd="$perc * * * * $(pwd)/$prg $tmp -f_"
echo "$cmd" > crntb
crontab crntb
rm -f crntb
exit 0
fi
done
usrs=$(echo "$*" | sed "s/-f_//")

for usr in $(users)
do
a="+$usr+"
c=$(echo " +${usrs// /+ +}" | cut -f2- -d\ | tr ' ' '\n' | grep -n $a | cut -f1 -d: )
if [ "$c" != "" ]
then
mail -s "Top Secret Agent" administrator <
A megfigyelt személy $usr be van jelentkezve !!!
EZEGYLEVEL
fi
done
exit 0
kérésem:
szeretnék egy konkrét elemzést a megoldásra
- pl mit csinál a case ciklus, hogyan működik a for, melyek a változók...
- melyik részét lehetne egyszerűbben...
- asszem a dátum a mail-ből kimaradt, hogyan lehetne beletenni...
sajnos, bár több programozási nyelvben általában elboldogulok a
megvalósítások megértésével, ez a része feladja a leckét

Hozzászólások

Ránézésre akkora marhaságok (*) vannak benne, hogy a helyedben keresnék egy másik megoldást és azt akarnám beadás előtt megérteni.

Persze lehet, inkább megírni kéne magadnak.

(*) Hőzöngőknek:
pl. crontab fájl felülkefélése vakon isteni megoldás, de mi van, ha van userkémnek _fontos_ dolog a meglevő crontabjában
pl2. a mail küldése biztos nem így van az eredetiben; vagy csak elrontottad a c'n'p-et, vagy már eleve szarul van megírva.

(Jól sejtem, hogy megint itt a vizsgaidőszak és jönnek a beugrókat megoldatók? )

"- pl mit csinál a case ciklus, hogyan működik a for, melyek a változók..." - a case ciklusra én is kiváncsi lennék..

-------------------
2.6.17-gentoo-r4

RTM: Brian W. Kernigham - Rob Pike: A Unix operációs rendszer (Mûszaki könyvkiadó) Az korábbi kiadások szürke, az azt követők narancsszinű borítóval jelentek meg.

A megoldásra egy ötlet:


#!/usr/bin/bash

if [ "$BASH_ARGC" -lt "2" ]
then
echo "Keves argumentum"
exit -1
fi

userek=$(($BASH_ARGC-1))
timestep=$(echo $@ | sed 's/\ /\|/g' | cut -d\| -f$BASH_ARGC)
greppar=$(echo $@ | sed 's/\ /\|/g' | cut -d\| -f1,$userek)
while :
do
 lista=$(who | egrep "$greppar" )
 if [ "$lista" ]
   echo $lista | mail -s "Felhasznalo: be van jelentkezve: $(date)" administrator
 fi
 sleep $timestep
done

Tőled azért elvártam volna egy kevéssé bash-specifikus megvalósítást :-(
$BASH_ARGC nagyon szép, de $# minden egyéb elterjedtnek nevezhető shell-ben megy. exit -1 tökéletes, de tekintve, hogy státusz kód, javasolnám a 0-255 (esetleg 0-127, régebbi rendszerekkel való kompatibilitás okán) tartományban beállítani, akkor nem lesz gond a program használatával egyéb UNIX(-like) rendszerek esetén sem. (Egy előjeltelen értéket előjelesen beállítani, no az okozhat kellemetlenséget.)

Igazad van mester, de nézz az időpontra, hogy mikor írtam (tudom, nem mentség, de lassan, ahogy öregszem, egyre kevésbé vagyok éjszakai bagoly). A $# miatt szégyenlem is magam, az exit -1 -et meg szépen 255-tel honorálja a $? (ahol néztem), bár való igaz, hogy szebb/rugalmasabb az unsigned 7 bites érték.

most csak nekem furcsanak a feladat?
mondjuk el tudom kepzelni, hogy ilyenre szuksege legyen valakinek, de ha hosszu tavon szeretnem figyelni a felhasznalokat, akkor a login.conf/.profile/pam-ot piszkalnam, mert egy event alapu megoldas megiscak jobb, mint egy endless loop :)

--
The Internet has evolved from smart people in front of dumb terminals to dumb people in front of smart terminals.

sziasztok,

haverom épp most vizsgázik, és kért egy kis segítséget. scrip írásban nagyon nem vagyok jártas, ezért én tőletek kérnék segítséget.

a feladata, hogy készítsen egy scriptet, ami kiírja, hogy a következő 7-es busz mikor jön.
addig ok hogy wget-el vagy lynx-el lekapom a bkv oldaláról (http://www.bkv.hu/busz/7gyors.html), de az már nem tiszta, hogy hogy szedjem ki, hogy a következő mikor jön.

ha tudtok, légyszíves sos segítsetek, épp bent ül a vizsgán :D

Gondolom outdated a dolog, de a date tud olyan kimenetet, ami az órát és percet tartalmazza egybeírva "óópp" formában. A menetrendi adatokat ugyanilyen formára alakítod, numerikusan megszortolod, aztán sorban megnézed a menetrendi adatokat, hogy melyik az első, amelyik nagyobb az aktiális "óópp" számnál.

Persze, hogy nem érted. Irtó gány. Sztem keress más feladatot, amiből jobban tanulhatsz.
--
hup.user.js