예술적인 유닉스 유틸리티 : netcat 과 tar 을 이용한 리모트 백업

연구실에서 간간히 서버관리 역할도 하고 있는데, 최근 제가 관리하던 서버가 맛탱이가 가는 바람에 해당 서버의 데이터를 백업해야 할 일이 생겼습니다. 이번에 백업을 하면서 예전에 배워두었던 netcat 과 tar 의 조합으로 편리하게 했습니다. 이 조합은 다음과 같은 상황에서 빛을 냅니다.

  • 백업할 파티션이 대부분 차 있어 로컬 파티션에 백업할 수 없을 때
  • 퍼미션을 유지하며 리모트 머쉰으로 복사 할 때

tar 에서 f 를 빼고 다음과 같이 하면 stdout 으로 묶은 내용을 출력합니다. 이걸 netcat 로 리모트 머쉰에 쏘는 거지요. 그럼 netcat 를 listen mode 로 켜둔 리모트 머쉰에서는 이 데이터를 받아서 tar 에게 파이프(pipe)로 건내주어 파일로 저장되게 합니다. 그럼 명령어로 한번 볼까요?

우선 백업을 저장할 머쉰 아래 명령을 먼저 수행합니다.

nc -l -p ${PORT} | tar xvf

-l 은 listen mode 로 netcat 를 작동 한는 옵션이며 이렇게 해야 소켓을 열고 접속 요청을 대기 합니다. 다시 말해 서버 처럼 작동합니다. ${PORT} 에는 대기할 port 번호를 입력합니다.

그리고 백업할 데이터가 있는 머쉰, 즉 로컬머쉰에서 다음과 같이 합니다.

tar cvf ${DIR} | nc -q 0 ${HOSTNAME} ${PORT}

nc 에서 -q 명령은 EOF 를 만난후 몇초후에 nc 를 종료할 것인지를 나타냅니다. 위 명령에서는 -q 0 이므로 EOF 를
만나면 바로 종료됩니다. -q 명령을 안쓰면 tar 명령이 끝나도 프롬프트가 나오지 않고 대기하게 되므로 언제 종료되었는지
알기가 힘듭니다. ${HOSTNAME} 은 저 위에 백업을 저장할 머쉰의 주소 입니다.

tar 의 다양한 옵션들을 추가 하면 더욱 쓸만해 집니다. 저 같은 경우 홈 디렉토리를 그대로 백업하기 위해 다음과 같이 합니다.

백업 데이터를 저장하는 머쉰에서

nc -l -p ${PORT} tar xjvpf

백업할 데이터가 있는 머쉰에서

tar cjvpf /home | nc -q 0 ${HOSTNAME} ${PORT}

참고로 말씀드리면 j 는 bzip2 로 압축하는 옵션이며 p 는 퍼미션, 즉 uid와 gid 를 그대로 유지합니다. 아마 tar 옵션을 많이 아신다면 다양한 응용이 가능할 것 같습니다.

오늘도 이 글을 쓰면서 느끼는 거지만 파이프와 함께하는 유닉스 유틸리티들은 말 그대로 예술인 것 같습니다.