우리는 두 개의 서버를 동기화하는 데 사용하고 싶습니다 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
전혀 업데이트되지 않습니다 .
결론:
inotify
잘 작동하고 파일 시스템의 모든 변경 사항을 감지하고 작업을 제외한 작업을 실행합니다unison
.unison
데몬 에 의해 호출되는 경우를 제외하고는 명령줄 및 일괄 처리에서 잘 작동합니다incrond
.
내가 뭔가를 간과하고 있는 걸까?
답변1
SSH 연결을 설정하려면 클라이언트가 서버에 인증해야 합니다. 아마도 비밀번호로 보호된 파일에 키가 저장되고 SSH 에이전트에 로드되는 키 기반 인증을 사용하고 있을 것입니다. SSH 클라이언트는 환경 변수를 통해 에이전트를 찾는 방법을 알고 있습니다 SSH_AUTH_SOCK
. cron 또는 incron 작업에서 환경은 대화형 세션과 동일하지 않고 아주 최소한의 환경이므로 SSH_AUTH_SOCK
SSH 클라이언트가 원격 시스템에 연결할 수 없습니다.
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이 그런 식으로 임의의 코드를 실행하도록 속일 수 있는지 여부는 알 수 없습니다.