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

12

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

Eu tenho um diretório de observação chamado watched e sempre que um arquivo é adicionado a esse diretório, quero disparar um script chamado syncbh.sh , que extrairá os arquivos desse diretório e os carregará para um servidor remoto.

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

Eu tentei usar incron para fazer isso, mas continuo correndo em um grande problema, porque enquanto o script pode ser executado manualmente pelo user1 com privilégios de root, o incron O daemon nunca é automaticamente acionado por um evento de criação de arquivo pelo outro usuário2.

Eu pensei se o inoticoming seria uma alternativa melhor, mas não estou claro sobre como a sintaxe disso funciona. Se houver uma maneira melhor de fazer isso, ou se eu acabar usando inoticoming qual seria a sintaxe do comando para pedir para ele assistir ao diretório /home/user1/watched e executar o script /usr/local/bin/syncbh.sh se um arquivo for criado / modificado dentro desse diretório?

Qualquer ajuda seria muito apreciada.

    
por user280327 19.04.2015 / 02:14

3 respostas

4

Usando inoticoming :

Você pode colocar um script em /etc/init.d/ que executa inoticoming no momento da inicialização.

  1. Crie uma nova pasta para armazenar o inoticoming log / last pid para a pasta watched : sudo mkdir -p /var/log/inoticoming/watched/

  2. Crie um script inoticoming_watched em /etc/init.d/ :

* Lembre-se de alterar < caminho_para_pasta > e < path_to_script > para corresponder ao caminho completo da pasta watched e ao caminho completo do script para executar

#!/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. Certifique-se de que o script chamado por inoticoming_watched seja executável.

  3. Atualize rc.d para que o serviço inoticoming_watched comece no momento da inicialização: sudo update-rc.d inoticoming_watched defaults

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

    
por kos 28.04.2015 / 18:36
3

Antes de mais nada, instale o inoticoming :

sudo apt-get install inoticoming

Em seguida, use este comando:

Preste atenção aos processos contínuos 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 backgound 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 de arquivo

por A.B. 23.04.2015 / 12:51
-2

Primeiro, um script para assistir ao diretório watched :

#! /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 fazer a sincronização como outro usuário (user2) o:

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

Agora, para não fazer uma solicitação ao usuário, você pode definir sua sudo senha em um arquivo e ler a senha desse arquivo quando necessário (observe que você tem que usar -S com sudo para obter a senha do arquivo o).

Coloque a sua senha sudo em um arquivo, suponha passwd.txt , então o comando acima será ruim 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
    
por Maythux 23.04.2015 / 12:23