Làm cách nào để chạy tập lệnh khi một thư mục bị người dùng khác thay đổi?


13

Tôi biết đã có một chút thảo luận về các chủ đề tương tự như thế này. Nhưng đây là những gì tôi đang cố gắng làm.

Tôi có một thư mục theo dõi được gọi watchedvà bất cứ khi nào một tệp được thêm vào thư mục đó, tôi muốn kích hoạt một tập lệnh được gọi syncbh.shsẽ đưa các tệp ra khỏi thư mục đó và tải chúng lên một máy chủ từ xa.

Thông báo trước là các tệp được tạo trong watchedthư mục bởi một người dùng (user2), nhưng tập lệnh được thực thi bởi người khác (user1).

Tôi đã thử sử dụng incron để thực hiện điều này, nhưng tiếp tục gặp phải một vấn đề lớn bởi vì trong khi tập lệnh có thể được thực thi thủ công bởi user1 với quyền root, thì trình nền incron không bao giờ thực sự được kích hoạt bởi một sự kiện tạo tệp bởi người dùng khác2.

Tôi đã nghĩ về việc liệu inoticoming sẽ là một sự thay thế tốt hơn, nhưng tôi không rõ về cách thức hoạt động của cú pháp này. Nếu có cách nào tốt hơn để thực hiện điều này, hoặc nếu tôi kết thúc bằng cách sử dụng inoticoming thì cú pháp lệnh sẽ yêu cầu nó xem /home/user1/watchedthư mục và thực thi tập lệnh /usr/local/bin/syncbh.shnếu một tệp được tạo / sửa đổi trong thư mục đó?

Bất kì sự trợ giúp nào đều được đánh giá cao.


Người dùng nào phải chạy tập lệnh?
AB

Và người dùng nào nên chạy inoticoming?
AB

Vui lòng chấp nhận câu trả lời phù hợp với nhu cầu của bạn và tôi sẽ đưa tiền thưởng cho câu trả lời đó.
Helio

Câu trả lời:


5

Sử dụng inoticoming:

Bạn có thể đặt một tập lệnh /etc/init.d/chạy inoticomingvào lúc khởi động.

  1. Tạo một thư mục mới để giữ inoticomingnhật ký / cuối cùng pidcho watchedthư mục:sudo mkdir -p /var/log/inoticoming/watched/

  2. Tạo một tập lệnh inoticoming_watchedtrong /etc/init.d/:

* Hãy nhớ thay đổi <path_to_folder> và <path_to_script> để khớp với đường dẫn đầy đủ của watchedthư mục và đường dẫn đầy đủ của tập lệnh để thực thi

#!/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. Đánh dấu tập lệnh là thực thi: sudo chmod u+x /etc/init.d/inoticoming_watched

  2. Hãy chắc chắn rằng tập lệnh được gọi bởi inoticoming_watchedcó thể thực thi được.

  3. Cập nhật rc.dđể làm cho dịch vụ inoticoming_watchedbắt đầu khi khởi động:sudo update-rc.d inoticoming_watched defaults

Bạn có thể kiểm tra inoticomingđăng nhập /var/log/inoticoming/watched.


4

Trước hết, cài đặt inoticoming :

sudo apt-get install inoticoming

Sau đó sử dụng lệnh này:

Hãy chú ý đến các quá trình inoticoming đang diễn ra, bởi vì chúng có thể được bắt đầu nhiều lần.

$ inoticoming /home/user1/watched /usr/local/bin/syncbh.sh /home/user1/watched/{} \;
              ^                   ^                        ^
              |                   |                        |
              ^-- The directory to be monitored            |
                                  |                        |
                                  ^-- Your script          |
                                                           ^-- The parameter for your script
  • Quá trình chạy trong backgound và đang xem /home/user1/watched

  • Khi một tập tin được thêm hoặc thay đổi trong thư mục đó, tập lệnh /usr/local/bin/syncbh.shđược gọi.

    • Tham số cho tập lệnh này là trong trường hợp này /home/user1/watched/<name_of_changed_or_modified_file>

    • {} được thay thế bằng tên tệp


-2

Trước hết, một kịch bản để xem watchedthư mục:

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

Thứ hai Để thực hiện đồng bộ hóa với tư cách người dùng khác (user2):

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

Bây giờ để không làm cho một người sử dụng nhanh chóng, bạn có thể thiết lập của bạn sudomật khẩu trong một tập tin và đọc mật khẩu từ tập tin này khi cần thiết (lưu ý bạn phải sử dụng -Svới sudođể có được mật khẩu từ file).

Đặt sudomật khẩu của bạn vào một tệp, giả sử passwd.txt, sau đó lệnh trên sẽ được hút như

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

Bây giờ kịch bản tổng thể sẽ như sau:

#! /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: Không bao giờ đặt mật khẩu trong tệp văn bản gốc.
Helio
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.