ディレクトリが別のユーザーによって変更されたときにスクリプトを実行する方法は?


13

これに似たトピックについて少し議論が行われたことは知っています。しかし、ここで私が基本的にやろうとしていることです。

watchディレクトリが呼び出さwatchedれ、そのディレクトリにファイルが追加されるたびに、そのディレクトリからsyncbh.shファイルを取り出してリモートサーバーにアップロードするというスクリプトをトリガーしたいと思います。

警告は、ファイルはwatched1人のユーザー(user2)によってディレクトリに作成されますが、スクリプトは別のユーザー(user1)によって実行されるということです。

私はこれを達成するためにincronを使用しようとしましたが、スクリプトはroot権限でuser1によって手動で実行できますが、実際には他のuser2によるファイル作成イベントによってincronデーモンが自動的にトリガーされることはないため、大きな問題が発生し続けます。

私は交渉がより良い代替手段になるかどうかを考えてきましたが、この構文がどのように機能するかについてはわかりません。私が使用して終了場合は、これを達成、またはより良い方法があればinoticomingコマンドを見て、それを依頼すること構文なるか/home/user1/watchedディレクトリを、スクリプトを実行/usr/local/bin/syncbh.shファイルは/作成したディレクトリ内で変更された場合は?

どんな助けでも大歓迎です。


どのユーザーがスクリプトを実行する必要がありますか?
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/

* watchedフォルダーのフルパスと実行するスクリプトのフルパスに一致するように<path_to_folder>および<path_to_script>を変更することを忘れないでください

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

    • {} ファイル名に置き換えられます


-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

2番目:別のユーザー(user2)として同期を行うには:

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

ユーザープロンプトを表示しないようにするには、 sudoファイルにパスワードを、必要なときに、このファイルからパスワードを読んで(あなたが使用する必要があり、ノート-Ssudo、ファイルからパスワードを取得するために)。

あなたの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

1
-1:パスワードをプレーンテキストファイルに入れないでください
エリオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.