Como executar um script quando um diretório é alterado por outro usuário?

13

Eu sei que houve um pouco de discussão sobre tópicos semelhantes a este. Mas aqui está o que estou basicamente tentando fazer.

Eu tenho um diretório monitor chamado watchede sempre que um arquivo é adicionado a esse diretório, desejo acionar um script chamado syncbh.shque retira os arquivos desse diretório e os carrega em um servidor remoto.

A ressalva é que os arquivos são criados no watcheddiretório por um usuário (usuário2), mas o script é executado por outro (usuário1).

Tentei usar o incron para fazer isso, mas continuo enfrentando um problema grave, porque, embora o script possa ser executado manualmente pelo usuário1 com privilégios de root, o daemon do incron nunca é acionado automaticamente por um evento de criação de arquivo pelo outro usuário2.

Pensei se o inoticoming seria uma alternativa melhor, mas não sei como funciona a sintaxe disso. Se existe uma maneira melhor de fazer isso, ou se eu acabar usando inoticoming, qual seria a sintaxe do comando para pedir para observar o /home/user1/watcheddiretório e executar o script /usr/local/bin/syncbh.shse um arquivo for criado / modificado nesse diretório?

Qualquer ajuda seria muito apreciada.

user280327
fonte
Qual usuário deve executar o script?
AB
E como qual usuário deve executar inoticoming?
AB
Aceite a resposta que atenda às suas necessidades e eu darei a recompensa para essa resposta.
Helio

Respostas:

5

Usando inoticoming:

Você pode colocar um script /etc/init.d/que seja executado inoticomingno momento da inicialização.

  1. Crie uma nova pasta para manter o inoticomingregistro / último pidda watchedpasta:sudo mkdir -p /var/log/inoticoming/watched/

  2. Crie um script inoticoming_watchedem /etc/init.d/:

* Lembre-se de alterar <path_to_folder> e <path_to_script> para corresponder ao caminho completo da watchedpasta e ao caminho completo do script a ser executado

#!/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. Marque o script como executável: sudo chmod u+x /etc/init.d/inoticoming_watched

  2. Verifique se o script chamado por inoticoming_watchedé executável.

  3. Atualize rc.dpara inoticoming_watchediniciar o serviço no momento da inicialização:sudo update-rc.d inoticoming_watched defaults

Você pode verificar o inoticominglogin /var/log/inoticoming/watched.

kos
fonte
4

Primeiro de tudo, instale inoticoming :

sudo apt-get install inoticoming

Então use este comando:

Preste atenção aos processos em andamento de inoticoming, porque eles podem ser iniciados várias vezes.

$ inoticoming /home/user1/watched /usr/local/bin/syncbh.sh /home/user1/watched/{} \;
              ^                   ^                        ^
              |                   |                        |
              ^-- The directory to be monitored            |
                                  |                        |
                                  ^-- Your script          |
                                                           ^-- The parameter for your script
  • O processo é executado em segundo plano e está assistindo /home/user1/watched

  • Quando um arquivo é adicionado ou alterado nesse diretório, o script /usr/local/bin/syncbh.shé chamado.

    • O parâmetro para este script é neste caso /home/user1/watched/<name_of_changed_or_modified_file>

    • {} é substituído pelo nome do arquivo

AB
fonte
-2

Primeiro de tudo, um script para assistir ao watcheddiretório:

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

Segundo Para sincronizar como outro usuário (usuário2):

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

Agora, para não solicitar ao usuário, você pode definir sua sudosenha em um arquivo e ler a senha deste arquivo quando necessário (observe que você deve usar-S com sudopara obter a senha do arquivo do).

Coloque sua sudosenha em um arquivo, suponha que passwd.txto comando acima será péssimo como

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

Agora, o script geral será como:

#! /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
fonte
1
-1: nunca coloque a senha em um arquivo de texto sem formatação.
Helio