Bagaimana menjalankan skrip ketika direktori diubah oleh pengguna lain?

13

Saya tahu telah sedikit diskusi tentang topik yang mirip dengan ini. Tetapi inilah yang pada dasarnya saya coba lakukan.

Saya memiliki direktori tontonan yang dipanggil watcheddan setiap kali file ditambahkan ke direktori itu, saya ingin memicu skrip yang disebut syncbh.shyang akan mengambil file dari direktori itu dan mengunggahnya ke server jauh.

Peringatannya adalah bahwa file dibuat dalam watcheddirektori oleh satu pengguna (user2), tetapi skrip dieksekusi oleh yang lain (user1).

Saya sudah mencoba menggunakan incron untuk menyelesaikan ini, tetapi tetap mengalami masalah besar karena sementara skrip dapat dieksekusi secara manual oleh user1 dengan hak akses root, daemon incron tidak pernah benar-benar dipicu secara otomatis oleh peristiwa pembuatan file oleh pengguna lain2.

Saya sudah memikirkan apakah inoticoming akan menjadi alternatif yang lebih baik, tetapi saya tidak jelas tentang bagaimana sintaksis ini bekerja. Jika ada cara yang lebih baik untuk mencapai ini, atau jika saya akhirnya menggunakan inoticoming apa yang akan menjadi sintaks perintah untuk memintanya menonton /home/user1/watcheddirektori dan menjalankan skrip /usr/local/bin/syncbh.shjika file dibuat / dimodifikasi dalam direktori itu?

Bantuan apa pun akan sangat dihargai.

pengguna280327
sumber
Pengguna mana yang harus menjalankan skrip?
AB
Dan sebagai pengguna mana yang harus dijalankan inoticoming?
AB
Harap terima jawaban yang sesuai dengan kebutuhan Anda dan saya akan memberikan hadiah untuk jawaban itu.
Helio

Jawaban:

5

Menggunakan inoticoming:

Anda dapat memasukkan skrip /etc/init.d/yang berjalan inoticomingsaat boot.

  1. Buat folder baru untuk menyimpan inoticominglog / terakhir piduntuk watchedfolder:sudo mkdir -p /var/log/inoticoming/watched/

  2. Buat skrip inoticoming_watcheddi /etc/init.d/:

* Ingatlah untuk mengubah <path_to_folder> dan <path_to_script> untuk mencocokkan path lengkap watchedfolder dan path lengkap script untuk dieksekusi

#!/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. Tandai skrip sebagai executable: sudo chmod u+x /etc/init.d/inoticoming_watched

  2. Pastikan skrip yang dipanggil oleh inoticoming_watcheddapat dieksekusi.

  3. Pembaruan rc.duntuk membuat layanan inoticoming_watchedmulai saat boot:sudo update-rc.d inoticoming_watched defaults

Anda dapat memeriksa inoticominglogin /var/log/inoticoming/watched.

kos
sumber
4

Pertama-tama, instal inoticoming :

sudo apt-get install inoticoming

Kemudian gunakan perintah ini:

Perhatikan proses inoticoming yang sedang berlangsung, karena mereka dapat dimulai beberapa kali.

$ inoticoming /home/user1/watched /usr/local/bin/syncbh.sh /home/user1/watched/{} \;
              ^                   ^                        ^
              |                   |                        |
              ^-- The directory to be monitored            |
                                  |                        |
                                  ^-- Your script          |
                                                           ^-- The parameter for your script
  • Proses berjalan di backgound dan menonton /home/user1/watched

  • Ketika file ditambahkan atau diubah dalam direktori itu, skrip /usr/local/bin/syncbh.shdipanggil.

    • Parameter untuk skrip ini dalam hal ini /home/user1/watched/<name_of_changed_or_modified_file>

    • {} diganti dengan nama file

AB
sumber
-2

Pertama-tama, skrip untuk menonton watcheddirektori:

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

Kedua Untuk melakukan sinkronisasi sebagai pengguna lain (user2):

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

Sekarang untuk tidak membuat pengguna prompt, Anda dapat mengatur Anda sudosandi dalam file dan membaca password dari file ini bila diperlukan (catatan Anda harus menggunakan -Sdengan sudountuk mendapatkan password dari file).

Masukkan sudokata sandi Anda dalam file, misalkan passwd.txt, maka perintah di atas akan payah seperti

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

Sekarang keseluruhan skrip akan seperti:

#! /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
sumber
1
-1: Jangan pernah memasukkan kata sandi dalam file plaintext.
Helio