Wie führe ich ein Skript aus, wenn ein Verzeichnis von einem anderen Benutzer geändert wird?

13

Ich weiß, es wurde ein bisschen über ähnliche Themen diskutiert. Aber hier ist, was ich im Grunde versuche zu tun.

Ich habe ein Überwachungsverzeichnis, das aufgerufen wird, watchedund wann immer eine Datei zu diesem Verzeichnis hinzugefügt wird, möchte ich ein Skript auslösen, das aufgerufen syncbh.shwird, um Dateien aus diesem Verzeichnis zu entfernen und sie auf einen Remote-Server hochzuladen.

Die Einschränkung besteht darin, dass Dateien im watchedVerzeichnis von einem Benutzer (Benutzer2) erstellt werden, das Skript jedoch von einem anderen Benutzer (Benutzer1) ausgeführt wird.

Ich habe versucht, Incron zu verwenden, um dies zu erreichen, stoße aber weiterhin auf ein schwerwiegendes Problem, da das Skript zwar von Benutzer1 mit Root-Rechten manuell ausgeführt werden kann, der Incron- Daemon jedoch nie automatisch durch ein Dateierstellungsereignis des anderen Benutzers2 ausgelöst wird.

Ich habe darüber nachgedacht, ob Inoticoming eine bessere Alternative wäre, bin mir aber nicht sicher, wie die Syntax funktioniert. Wenn es einen besseren Weg gibt, dies zu erreichen, oder wenn ich am Ende Inoticoming verwende, wie lautet die Befehlssyntax, um das /home/user1/watchedVerzeichnis zu überwachen und das Skript auszuführen, /usr/local/bin/syncbh.shwenn eine Datei in diesem Verzeichnis erstellt / geändert wird?

Jede Hilfe wäre sehr dankbar.

user280327
quelle
Welcher Benutzer muss das Skript ausführen?
AB
Und wie soll welcher User laufen inoticoming?
AB
Bitte akzeptieren Sie die Antwort, die Ihren Anforderungen entspricht, und ich werde die Antwort mit dem Kopfgeld versehen.
Helio

Antworten:

5

Verwenden von inoticoming:

Sie können ein Skript einfügen /etc/init.d/ , das inoticomingbeim Booten ausgeführt wird.

  1. Erstellen Sie einen neuen Ordner für das inoticomingProtokoll / Letzte pidfür daswatched Ordner befindet:sudo mkdir -p /var/log/inoticoming/watched/

  2. Erstellen Sie ein Skript inoticoming_watchedin /etc/init.d/:

* Denken Sie daran, <path_to_folder> und <path_to_script> so zu ändern, dass sie dem vollständigen Pfad des watchedOrdners und dem vollständigen Pfad des auszuführenden Skripts entsprechen

#!/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. Markieren Sie das Skript als ausführbar: sudo chmod u+x /etc/init.d/inoticoming_watched

  2. Stellen Sie sicher, dass das Skript von aufgerufen wird inoticoming_watched ausführbar ist.

  3. Aktualisieren Sie rc.d, um den Dienst zu macheninoticoming_watched dass er beim Booten startet:sudo update-rc.d inoticoming_watched defaults

Sie können das inoticomingLogin überprüfen /var/log/inoticoming/watched.

kos
quelle
4

Installieren Sie zunächst Inoticoming :

sudo apt-get install inoticoming

Dann benutze diesen Befehl:

Achten Sie auf laufende Inoticoming-Prozesse, da diese mehrfach gestartet werden können.

$ inoticoming /home/user1/watched /usr/local/bin/syncbh.sh /home/user1/watched/{} \;
              ^                   ^                        ^
              |                   |                        |
              ^-- The directory to be monitored            |
                                  |                        |
                                  ^-- Your script          |
                                                           ^-- The parameter for your script
  • Der Prozess läuft im Hintergrund und beobachtet /home/user1/watched

  • Wenn eine Datei in diesem Verzeichnis hinzugefügt oder geändert wird, wird das Skript /usr/local/bin/syncbh.shaufgerufen.

    • Der Parameter für dieses Skript ist in diesem Fall /home/user1/watched/<name_of_changed_or_modified_file>

    • {} wird durch den Dateinamen ersetzt

AB
quelle
-2

Zuallererst ein Skript, um das watchedVerzeichnis zu beobachten :

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

2. Um die Synchronisierung als anderer Benutzer (Benutzer2) durchzuführen, gehen Sie wie folgt vor:

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

Nun , um nicht einen Benutzer Prompt zu machen, Sie festlegen können sudoPasswörter in einer Datei und lesen Sie das Kennwort aus dieser Datei bei Bedarf (Anmerkung müssen Sie verwenden -Smitsudo dem Sie das Kennwort aus der Datei abrufen müssen).

Schreiben Sie Ihr sudoPasswort in eine Datei, nehmen Sie an passwd.txt, dass der obige Befehl "saugen" lautet

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

Das gesamte Skript sieht nun so aus:

#! /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
quelle
1
-1: Tragen Sie das Passwort niemals in eine Klartextdatei ein.
Helio