จะรันสคริปต์ได้อย่างไรเมื่อผู้ใช้รายอื่นเปลี่ยนไดเรกทอรี?


13

ฉันรู้ว่ามีการอภิปรายเล็กน้อยเกี่ยวกับหัวข้อที่คล้ายกับเรื่องนี้ แต่นี่คือสิ่งที่ฉันพยายามจะทำ

ฉันมีไดเรกทอรีเฝ้าดูชื่อwatchedและเมื่อใดก็ตามที่มีการเพิ่มไฟล์ลงในไดเรกทอรีนั้นฉันต้องการเรียกสคริปต์ที่เรียกใช้syncbh.shซึ่งจะนำไฟล์ออกจากไดเรกทอรีนั้นและอัปโหลดไปยังเซิร์ฟเวอร์ระยะไกล

ข้อแม้คือไฟล์นั้นถูกสร้างขึ้นในwatchedไดเรกทอรีโดยผู้ใช้รายหนึ่ง (user2) แต่สคริปต์จะถูกดำเนินการโดยผู้อื่น (user1)

ฉันได้ลองใช้incronเพื่อทำสิ่งนี้ให้สำเร็จ แต่ยังคงพบปัญหาที่สำคัญเนื่องจากในขณะที่สคริปต์สามารถดำเนินการด้วยตนเองโดย user1 ที่มีสิทธิ์รูทincron daemon ไม่เคยถูกเรียกโดยอัตโนมัติโดยเหตุการณ์การสร้างไฟล์โดย user2 อื่น

ฉันคิดว่าการที่ไม่ทราบว่าจะเป็นทางเลือกที่ดีกว่านี้หรือไม่ แต่ฉันไม่แน่ใจเกี่ยวกับการทำงานของไวยากรณ์นี้ หากมีวิธีที่ดีกว่าในการทำสิ่งนี้ให้สำเร็จหรือถ้าฉันใช้inoticomingไวยากรณ์คำสั่งจะขอให้มันดู/home/user1/watchedไดเรกทอรีและรันสคริปต์/usr/local/bin/syncbh.shถ้าไฟล์ถูกสร้าง / แก้ไขภายในไดเรกทอรีนั้น

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมมาก


ผู้ใช้คนใดต้องเรียกใช้สคริปต์
AB

และผู้ใช้คนไหนที่ควรทำงานinoticoming?
AB

โปรดยอมรับคำตอบที่ตรงกับความต้องการของคุณและฉันจะมอบรางวัลให้กับคำตอบนั้น
Helio

คำตอบ:


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>

    • {} ถูกแทนที่ด้วยชื่อไฟล์


-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

1
-1: อย่าใส่รหัสผ่านในไฟล์ธรรมดา
Helio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.