** 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
를 쓰고 따옴표를 쓰면 된다고도 한다. 이건 시험해보지 않아서 결과를 장담할 순 없지만, 해당 글에서 답으로 채택되었으니 제대로 작동한다고 볼 수 있겠다.