SSH를 통해 폴더를 보낸 다음 압축하여 다시 보냅니다.

SSH를 통해 폴더를 보낸 다음 압축하여 다시 보냅니다.

eml 파일이 포함된 폴더를 "A"에서 "B"로 보낸 다음 7z로 압축하고 내가 가지고 있는 것을 "A"로 다시 보내야 합니다.

ssh user@server "tar -cf - .folder" | 7z a -si compressed_folder.7z

하지만 tar.7z를 만들기 때문에 7z 아카이브를 만들기 전에 tar의 압축을 풀어야 합니다. 어떻게 해야 할까요?

추신. RAM과 CPU가 부족하기 때문에 "A"로 압축할 수 없습니다.

답변1

보기 흉하다고 약속하지만 테스트를 해보니 내 Linux 상자에서 작동합니다.

가정: 하나의 폴더만 백업하려고 하며(여러 폴더에 쉽게 적용할 수 없음) 클라이언트 측에서 아무 것도 덮어쓰지 않는다고 믿습니다. 폴더는 원격 서버의 홈 디렉터리에 있습니다. SSH에 대해 비밀번호 없는 인증을 설정하고 싶을 수도 있고, 그렇지 않으면 비밀번호를 두 번 입력해야 할 수도 있습니다.

경고: 이 작업을 수행하는 방법에는 OS별로 특이한 점이 있을 수 있습니다. 예를 들어, crontab을 수행하는 경우 경로를 보다 구체적으로 만들고 싶을 수 있습니다. 아마도 BSD를 사용하고 있으므로 bash기본적으로 BSD가 없을 수도 있습니다 . 나는 date 명령을 사용하여 서버에 다시 업로드할 고유한 파일 이름을 생성하지만 호스트마다 다르게 작동할 수 있습니다. 여기에는 오류 검사도 없지만 스크립트에 쉽게 추가할 수 있습니다.

일을 단순화하기 위해 몇 가지 변수를 만들었습니다. $cssh 변수를 사용하면 SSH 연결 문자열을 반복할 필요가 없습니다. 폴더 이름을 test/로 변경했지만 한 번만 사용되므로 변수에 넣지 않았습니다.

bash출력을 쉽게 억제할 수 있도록 or (보통 Linux에서는 상호 교환 가능) 으로 모두 래핑하고 있지만 sh, 출력 억제에 관심이 없다면 이를 제거하고 길이를 다소 줄일 수 있습니다.

bash -c 'file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z; cssh="user@host"; folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`; 7z a $file $folder && scp $file $cssh:~ && rm $file && rm -r $folder' > /dev/null 2>&1

사용이 ssh어려운 요구 사항이고 원하지 않는 경우 ssh를 통해 파일을 복사하는 데 scp사용할 수 있습니다 .dd

sh -c 'file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z; cssh="user@host"; folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`; 7z a $file $folder && dd if=$file | ssh $cssh "dd of=$file" && rm $file && rm -r $folder' > /dev/null 2>&1

일반 텍스트 파일로 많은 대역폭을 절약할 수 있기 때문에 로컬 호스트로 스트리밍하기 전에 아카이브를 gzip으로 압축했습니다. 파이프를 제거할 수 있지만 gzip -9c, 그렇게 하려면 로컬 호스트에서 해당 압축 해제를 제거해야 합니다.gzip -d

또는 더 명확하게 만들기 위해 첫 번째 명령을 스크립트에 넣으려면 다음을 수행하십시오.

#!/bin/sh

# make a unique file name to temporarily use for storing 7z'd folder
# will look something like bu2019-09-29-00h18m49s_Sunday.7z
file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z; 

# SSH connection strong
cssh="user@host"; 

# downloads the remote folder and gets the name of the folder in one variable
folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`;

# compress, upload, remove folder, remove file
7z a $file $folder && scp $file $cssh:~ && rm $file && rm -r $folder

관련 정보