Skocz do zawartości

Skrypt Do Informacji O Zwolnieniu Pliku Do Zapisu


samba

Rekomendowane odpowiedzi

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

* 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

* 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

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

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

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

* "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

#!/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

* 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

#!/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

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

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ę
×
×
  • Dodaj nową pozycję...