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


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.