Jak uruchomić skrypt, gdy katalog jest zmieniany przez innego użytkownika?

13

Wiem, że była trochę dyskusji na podobne tematy. Ale oto, co właściwie próbuję zrobić.

Mam wywołany katalog obserwacyjny watchedi za każdym razem, gdy plik jest dodawany do tego katalogu, chcę uruchomić wywoływany skrypt, syncbh.shktóry usunie pliki z tego katalogu i prześle je na zdalny serwer.

Zastrzeżenie polega na tym, że pliki są tworzone w watchedkatalogu przez jednego użytkownika (użytkownik2), ale skrypt jest wykonywany przez innego użytkownika (użytkownik1).

Próbowałem użyć incron, aby to osiągnąć, ale ciągle napotykam na poważny problem, ponieważ chociaż skrypt może być wykonany ręcznie przez użytkownika1 z uprawnieniami administratora, demon incron nigdy nie jest automatycznie uruchamiany przez zdarzenie tworzenia pliku przez innego użytkownika2.

Myślałem o tym, czy inoticoming byłoby lepszą alternatywą, ale nie jestem pewien, jak działa składnia tego. Jeśli istnieje lepszy sposób, aby to osiągnąć, lub jeśli skończę przy użyciu inoticoming, jaka byłaby składnia polecenia, aby poprosić o obejrzenie /home/user1/watchedkatalogu i wykonanie skryptu, /usr/local/bin/syncbh.shjeśli plik zostanie utworzony / zmodyfikowany w tym katalogu?

Każda pomoc będzie mile widziana.

użytkownik280327
źródło
Który użytkownik musi uruchomić skrypt?
AB
A jako który użytkownik powinien uruchomić inoticoming?
AB
Zaakceptuj odpowiedź, która odpowiada twoim potrzebom, a ja dam nagrodę za tę odpowiedź.
Helio

Odpowiedzi:

5

Używanie inoticoming:

Możesz umieścić skrypt, /etc/init.d/który będzie działał inoticomingw czasie uruchamiania.

  1. Utwórz nowy folder do przechowywania inoticomingdziennika / ostatniego piddla watchedfolderu:sudo mkdir -p /var/log/inoticoming/watched/

  2. Utwórz skrypt inoticoming_watchedw /etc/init.d/:

* Pamiętaj, aby zmienić <path_to_folder> i <path_to_script>, aby dopasować pełną ścieżkę watchedfolderu i pełną ścieżkę skryptu do wykonania

#!/bin/sh

case "${1}" in
    start)
        inoticoming --logfile '/var/log/inoticoming/watched/inoticoming.log' --pid-file '/var/log/inoticoming/watched/inoticoming_last_pid.txt' <path_to_folder> <path_to_script> \;
    ;;

    stop)
        kill -15 $(< /var/log/inoticoming/watched/inoticoming_last_pid.txt tee)
    ;;

    restart)
        ${0} stop
        sleep 1
        ${0} start
    ;;

    *)
    echo "Usage: ${0} {start|stop|restart}"
    exit 1
    ;;
esac
  1. Oznacz skrypt jako wykonywalny: sudo chmod u+x /etc/init.d/inoticoming_watched

  2. Upewnij się, że wywoływany skrypt inoticoming_watchedjest wykonywalny.

  3. Zaktualizuj, rc.daby usługa inoticoming_watcheduruchomiła się w czasie uruchamiania:sudo update-rc.d inoticoming_watched defaults

Możesz sprawdzić inoticominglogowanie /var/log/inoticoming/watched.

kos
źródło
4

Przede wszystkim zainstaluj inoticoming :

sudo apt-get install inoticoming

Następnie użyj tego polecenia:

Zwróć uwagę na trwające procesy inoticoming, ponieważ można je uruchomić wiele razy.

$ inoticoming /home/user1/watched /usr/local/bin/syncbh.sh /home/user1/watched/{} \;
              ^                   ^                        ^
              |                   |                        |
              ^-- The directory to be monitored            |
                                  |                        |
                                  ^-- Your script          |
                                                           ^-- The parameter for your script
  • Proces przebiega w tle i jest obserwowany /home/user1/watched

  • Po dodaniu lub zmianie pliku w tym katalogu /usr/local/bin/syncbh.shwywoływany jest skrypt .

    • W tym przypadku jest parametr tego skryptu /home/user1/watched/<name_of_changed_or_modified_file>

    • {} zastępuje się nazwą pliku

AB
źródło
-2

Przede wszystkim skrypt do oglądania watchedkatalogu:

#! /bin/bash

folder=/path-to-watched

inotifywait -m -q  -e create  -e modify  '%:e %w%f' $folder | while read file
  do
    #make the sync here
  done

Po drugie Aby zsynchronizować jako inny użytkownik (użytkownik2):

sudo -H -u user2 bash -c 'sh /usr/local/bin/syncbh.sh ' 

Teraz, aby nie podjąć natychmiastowe użytkownik, można ustawić sudohasło w pliku i odczytać hasło z tego pliku, gdy są potrzebne (uwaga trzeba korzystać -Sz sudoaby dostać hasło z pliku).

Załóż sudohasło w pliku, przypuśćmy passwd.txt, że powyższe polecenie będzie do bani

sudo -S -H -u user2 bash -c 'sh /usr/local/bin/syncbh.sh ' < /path-to/passwd.txt

Teraz ogólny skrypt będzie wyglądał następująco:

#! /bin/bash

folder=/path-to-watched

inotifywait -m -q  -e create  -e modify  '%:e %w%f' $folder | while read file
  do
      sudo -S -H -u user2 bash -c 'sh /usr/local/bin/syncbh.sh ' < /path-to/passwd.txt      
done
Maythux
źródło
1
-1: Nigdy nie umieszczaj hasła w pliku tekstowym.
Helio