반응형

특정 파일 및 폴더를 crontab을 이용하여 원격지 서버에 동기화를 해줘야 하는 경우가 있다.


이런 경우 expect를 설치해서 password입력 부분을 skip하도록 해야 하는데,

아래와 같이 사용을 하면 잘 넘어간다.


spawn rsync -avr -e ssh ORIGIN_DIR root@ip.address:REMOTE_DIR
expect {
      -nocase yes/no {
           send yes\r
           expect eof
      }
      -nocase password: {
           send pw\r
           expect eof
      }
}
exit



보통 다른 사이트에서의 예시를 보면 send 구문 이후에 interact 명령어를 날리는데,

interact를 사용하면, 수동 실행 시에는 정상동작 하지만, crontab으로 돌렸을 때는 동작을 하지 않는다.


이런 경우 interact를 expect eof로 바꾸면, 수동 실행 시에도 잘 되고, crontab으로 실행 시에도 잘된다.


그리고 위 구문 중 -nocase라는게 있는데..

이게 if 문의 역할과 비슷한 역할을 한다.


이게 없으면, 명령어 수행 간 yes/no를 물어보는 부분이 없으면, 이후 진행을 못하게 된다.

따라서, 최초에 실행 시에는 yes/no를 물어보기 때문에 실행이 잘되지만, 그 이후 ssh 키가 원격지에 등록된 상태에서는 yes/no구문을 볼 수 없기 때문에, 동작을 하지 않는 경우가 되버린다.


따라서, expect구문 사용 시에는 -nocase, expect eof를 필수적으로 사용해야 할 것 같다.


send로 명령어 전송 시 \r을 누르는 것도 잊지 말아야 한다.

\r가 빠지면 send 이후 구문에 대해서 입력만 하고, 엔터를 누르지 않기 때문에 미궁에 빠지게 된다. ㅠㅠ

반응형
,