Skip to main content

command rsync

기존에 인스턴스와 로컬 간에 파일을 공유해야 할 때 scp 커맨드를 주로 사용하곤 했었는데 scp보다 더 속도가 빠른 커맨드인 rsync를 알고나서는 줄곧 rsync 커맨드를 사용해왔습니다. scp는 secure copy의 약자로 로컬 호스트와 원격 호스트 또는 두 개의 호스트 간에 파일을 전송하는 수단입니다. SSH(Secure Shell)을 통한 파일 전송 방식이며 별도의 FTP 클라이언트를 설치하지 않아도 파일 송수신이 가능합니다. rsync는 Remote synchronization의 약자로 직역하자면 원격 동기화라는 뜻을 가졌으며 원격으로 파일과 디렉토리를 복사하거나 동기화하기 위해 사용합니다. 파일 및 디렉토리의 소유자와 그룹권한 등 파일의 부가정보까지 복사가 가능하며 SCP와 동일하게 SSH 프로토콜을 사용합니다.

옵션

  • -v: verbosity를 높이는 옵션으로 복사하는 과정을 더 자세하게 보여줍니다.
  • -z: compress를 주는 옵션으로 파일을 복사할 때 압축해서 복사합니다.
  • -h: 사람이 읽기 쉬운 형태로 복사 결과들을 출력해줍니다.
  • -a: archive 모드로 -rlptgoD 옵션을 적용한 것과 같습니다.
  • -r: 디렉토리를 복사할 때 사용하는 옵션입니다.
  • -l: symlink는 symlink 형태로 복사하는 옵션입니다.
  • -p: 파일과 디렉토리들의 권한을 유지하는 옵션입니다.
  • -t: 수정시간을 유지하는 옵션입니다.
  • -g: 그룹 속성을 유지하는 옵션입니다.
  • -o: 소유자 속성을 유지하는 옵션입니다.

| rsync -avz -delete -partial -e "ssh -o StrictHostKeyChecking=no -i 키페어" 소스 데스티네이션

위 커맨드에서 로컬에서 리모트로 파일을 전송한다면 소스 위치에 제가 전송하려는 파일 위치가 되고 데스티네이션에 원격 서버의 디렉토리 위치가 됩니다. 반대로 원격 서버에서 로컬로 파일을 전송 받는다면 소스는 원격 서버의 디렉토리 및 파일이 될 것이고 데스티네이션에는 로컬 서버의 디렉토리 및 파일이 됩니다.

원격 서버가 위치하게 될 소스나 데스티네이션 위치에는 원격 서버의 유저와 아이피를 포함해주어야 합니다. 예를 들면 다음과 같습니다.

원격 서버 -> 로컬 서버

rsync -avz -delete -partial -e "ssh -o StrictHostKeyChecking=no -i centos.pem" centos@125.6.36.55:~/test/test.txt ./

로컬 서버 -> 원격 서버

rsync -avz -delete -partial -e "ssh -o StrictHostKeyChecking=no -i centos.pem" test.txt centos@125.6.36.55:~/test.txt

명령어와 옵션이 길기 때문에 저는 배시쉘에서 함수를 만들어서 따로 사용합니다. getRsync 함수는 원격 서버에서 로컬로 가져올 때 사용하며 데스티네이션은 커맨드를 실행하는 위치로 고정하였습니다. 반대로 sendRsync 함수는 로컬 서버에서 원격 서버로 파일을 보낼 때 사용하며 여기서는 데스티네이션을 원격 서버의 루트 디렉토리로 고정하였습니다.

# vi ~/.zshrc
function getRsync() {
keypair_path=$(echo "$1")
user=$(echo "$2")
ip=$(echo "$3")
getfile=$(echo "$4")

echo "키페어: $keypair_path\n인스턴스유저: $user\nIP: $ip\n가져올파일: $getfile"
rsync -avz -delete -partial -e "ssh -o StrictHostKeyChecking=no -i $keypair_path" $user@$ip:$getfile ./
}


function sendRsync() {
keypair_path=$(echo "$1")
user=$(echo "$2")
ip=$(echo "$3")
sendfile=$(echo "$4")

echo "키페어: $keypair_path\n인스턴스유저: $user\nIP: $ip\n전송파일: $sendfile"
rsync -avz -delete -partial -e "ssh -o StrictHostKeyChecking=no -i $keypair_path" $sendfile $user@$ip:~/
}
getRsync [keypair] [user] [IP] [원격서버파일]
sendRsync [keypair] [user] [IP] [로컬서버파일]