¿Cómo ejecutar un script cuando otro usuario cambia un directorio?

13

Sé que ha habido un poco de discusión sobre temas similares a este. Pero esto es lo que básicamente estoy tratando de hacer.

Tengo un directorio de observación llamado watchedy cada vez que se agrega un archivo a ese directorio, quiero activar un script llamado syncbh.shque sacará los archivos de ese directorio y los cargará en un servidor remoto.

La advertencia es que los archivos son creados en el watcheddirectorio por un usuario (usuario2), pero el script es ejecutado por otro (usuario1).

Intenté usar incron para lograr esto, pero sigo encontrándome con un problema importante porque si bien el script1 puede ser ejecutado manualmente por el usuario1 con privilegios de root, el demonio incron nunca se activa automáticamente por un evento de creación de archivos por parte del otro usuario2.

He pensado si la inoticoming sería una mejor alternativa, pero no tengo claro cómo funciona la sintaxis. Si hay una mejor manera de lograr esto, o si termino usando inoticoming, ¿cuál sería la sintaxis del comando para pedirle que mire el /home/user1/watcheddirectorio y ejecute el script /usr/local/bin/syncbh.shsi se crea / modifica un archivo dentro de ese directorio?

Cualquier ayuda sería muy apreciada.

usuario280327
fuente
¿Qué usuario debe ejecutar el script?
AB
¿Y qué usuario debería ejecutar inoticoming?
AB
Acepte la respuesta que se ajuste a sus necesidades y le daré la recompensa por esa respuesta.
Helio

Respuestas:

5

Utilizando inoticoming:

Puede poner un script /etc/init.d/que se ejecute inoticomingen el momento del arranque.

  1. Cree una nueva carpeta para guardar el inoticomingregistro / último pidpara la watchedcarpeta:sudo mkdir -p /var/log/inoticoming/watched/

  2. Crea un script inoticoming_watcheden /etc/init.d/:

* Recuerde cambiar <path_to_folder> y <path_to_script> para que coincidan con la ruta completa de la watchedcarpeta y la ruta completa del script para ejecutar

#!/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 el script como ejecutable: sudo chmod u+x /etc/init.d/inoticoming_watched

  2. Asegúrese de que el script llamado por inoticoming_watchedsea ​​ejecutable.

  3. Actualización rc.dpara que el servicio se inoticoming_watchedinicie en el momento del arranque:sudo update-rc.d inoticoming_watched defaults

Puedes consultar el inoticominginicio de sesión /var/log/inoticoming/watched.

kos
fuente
4

En primer lugar, instale inoticoming :

sudo apt-get install inoticoming

Luego usa este comando:

Preste atención a los procesos en curso de inoticoming, ya que pueden iniciarse varias veces.

$ inoticoming /home/user1/watched /usr/local/bin/syncbh.sh /home/user1/watched/{} \;
              ^                   ^                        ^
              |                   |                        |
              ^-- The directory to be monitored            |
                                  |                        |
                                  ^-- Your script          |
                                                           ^-- The parameter for your script
  • El proceso se ejecuta en segundo plano y está observando /home/user1/watched

  • Cuando se agrega o cambia un archivo en ese directorio, /usr/local/bin/syncbh.shse llama al script .

    • El parámetro para este script es en este caso /home/user1/watched/<name_of_changed_or_modified_file>

    • {} se reemplaza por el nombre del archivo

AB
fuente
-2

En primer lugar, un script para ver el watcheddirectorio:

#! /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 otro usuario (usuario2) el:

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

Ahora, para no hacer que el usuario solicite, puede establecer su sudocontraseña en un archivo y leer la contraseña de este archivo cuando sea necesario (tenga en cuenta que debe usar -Scon sudopara obtener la contraseña del archivo).

Pon tu sudocontraseña en un archivo, supongamos passwd.txt, entonces el comando anterior será una mierda

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

Ahora el guión general 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
fuente
1
-1: nunca coloque la contraseña en un archivo de texto sin formato.
Helio