본문 바로가기

일상

서버 백업 파일을 만들지 않고 내 PC로 바로 받기 (tar 스트림과 SSH 파이프)

반응형

백업할 디스크 여유가 없는 서버에서 압축 파일을 만들지 않고 곧바로 로컬에 내려받는 방법입니다.


1. 백업의 진짜 걸림돌은 디스크다


서버 디렉터리를 통째로 받아 두려고 할 때 보통은 이렇게 합니다. 서버에서 tar 로 압축 파일을 만들고, 그걸 내려받고, 마지막에 서버의 임시 파일을 지웁니다.


문제는 첫 단계인데, 압축 파일을 놓을 자리가 서버에 있어야 합니다. 원본이 3GB면 압축본까지 같은 디스크에 얹혀야 하니, 여유가 빠듯한 서버에서는 이 단계에서 막힙니다. 운 나쁘면 백업하다가 디스크를 채워 서비스에 영향을 주기도 합니다.


지우는 것도 잊기 쉬워서, 몇 달 뒤에 용량을 훑다가 backup_20250301.tar.gz 같은 파일을 발견하는 일이 생깁니다.


2. 파일로 만들지 말고 흘려보낸다


tar 는 결과를 꼭 파일로 써야 하는 도구가 아니라 표준출력으로 내보낼 수 있고, ssh 는 원격 명령의 출력을 그대로 내 쪽으로 넘겨줍니다. 이 둘을 이으면 서버에 아무것도 남기지 않고 로컬 파일로 바로 받을 수 있습니다.



서버 쪽에서는 압축 결과가 메모리와 네트워크를 거쳐 그대로 빠져나가기 때문에 임시 파일이 생기지 않고, 따라서 지울 것도 없습니다.


3. 압축을 어디서 할지 정한다


압축 위치는 상황에 따라 고르면 되는데, 기준은 단순합니다.


- 서버에서 압축 : 네트워크로 나가는 양이 줄지만 서버 CPU를 씁니다. 운영 중인 장비라면 부담이 됩니다


- 로컬에서 압축 : 서버는 읽어서 보내기만 하니 가볍지만 원본 크기 그대로 전송됩니다


운영 서버에서 낮에 받아야 한다면 로컬 압축이 안전하고, 회선이 느리거나 과금되는 구간이라면 서버 압축이 유리합니다. 텍스트 로그처럼 잘 줄어드는 자료는 서버 압축의 이득이 크고, 이미지나 이미 압축된 파일은 어느 쪽이든 큰 차이가 없습니다.


4. 걸리는 함정 세 가지


첫째, 표준출력에 다른 게 섞이면 안 됩니다. 아카이브가 지나가는 통로에 진행 메시지 한 줄이라도 끼어들면 파일 전체가 깨집니다. 그래서 -v 같은 옵션을 붙일 때는 그 출력이 표준출력이 아닌 곳으로 나가는지 확인해야 하고, 확신이 없으면 아예 붙이지 않는 편이 낫습니다.


둘째, sudo 가 비밀번호를 물으면 멈춥니다. 화면에는 아무것도 안 뜨고 그냥 멈춰 있는 것처럼 보이는데, 원격 쪽에서 입력을 기다리는 중이라 그렇습니다. 해당 명령에 한해 비밀번호를 묻지 않도록 설정하거나, 애초에 권한 없이 읽을 수 있는 경로만 대상으로 잡는 게 깔끔합니다.


셋째, 로컬 저장이 바이너리 안전해야 합니다. 리다이렉트가 내용을 그대로 쓰지 않고 인코딩을 건드리면 받은 파일이 열리지 않는데, 이건 셸에 따라 실제로 벌어지는 일이라 미리 알고 있어야 합니다. 받자마자 무결성부터 확인하는 습관이 안전합니다.


5. 받았으면 바로 검증한다


스트림으로 받는 방식은 중간에 끊겨도 파일 자체는 만들어집니다. 크기만 보고 넘어가면 몇 달 뒤 복원할 때야 깨진 걸 알게 되므로, 받은 직후에 확인하는 게 좋습니다.



압축이 온전한지 보고, 안에 들어 있는 항목 수가 예상과 맞는지까지 보면 대부분 걸러집니다. 복원은 방향만 반대로 하면 되니 별도 도구가 필요하지도 않습니다.


6. 정리


- 백업이 막히는 지점은 대개 압축본을 놓을 서버 디스크


- tar표준출력으로 흘려 ssh 로 받으면 서버에 아무것도 안 남는다


- 압축은 서버에서 하면 전송량이 줄고 CPU를 쓰고, 로컬에서 하면 반대다


- 표준출력 오염, sudo 대기, 바이너리 안전하지 않은 리다이렉트가 함정이다


- 받은 직후 무결성과 항목 수를 확인한다


백업은 만드는 것보다 복원되는지가 중요한데, 스트림 방식은 과정이 단순한 대신 실패해도 티가 잘 안 납니다. 받는 명령과 확인하는 명령을 한 세트로 묶어 두시면 그 위험이 대부분 사라집니다.


함께 보면 좋은 글:
- 안 쓰는 AWS 인프라를 완전히 내려 요금 0원으로 만들기 (삭제 순서와 숨은 과금 함정) - 같은 서버 정리 작업 편
- PowerShell에서 > 리다이렉트로 저장한 파일이 깨질 때 (바이너리, UTF-16 인코딩 함정) - 받은 파일이 깨지는 이유 편


여기까지 서버 파일을 임시 파일 없이 SSH로 바로 받는 방법에 대해서 작성해봤습니다. 여기까지 읽어주셔서 감사합니다!

반응형