rsync, ssh 를 사용한 서버 파일 복사.

** cron 작업과 연관하려면 다음 글 참고.


AWS Lightsail 에, 매일/매주 특정 파일및 DB를 복사하게끔 Cron job 을 설정해놓았다. 문제는, 그게 저장된 위치가 시스템이 저장되는 곳과 같은 디스크라는 데 있다. ‘보관본’의 관점에서 보면, 전혀 쓸모가 없다.
AWS 에 독립된 디스크가 있고, 그곳으로 자동 저장하게끔 할 수 있다면 좋겠지만, 그건 또 그것 나름대로 돈이 드니 굳이 그럴 이유는 없고.

집구석에 SBC 등으로 된 서버가 있고, 그게 24시간 돌아간다면, 이 곳으로 자동 복사하게끔 설정해놓을 수도 있지만..
굳이 그럴 필요까지는 없을 듯 하여, 그냥 생각날 때마다 내 PC 로 저장하게 하려고 한다.

그 때 필요한 명령, scp.

그런데, 조금 검색을 해보니 scp 보다는 rsync 를 쓰라고 한다. (정확한 이유는 모르겠다.)
아무튼, rsync 와 ssh 의 조합은 이런 식이 된다.

rsync -avz -e ssh Host:/Directory /home/xxx/yyy

Host 는 ssh config 에 설정된 호스트 이름이다. 직접 서버 주소를 입력할 수도 있지만, 이렇게 하는 편이 만배는 쉽고 편하다. 자주 쓴다면 Alias 또는 Script 까지 만드는 게 좋다.

rsync 선택사항에 대해선 아래에 간략하게 정리.

-a : -rlptgoD 와 동일
-v : 설명 추가
-z : 압축
...
-r : Recursive (하위 디렉토리 포함)
-l : symlink 는 symlink 로 취급 (원본이 심링크라면 복사본도 심링크)
-p : Preserve Permissions (파일 허가권 동일하게 보존)
-t : Preserve modification Times (파일 수정시간 동일하게 보존)
-g : Preserve Group (그룹명 보존)
-o : Preserve Owner (사용자명 보존)
-D : --devices --specials 와 같은데, 디바이스 파일, 스페셜 파일도 복사하라는 뜻이다.

-z 는, 사실 별 필요는 없을 듯 하다. 어차피 저 파일들은 모두 압축이 돼 있으므로.

만약, -a 를 한 뒤에, 특정 설정을 무시하고 싶다면? 예를 들어, -a 를 했으나, 그룹명은 보존하지 않고 현 디렉토리 설정을 따르고 싶다면?

–no-X (no 앞에 줄표가 2개다.) 를 붙이면 된다. -a 를 쓰면서도 그룹명은 보존하지 않겠다면,

rsync -avz --no-g -e ssh Host:/Directory /home/xxx/yyy

** 디렉토리 뒤에 / 를 붙이고 안붙이고의 차이!!!

다음 두 명령의 결과가 같을까?

rsync -av -e ssh Host:/mydir1 /home/xxx/yyy
rsync -av -e ssh Host:/mydir1/ /home/xxx/zzz

첫번째 명령은, /home/xxx/yyy/mydir1 을 생성한다.
두번째 명령은, /home/xxx/zzz 아래에, mydir1 산하의 파일들을 복사한다.

디렉토리 끝에 슬래시를 붙이면, 그 산하 파일(및 디렉토리)들을 복사하라는 뜻이 되고, 슬래시가 없으면, 그 자체를 복사하라는 뜻이 된다.


위에는 쓰지 않았지만, -u, --update 옵션도 있다.
이건 목적지에 이미 같은 이름의 파일이 있을 때, 원본이 새로울 경우에만 덮어쓰기를 시도하게끔 한다. 똑같은 파일을 계속 덮어쓸 이유는 없으므로, 속도 면에서나 네트웍 사용량 면에서나 -u 가 유리하다.

한가지 더. 목적지 디렉토리의 권한(umask)을 그대로 따르게끔 복사하려면 다음과 같은 긴 구문을 사용해야 한다.

# 순수하게,
rsync --no-p --no-g --chmod=ugo=rwX src/ dest/
# 섞는다면,
rsync -avu --no-p --no-g --chmod=ugo=rwX src/ dest/

마지막으로, 만약, Host 에 있는 디렉토리/파일명에 공백이 포함되어 있다면?

예를 들어, Host 에 있는 /mydir 1/myfile 231 을 복사하고자 한다면 어떻게 해야 하나?

rsync -av -e ssh Host:/mydir 1/myfile 231 /home/xxx

위 명령은 결과를 보기 전에도 오류 발생을 예측할 수 있다.
이렇게 바꾸면 될까?

rsync -av -e ssh "Host:/mydir 1/myfile 231" /home/xxx

그런데, 이렇게 해도 오류가 발생한다. mydir 과 1이 각각 다른 인수로 취급된다.
검색 결과, 이렇게 하라는 글을 찾을 수 있었다.

rsync -av -e ssh "'Host:/mydir 1/myfile 231'" /home/xxx

따옴표를 홑/겹 이중으로 쓰면 된다. 순서는 관계없다고 한다. 겹/홑 도 되고 홑/겹 도 된다.
또는, -s, --protect-args 를 쓰고 따옴표를 쓰면 된다고도 한다. 이건 시험해보지 않아서 결과를 장담할 순 없지만, 해당 글에서 답으로 채택되었으니 제대로 작동한다고 볼 수 있겠다.

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.