Как запустить скрипт, когда каталог изменяется другим пользователем?

13

Я знаю, что была небольшая дискуссия на темы, подобные этой. Но вот что я в основном пытаюсь сделать.

У меня есть каталог для отслеживания, watchedи всякий раз, когда файл добавляется в этот каталог, я хочу вызвать скрипт, syncbh.shкоторый вызывает файлы из этого каталога и загружает их на удаленный сервер.

Предостережение заключается в том, что файлы создаются в watchedкаталоге одним пользователем (user2), но скрипт выполняется другим пользователем (user1).

Я пытался использовать incron для достижения этой цели, но продолжаю сталкиваться с серьезной проблемой, потому что, хотя скрипт может быть выполнен вручную пользователем user1 с привилегиями root, демон incron фактически никогда не запускается автоматически событием создания файла другим пользователем2.

Я думал о том, будет ли inoticoming лучшей альтернативой, но мне неясно, как работает синтаксис этого. Если есть лучший способ сделать это, или если я в конечном итоге использую inoticoming, какой будет синтаксис команды, чтобы попросить его просмотреть /home/user1/watchedкаталог и выполнить скрипт, /usr/local/bin/syncbh.shесли файл создан / изменен в этом каталоге?

Любая помощь приветствуется.

user280327
источник
Какой пользователь должен запустить скрипт?
AB
И какой пользователь должен работать inoticoming?
AB
Пожалуйста, примите ответ, который соответствует вашим потребностям, и я дам вознаграждение за этот ответ.
Гелио

Ответы:

5

Использование inoticoming:

Вы можете поместить скрипт, /etc/init.d/который запускается inoticomingво время загрузки.

  1. Создайте новую папку для хранения inoticomingжурнала / последнего pidдля watchedпапки:sudo mkdir -p /var/log/inoticoming/watched/

  2. Создать скрипт inoticoming_watchedв /etc/init.d/:

* Не забудьте изменить <path_to_folder> и <path_to_script>, чтобы они соответствовали полному пути к watchedпапке и полному пути скрипта для выполнения

#!/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. Пометьте скрипт как исполняемый: sudo chmod u+x /etc/init.d/inoticoming_watched

  2. Убедитесь, что вызываемый скрипт inoticoming_watchedявляется исполняемым.

  3. Обновление rc.dдля inoticoming_watchedзапуска службы во время загрузки:sudo update-rc.d inoticoming_watched defaults

Вы можете проверить inoticomingвход в систему /var/log/inoticoming/watched.

кос
источник
4

Прежде всего, установите inoticoming :

sudo apt-get install inoticoming

Затем используйте эту команду:

Обратите внимание на текущие процессы инотикоминга, потому что они могут запускаться несколько раз.

$ inoticoming /home/user1/watched /usr/local/bin/syncbh.sh /home/user1/watched/{} \;
              ^                   ^                        ^
              |                   |                        |
              ^-- The directory to be monitored            |
                                  |                        |
                                  ^-- Your script          |
                                                           ^-- The parameter for your script
  • Процесс работает в фоновом режиме и следит за /home/user1/watched

  • Когда файл добавляется или изменяется в этом каталоге, /usr/local/bin/syncbh.shвызывается скрипт .

    • Параметр для этого скрипта в этом случае /home/user1/watched/<name_of_changed_or_modified_file>

    • {} заменяется именем файла

AB
источник
-2

Прежде всего, скрипт для просмотра 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

Второй Чтобы выполнить синхронизацию с другим пользователем (user2):

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

Теперь для того , чтобы не сделать пользователь подсказку, вы можете установить свой sudoпароль в файл и прочитать пароль из этого файла при необходимости (обратите внимание , вы должны использовать -Sс , sudoчтобы получить пароль от файла).

Положите ваш sudoпароль в файл, предположим passwd.txt, тогда приведенная выше команда будет отстойной, как

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

Теперь общий сценарий будет выглядеть так:

#! /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
источник
1
-1: Никогда не помещайте пароль в открытый текст.
Гелио