다른 사용자가 디렉토리를 변경할 때 스크립트를 실행하는 방법은 무엇입니까?


13

나는 이것과 비슷한 주제에 대해 약간의 토론을하고 있음을 알고 있습니다. 그러나 여기 내가 기본적으로하려고하는 것이 있습니다.

나는 watch 디렉토리를 가지고 있고 watched파일이 그 디렉토리에 추가 될 때마다 해당 디렉토리에서 syncbh.sh파일을 가져 와서 원격 서버에 업로드 하는 스크립트를 트리거하려고 합니다.

경고는 파일이 watched한 사용자 (user2)에 의해 디렉토리에 작성 되지만 스크립트는 다른 사용자 (user1)에 의해 실행된다는 것입니다.

incron 을 사용 하여이 작업을 시도했지만 루트 권한으로 user1이 수동으로 스크립트를 실행할 수 있지만 incron 데몬은 실제로 다른 user2의 파일 생성 이벤트에 의해 자동으로 트리거되지 않기 때문에 주요 문제가 계속 발생합니다.

나는 협의 가 더 나은 대안이 될지에 대해 생각 했지만 이것의 구문이 어떻게 작동하는지 확실하지 않습니다. 이 작업을 수행하는 더 좋은 방법이 있거나 inoticoming 을 사용 하면/home/user1/watched 디렉토리 를보고 /usr/local/bin/syncbh.sh해당 디렉토리 내에서 파일을 만들거나 수정 하면 스크립트를 실행 하도록 명령 구문이 무엇입니까?

도움을 주시면 감사하겠습니다.


어느 사용자가 스크립트를 실행해야합니까?
AB

그리고 어떤 사용자가 실행해야 inoticoming합니까?
AB

귀하의 요구에 맞는 답변을 수락하고 해당 답변에 현상금을 제공합니다.
Helio

답변:


5

사용 inoticoming:

부팅시 /etc/init.d/실행 되는 스크립트를 넣을 수 있습니다 inoticoming.

  1. 폴더에 대한 inoticoming마지막 로그 를 보유 할 새 폴더를 작성하십시오 .pidwatchedsudo 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
  • 프로세스가 backgound에서 실행 중이며 /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.