Comment exécuter un script lorsqu'un répertoire est modifié par un autre utilisateur?

13

Je sais qu'il y a eu un peu de discussion sur des sujets similaires à celui-ci. Mais voici ce que j'essaie essentiellement de faire.

J'ai un répertoire de surveillance appelé watchedet chaque fois qu'un fichier est ajouté à ce répertoire, je veux déclencher un script appelé syncbh.shqui prendra les fichiers de ce répertoire et les téléchargera sur un serveur distant.

La mise en garde est que les fichiers sont créés dans le watchedrépertoire par un utilisateur (utilisateur2), mais le script est exécuté par un autre (utilisateur1).

J'ai essayé d'utiliser incron pour accomplir cela, mais continuez à rencontrer un problème majeur car, bien que le script puisse être exécuté manuellement par utilisateur1 avec les privilèges root, le démon incron n'est jamais réellement déclenché automatiquement par un événement de création de fichier par l'autre utilisateur2.

J'ai pensé si l' inotisme serait une meilleure alternative, mais je ne sais pas comment la syntaxe de cela fonctionne. S'il y a une meilleure façon d'accomplir cela, ou si je finis par utiliser l' inoticoming, quelle serait la syntaxe de la commande pour lui demander de regarder le /home/user1/watchedrépertoire et d'exécuter le script /usr/local/bin/syncbh.shsi un fichier est créé / modifié dans ce répertoire?

Toute aide serait très appréciée.

user280327
la source
Quel utilisateur doit exécuter le script?
AB
Et en tant que quel utilisateur doit s'exécuter inoticoming?
AB
Veuillez accepter la réponse qui correspond à vos besoins et je donnerai la récompense à cette réponse.
Helio

Réponses:

5

En utilisant inoticoming:

Vous pouvez mettre un script /etc/init.d/qui s'exécute inoticomingau démarrage.

  1. Créez un nouveau dossier pour contenir le inoticomingjournal / dernier piddu watcheddossier:sudo mkdir -p /var/log/inoticoming/watched/

  2. Créez un script inoticoming_watcheddans /etc/init.d/:

* N'oubliez pas de changer <path_to_folder> et <path_to_script> pour faire correspondre le chemin complet du watcheddossier et le chemin complet du script à exécuter

#!/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. Marquez le script comme exécutable: sudo chmod u+x /etc/init.d/inoticoming_watched

  2. Assurez-vous que le script appelé par inoticoming_watchedest exécutable.

  3. Mettre rc.dà jour pour faire inoticoming_watcheddémarrer le service au démarrage:sudo update-rc.d inoticoming_watched defaults

Vous pouvez vérifier la inoticomingconnexion /var/log/inoticoming/watched.

kos
la source
4

Tout d'abord, installez inoticoming :

sudo apt-get install inoticoming

Utilisez ensuite cette commande:

Faites attention aux processus en cours d'inotisme, car ils peuvent être démarrés plusieurs fois.

$ inoticoming /home/user1/watched /usr/local/bin/syncbh.sh /home/user1/watched/{} \;
              ^                   ^                        ^
              |                   |                        |
              ^-- The directory to be monitored            |
                                  |                        |
                                  ^-- Your script          |
                                                           ^-- The parameter for your script
  • Le processus se déroule en arrière-plan et surveille /home/user1/watched

  • Lorsqu'un fichier est ajouté ou modifié dans ce répertoire, le script /usr/local/bin/syncbh.shest appelé.

    • Le paramètre de ce script est dans ce cas /home/user1/watched/<name_of_changed_or_modified_file>

    • {} est remplacé par le nom de fichier

UN B
la source
-2

Tout d'abord, un script pour regarder le watchedrépertoire:

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

Deuxième Pour faire la synchronisation en tant qu'un autre utilisateur (utilisateur2):

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

Maintenant, afin de ne pas faire d'invite utilisateur, vous pouvez définir votre sudomot de passe dans un fichier et lire le mot de passe de ce fichier si nécessaire (notez que vous devez utiliser -Savec sudopour obtenir le mot de passe du fichier le).

Mettez votre sudomot de passe dans un fichier, supposons passwd.txt, alors la commande ci-dessus sera sucée comme

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

Maintenant, le script global sera comme:

#! /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
la source
1
-1: Ne placez jamais le mot de passe dans un fichier en texte brut.
Helio