scp와 rsync(secure Copy & remote synchronization)

원격 호스트에 또는 원격으로부터 파일을 전송해보자!

#Knowledge #Linux #원격파일전송


scp란 무엇일까?

scp는 secure copy의 약자로 로컬 호스트와 원격 호스트 또는 두 개의 호스트 간에 파일을 전송하는 수단입니다.
SSH(Secure Shell)을 통한 파일 전송 방식이며 별도의 FTP 클라이언트를 설치하지 않아도 파일 송수신이 가능합니다.


scp 사용법

사용법은 아래와 같습니다. 먼저, 로컬 호스트에서 원격 호스트로 파일을 전송할 때는

scp 파일경로/파일명 계정명@타겟서버명:도착경로/파일명

# 예를 들어, Desktop 디렉터리에 있는 test.txt 파일을 madlife 서버의 root 디렉터리에 보내고 싶다면,
scp Desktop/test.txt madplay@madlife:/root # madplay는 계정명


반대로 원격 호스트에서 로컬 호스트로 파일을 전송할 때는

scp 계정명@서버명:파일경로/파일명 도착로컬경로

# 예를 들어, 위에서 옮긴 test.txt를 로컬로 옮기고 싶다면
scp madplay@madlife:/root/test.txt /Desktop/test.txt


옵션으로는
r : 하위 폴더를 포함하여 모두 복사하는 Recursive,
p : 권한 및 속성을 유지하는 Preserve,
c : 압축을 실시하는 Compress 옵션 등이 있습니다.


rsync란 무엇일까?

rsync는 remote synchronization의 약자로서 원격에 있는 파일과 디렉터리를 복사하고 동기화합니다.


rsync 사용법

rsync는 사용법이 참 많습니다. 여기서는 –daemon 옵션을 이용하여 서버 모드로 사용 하는 방법을 알아봅시다.
rsync 서버의 경우 rsync 관련 파일을 수정해줍니다.

vi /etc/xinetd.d/rsync

# disable의 값을 no로 변경해줍니다.

# default: off
# description: The rsync server is a good addition to an ftp server, as it \
#       allows crc checksumming etc.
service rsync
{
    disable = no
    socket_type        = stream
    wait               = no
    user               = root
    server             = /usr/bin/rsync
    server_args        = --daemon
    log_on_failure     += USERID
}


다음으로 접속 alias 및 서버를 설정합니다.

# 아래 파일이 없으면 새로 작성합니다.

vi /etc/rsyncd.conf

[alias 이름]
path = /home/www
uid = nobody
gid = nobody
use chroot = yes
read only = false
hosts allow = 허용 IP

# path : 서비스 대상 디렉토리 위치
# uid : 사용자의 id / 기본값은 nobody
# gid : 사용자의 그룹 id / 기본값은 nobody
# use chroot : 위의 path를 루트 디렉토리로 사용(yes)
# read only : 읽기 전용(클라이언트 -> 서버인 경우는 no로 설정)
# hosts allow : 호스트별 접속 허용 설정 / 기본값은 all host / 접근을 허용할 IP를 적으면 됩니다.

# comment : 해당 설정에 대한 설명, 코멘트
# max connections : 동시 접속자 수
# timeout : 타임아웃 시간 설정 


마지막으로 xinetd를 다시 시작합니다.

/etc/init.d/xinetd restart

# rsync는 873 포트를 사용하므로 막혀있는 경우 허용해줘야 합니다.

추가) CentOS 7 버전 관련

systemctl start rsyncd.service
# 재시작은 systemctl restart rsyncd.service
# 서버 재부팅 후에는 systemctl enable rsyncd.service


다음으로 rsync 클라이언트 설정입니다. 먼저 rsync 접속 여부를 확인합니다.

telnet <rsync 서버 IP > 873
# 예를 들면, telnet xxx.xxx.xxx.xxx 873
# telnet을 이용하여 873 포트가 정상 연결되는지 확인합니다.


rsync를 실행합니다.

rsync -avz <IP>::<위에서 지정한 alias>경로 디렉토리

#예를 들어, rsync 서버 설정이 된 것을 madlife(123.123.123.123)라고 가정하고
#madlife로부터 데이터를 가져와 동기화 시킬 서버를 madplay라고 가정하고
#madlife의 /home/www를 madplay의 /home/www로 내용을 동기화 시킨다면

#madplay 서버에서 
rsync -avz madlife::alias이름/home/www /home/www 
rsync -avz 123.123.123.123::alias이름/home/www /home/www


옵션으로는
a : 퍼미션 소유주 및 위치까지 그대로 가져오는 Archive,
v : 동기화 상세 진행사항을 보여주는 Verbose,
r : 지정한 디렉터리의 하위 디렉터리까지 재귀적으로 실행하는 Recursive,
p : 원본 파일 시간의 수정시간, 권한 등의 정보를 보존하는 Perms,
z : 데이터를 압축 전송하는 Compress 옵션 등이 있습니다.


scp와 rsync의 차이

원격으로 파일을 전송할 때 scp와 rsync를 주로 사용합니다. 그렇다면 이들의 차이는 무엇일까요?
우선 rsync는 scp보다 빠릅니다. remote-update 프로토콜을 이용해서 차이가 있는 파일만 복사하기 때문이지요.
가장 처음에는 모든 파일, 디렉터리를 복사하겠지만 이후부터는 차이가 있는 파일만 복사하기 때문에 효율적입니다.

한편, Symbolic Link 처리 방식에 차이가 있습니다.
scp는 전송하는 파일 중에 심볼릭 링크가 있으면 이를 유지하지 않고 링크된 원본 파일을 전송합니다.