samba Napisano Grudzień 13, 2010 Zgłoszenie Share Napisano Grudzień 13, 2010 Witam Na sambie mam udział gdzie przetrzymywane są pliki .MAP gdy osoba która ma prawo zapisu wejdzie na taki plik (programem który je otwiera) powstaje .STP czyli stop -informacja dla innych userów o zajętości pliku. Plik jest wtedy dla odczytu dla innych. Chodzi o to by jak ktoś skończy pracę i plik się zwolni aby poinformować odpowiednich userów (adresy ip lub nazwy hostów). Jak zrobić taki skrypt ? klienci to widnows XP. Do tego celu chciałbym wykorzystać smbclient (który wysyła posłańcem komunikaty na XP). Chciałbym aby skrypt przeszukiwał dany katalog np. mapa w którym są pliki .MAP. Gdy user wychodzi z niego plik .STP zostaje przeniesiony do kosza samby czyli powstaje wpis w /var/log/messages "nazwausera|nazwa_komputera|adres_IP|nazwa_udziału_samby|unlink|ok|mapa/Warszawa.STP" I na tej podstawie chciałbym aby smbclient wysyłał informację do kilku hostów o treści "plik nazwa_pliku.STP został zwolniony" Jak taki skrypt napisać? Możecie pomóc? Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
borzole Napisano Grudzień 13, 2010 Zgłoszenie Share Napisano Grudzień 13, 2010 * znalazłem niedawno taki przykład, jak natychmiast zareagować na wyczekiwany komunikat z /var/log/messages #!/bin/bash # skrypt reaguje na zamontowanie usb, przy użyciu inotify-tools while sudo inotifywait -e modify /var/log/messages &>/dev/null ; do if sudo tail -n1 /var/log/messages | grep -q 'Attached SCSI removable disk' ; then echo "USB needs love!" fi done w takim wypadku, nie musiałbyś przeszukiwać żadnych katalogów, a jedynie monitorować jeden log. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
samba Napisano Grudzień 13, 2010 Autor Zgłoszenie Share Napisano Grudzień 13, 2010 * znalazłem niedawno taki przykład, jak natychmiast zareagować na wyczekiwany komunikat z /var/log/messages #!/bin/bash # skrypt reaguje na zamontowanie usb, przy użyciu inotify-tools while sudo inotifywait -e modify /var/log/messages &>/dev/null ; do if sudo tail -n1 /var/log/messages | grep -q 'Attached SCSI removable disk' ; then echo "USB needs love!" fi done w takim wypadku, nie musiałbyś przeszukiwać żadnych katalogów, a jedynie monitorować jeden log. Dzięki za skrypt ale dalej mam problem. Dokładnie chodzi mi o tailowanie /var/log/messages aby znalazł coś takiego hubert|nazwa_kompa|10.10.10.153|geo_|unlink|ok|mapa numeryczna/warszawa/warszawa.STP i wysłał net sendem (smbclientem) informację plik warszawa.stp został zwolniony I teraz pytanie. 1)Jak do smbclienta wstawić listę IP z pliku (plik z numerami IP do których komunikat zostanie wysłany) aby komunikat został wysłany? 2) Jakiej zmiennej użyć aby nazwa pliku .STP była wpisywana dynamicznie ? tj jeśli w messages będzie |unlink|ok|mapa numeryczna/krakow/kraków.STP to net sendem ma być wysłane "krakow.stp został zwolniony" ?? jak zrobić zmienną nazwa_pliku.STP ????? Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
samba Napisano Grudzień 13, 2010 Autor Zgłoszenie Share Napisano Grudzień 13, 2010 jak powinien wyglądać skrypt który w messages znajdzie mi "hubert|nazwa_kompa|10.10.10.153|geo_|unlink|ok|mapa numeryczna/warszawa/warszawa.STP" i wyśle komunikat "plik warszawa.stp został zwolniony" (wysłanie poprzez smbclient) chyba że jest jakiś inny program który wyśle do usługi posłaniec MS. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
borzole Napisano Grudzień 13, 2010 Zgłoszenie Share Napisano Grudzień 13, 2010 małe wyjaśnienie #!/bin/bash msg='hubert|nazwa_kompa|10.10.10.153|geo_|unlink|ok|mapa numeryczna/warszawa/warszawa.STP' # ten filtr powinien wyłowić co trzeba, # jeśli nie to: man egrep echo $msg | egrep '.*\|.*\|[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\|.*\|unlink\|ok\|mapa.*STP$' # rozbicie na parametry echo $msg | awk -F'|' '{print $NF}' echo $msg | awk -F'|' '{print $(NF-3) }' echo $msg | awk -F'|' '{print $(NF-4) }' prototyp skryptu #!/bin/bash # skrypt uruchom jako root, ze względu na dostęp do /var/log/messages get_stp(){ tail -n1 /var/log/messages \ | egrep '.*\|.*\|[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\|.*\|unlink\|ok\|mapa.*STP$' } send_msg(){ plik=$( echo $1 | awk -F'|' '{print $NF}' | tr '[[:upper:]]' '[[:lower:]]' ) udzial=$(echo $1 | awk -F'|' '{print $(NF-3) }') ip=$(echo $1 | awk -F'|' '{print $(NF-4) }') pc=$(echo $1 | awk -F'|' '{print $(NF-5) }') user=$(echo $1 | awk -F'|' '{print $(NF-6) }') # dalej Ci nie pomogę, bo nie wiem jak wysłać coś przez sambę } while inotifywait -e modify /var/log/messages &>/dev/null ; do stp=$(get_stp) # warunek sprawdza, czy ciąg nie jest pusty if [ ${#stp} != 0 ] ; then # wysyłanie wiadomości wyślemy w tło, żeby spokojnie monitorować dalej ( send_msg "$stp" )& fi done Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
samba Napisano Grudzień 14, 2010 Autor Zgłoszenie Share Napisano Grudzień 14, 2010 Borzole bardzo dziękuję Ci za fachową pomoc. Ja kombinowałem w prostszy sposób ale utknąłem w 1 miejscu. Mainowicie tail -f /var/log/messages |grep unlink |grep "mapa numeryczna" |grep .STP | cut -d "|" -f2,5,7,8, jak zamiast tail -f dam cat to działa jak jest tail -f nie działa tj. nie mam nic na wyjściu. Dlaczego ? Jak to osiągnąć ? To by bardzo ułatwiło zadanie. Wyjście z cat pokazuje : sm9|unlink|mapa numeryczna/Marki/Marki.STP czyli nazwa kompa|unlink|nazwa_katalogu|nazwa_pliku.STP i taki napis byłby pożądany Teraz jeśli udałoby się dzięki tail -f wyłapać taki wpis jak powyżej musi nastąpić przekierowanie tego wyjścia do smbclient i wysłanie komunikatu wyjścia z tail poprzez smbclient czyli echo "sm9|unlink|mapa numeryczna/Marki/Marki.STP" |smbclient -M nazwa_komputera aczkolwiek nie wiem co robię źle gdyż : tail -f /var/log/messages |grep unlink |grep "mapa numeryczna" |grep .STP | cut -d "|" -f2,5,7,8, > echo "sm9|unlink|mapa numeryczna/Marki/Marki.STP" |smbclient -M sm9 nie działa Co poprawić by to działało ? małe wyjaśnienie prototyp skryptu #!/bin/bash ## tail -n1 pokazuje jednorazowo tylko ostatnią linijkę /messages natomiast tu chodzi aby skrypt monitorował kasowanie(unlink) pliku.STP przez cały czas i wysyłał komunikaty podczas godzin pracy userów. Popraw mnie jeśli się mylę?. get_stp(){ tail -n1 /var/log/messages \ | egrep '.*\|.*\|[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\|.*\|unlink\|ok\|mapa.*STP$' Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
borzole Napisano Grudzień 14, 2010 Zgłoszenie Share Napisano Grudzień 14, 2010 * "tail -n1 pokazuje jednorazowo tylko ostatnią linijkę" Tak, ale to jest nieskończona pętla while z inotifywait więc będzie działać jako demon i powiadamiać o każdych nowych plikach. Wydaje mi się, że linie do pliku /var/log/messages wpisywane są pojedynczo, więc powinno działać. Jeśli jednak pojawiałyby się blokami po kilka linii to trzeba by zmienić. Wypróbuj na razie to, jakby nie działało to wtedy pogłówkujemy. * cat / tail -f To nie jest tak, że nie działa. Polecenie cat listuje cały plik i kończy, natomiast tail -f wyświetla 10 ostatnich linii (można to sprecyzować tail -f -n 20 ) i czuwa w nieskończoność pokazując nowe linie w pliku. Zastanów się poco Ci tail -f w tym skrypcie? * przecież wyżej w mojej funkcji send_msg() masz wyciągnięte wszystkie parametry, musisz tylko wysłać wiadomość. np. send_msg(){ ... echo "Użytkownik $user zwolnił plik $plik" |smbclient -M $pc } Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
samba Napisano Grudzień 14, 2010 Autor Zgłoszenie Share Napisano Grudzień 14, 2010 #!/bin/bash # skrypt uruchom jako root, ze wzgledu na dostep do /var/log/messages get_stp(){ tail -n1 /var/log/messages \ | egrep '.*\|.*\|[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\|.*\|unlink\|ok\|mapa.*STP$ } send_msg(){ plik=$( echo $1 | awk -F'|' '{print $NF}' | tr '[[:upper:]]' '[[:lower:]]' ) udzial=$(echo $1 | awk -F'|' '{print $(NF-3) }') ip=$(echo $1 | awk -F'|' '{print $(NF-4) }') pc=$(echo $1 | awk -F'|' '{print $(NF-5) }') user=$(echo $1 | awk -F'|' '{print $(NF-6) }') #jak wyslac cos przez sambe # nie dziala echo "Uzytkownik $user zwolnil plik $plik" |smbclient -M sm9 # nie dziala echo test |smbclient -M sm9 } while inotifywait -e modify /var/log/messages &>/dev/null ; do stp=$(get_stp) # warunek sprawdza, czy ciag nie jest pusty if [ ${#stp} != 0 ] ; then # wysylanie wiadomosci wyslemy w tlo, zeby spokojnie monitorowac dalej ( send_msg "$stp" )& fi done Borzole help!! zapisalem skrypt jako stp.sh i nie dziala uruchamiam ./stp.sh i nic sie nie dzieje (z roota) Moje spostrzezenia egrep '.*\|.*\|[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\|.*\|unlink\|ok\|mapa.*STP$ na koncu nie powinno byc ' (górny pojedynczy cudzyslów )? co prawda tail -f egrep '.*\|.*\|[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\|.*\|unlink\|ok\|mapa.*STP' daje dobry wynik (bez zmiennej $) Prosze pomóz bo zwariuje siedze nad tym drugi dzien Prawdopodobnie skrypt nie przekazuje napisu (wyjscia z tail) do smbclient a smbclient nic nie wysyla. Poza tym jak sprawdzic na czym skrypt wywala sie ? Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
borzole Napisano Grudzień 14, 2010 Zgłoszenie Share Napisano Grudzień 14, 2010 * nom, tam brakuje pojedynczego cudzysłowu * ...STP$ w tym wyrażeniu ozn. że kończy się na STP, znaczek $ ozn. tutaj koniec linii * możesz przekierować całe wyjście błędu do logu, umieszczając na początku skryptu: exec 2> /root/stp_err.log a w samym skrypcie gdzie tylko można wpisywać echo "jestem w funkcji send_msg() $@" >> /root/stp.log itp. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
samba Napisano Grudzień 14, 2010 Autor Zgłoszenie Share Napisano Grudzień 14, 2010 #!/bin/bash # skrypt uruchom jako root, ze wzgledu na dostep do /var/log/messages exec 2> /stp_err.log get_stp(){ tail -n1 /var/log/messages \ | egrep '.*\|.*\|[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\|.*\|unlink\|ok\|mapa.*STP$' } echo "jestem w funkcji send_msg() $@" >> /stp.log send_msg(){ plik=$( echo $1 | awk -F'|' '{print $NF}' | tr '[[:upper:]]' '[[:lower:]]' ) udzial=$(echo $1 | awk -F'|' '{print $(NF-3) }') ip=$(echo $1 | awk -F'|' '{print $(NF-4) }') pc=$(echo $1 | awk -F'|' '{print $(NF-5) }') user=$(echo $1 | awk -F'|' '{print $(NF-6) }') #jak wyslac cos przez sambe echo "Uzytkownik $user zwolnil plik $plik" |smbclient -M sm9 # echo test |smbclient -M sm9 } while inotifywait -e modify /var/log/messages &>/dev/null ; do stp=$(get_stp) # warunek sprawdza, czy ciag nie jest pusty if [ ${#stp} != 0 ] ; then # wysylanie wiadomosci wyslemy w tlo, zeby spokojnie monitorowac dalej ( send_msg "$stp" )& fi done w stp.log dostaje komunikat jestem w funkcji send_msg() natomiast /stp_err.log jest pusty Borzole mozesz mi napisac jak z tail -f /var/log/messages |egrep '.*\|.*\|[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\|.*\|unlink\|ok\|mapa.*STP$' zrobic przekierowanie wyjscia do smbclient ? tak aby wyjscie z taila bylo napisem : echo "wyjscie z tail -f" |smbclient -M nazwa_kompa ?? Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
borzole Napisano Grudzień 14, 2010 Zgłoszenie Share Napisano Grudzień 14, 2010 w zlym miejscu, spróbuj tak: #!/bin/bash # skrypt uruchom jako root, ze wzgledu na dostep do /var/log/messages exec 2> /stp_err.log log=/stp.log get_stp(){ echo "get_stp() $@" >> $log tail -n1 /var/log/messages \ | egrep '.*\|.*\|[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\|.*\|unlink\|ok\|mapa.*STP$' } send_msg(){ echo "send_msg() $@" >> $log plik=$( echo $1 | awk -F'|' '{print $NF}' | tr '[[:upper:]]' '[[:lower:]]' ) udzial=$(echo $1 | awk -F'|' '{print $(NF-3) }') ip=$(echo $1 | awk -F'|' '{print $(NF-4) }') pc=$(echo $1 | awk -F'|' '{print $(NF-5) }') user=$(echo $1 | awk -F'|' '{print $(NF-6) }') # test echo -e "\tsend_msg:plik: $plik" >> $log echo -e "\tsend_msg:udzial: $udzial" >> $log echo -e "\tsend_msg:ip: $ip" >> $log echo -e "\tsend_msg:pc: $pc" >> $log echo -e "\tsend_msg:user: $user" >> $log # jak wyslac cos przez sambe echo "Uzytkownik $user zwolnil plik $plik" |smbclient -M sm9 # echo test |smbclient -M sm9 } while inotifywait -e modify /var/log/messages &>/dev/null ; do echo ' --------------------------------- '>> $log echo -n "/var/log/messages:" >> $log tail -n1 /var/log/messages >> $log stp=$(get_stp) # warunek sprawdza, czy ciag nie jest pusty if [ ${#stp} != 0 ] ; then echo "stp: $stp" >> $log # wysylanie wiadomosci wyslemy w tlo, zeby spokojnie monitorowac dalej ( send_msg "$stp" )& fi done na drugim terminalu zrób tail -f /stp.log na trzecim tail -f /stp_err.log Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się