incrond로 Unison 실행(inotify cron 데몬)

incrond로 Unison 실행(inotify cron 데몬)

우리는 두 개의 서버를 동기화하는 데 사용하고 싶습니다 unison. 명령줄과 bash 파일에서 다음 명령이 제대로 작동합니다.

unison -batch /var/www/html/test ssh://host-2//var/www/html/test

파일이 동기화되고 unison.log업데이트되고 있습니다. 여태까지는 그런대로 잘됐다.

설명된 대로 명령줄에서 .unison/default.prf간단히 실행하는 것과 같은 기본 설정 파일과 결합하여unison여기, 일도 잘 진행되고 있어요.

또한 inotify cron 데몬을 설치했는데 incrond원활하게 실행됩니다. 다음 cron 작업이 정상적으로 실행되고 있습니다.

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE touch /root/test

/root/test파일을 변경할 때마다 업데이트됩니다./var/www/html/test

여태까지는 그런대로 잘됐다! 그러나 incrontab을 사용하여 작동하지 않는 유일한 사항은 다음과 같습니다.

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/bin/unison

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/local/sbin/unison

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison -batch /var/www/html/test ssh://host-2//var/www/html/test

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/bin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/local/sbin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test'

unison.log원격 서버를 업데이트하는 것은 물론 파일 에 아무것도 표시되지 않습니다. 다음도 아무 것도 출력되지 않습니다.

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison &> /root/test.log

/root/test.log생성되지도 않습니다.

이름이 지정된 배치 파일을 사용하는 또 다른 테스트 sync.sh도 작동하지 않습니다.

인크론탭에서:

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /root/sync.sh

그리고 sync.sh:

#!/bin/bash

touch /root/test
/usr/bin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test

다시 말하지만, /root/test는 잘 작동합니다. 즉, 에서 파일을 업데이트할 때마다 inofify가 훌륭하게 작동 /var/www/html/test하지만 에서 결과가 전혀 나오지 않는다는 의미입니다 unison.

/var/log/cron은 다음과 같습니다:

May 21 06:33:44 Host-1 incrond[28339]: (root) CMD (sh /root/sync.sh)

unison.log전혀 업데이트되지 않습니다 .

결론:

  1. inotify잘 작동하고 파일 시스템의 모든 변경 사항을 감지하고 작업을 제외한 작업을 실행합니다 unison.
  2. unison데몬 에 의해 호출되는 경우를 제외하고는 명령줄 및 일괄 처리에서 잘 작동합니다 incrond.

내가 뭔가를 간과하고 있는 걸까?

답변1

SSH 연결을 설정하려면 클라이언트가 서버에 인증해야 합니다. 아마도 비밀번호로 보호된 파일에 키가 저장되고 SSH 에이전트에 로드되는 키 기반 인증을 사용하고 있을 것입니다. SSH 클라이언트는 환경 변수를 통해 에이전트를 찾는 방법을 알고 있습니다 SSH_AUTH_SOCK. cron 또는 incron 작업에서 환경은 대화형 세션과 동일하지 않고 아주 최소한의 환경이므로 SSH_AUTH_SOCKSSH 클라이언트가 원격 시스템에 연결할 수 없습니다.

SSH 연결을 설정할 수 없는 경우 Unison은 동기화할 파일을 찾기도 시작하지 않으며 unison.log.

스크립트의 표준 오류에 오류 메시지가 있지만 어디에도 기록되지 않습니다. exec 2>&1 >>~/.unison-sync.log; date스크립트 시작 부분에 다음과 같은 것을 추가하십시오 .

SSH 연결이 작동하려면 Unison 작업이 에이전트에 액세스할 수 있도록 준비하거나 비밀번호 없는 키를 설정해야 합니다. 대리인을 통해 진행하고 싶다면 다음을 참조하세요.Crontab에서 쉘 스크립트를 사용하여 원격 시스템에 SSH로 연결할 수 없습니다.; 하지만 로그인되어 있는 동안에만 작동합니다. 동기화가 항상 작동하도록 하려면 비밀번호 없는 키가 유일한 해결책입니다. Unison을 실행하고 SSH를 루트로 실행하고 있으므로 개인 키는 /root/.ssh계정이 아닌 에 있어야 합니다 . 의 관련 옵션도 마찬가지입니다 .ssh/config. 서버 측에서는 지시문을 사용하여 특정 unison 명령을 실행하기 위해서만 공개 키에 권한을 부여할 수 있습니다 command=…( .ssh/authorized_keys참조:하나의 명령만 실행하는 UNIX 계정 만들기예를 들어). 명령 제한을 사용하면 누군가 로컬 루트 계정에 대한 액세스 권한을 얻은 경우 해당 특정 unison …명령을 에서만 실행할 수 있습니다 host-2. Unison이 그런 식으로 임의의 코드를 실행하도록 속일 수 있는지 여부는 알 수 없습니다.

관련 정보