방화벽 뒤에 있을 때 원격 서버에서 SSH로 tar 파이프를 사용하여 두 원격 호스트 간에 복사하는 방법은 무엇입니까?

방화벽 뒤에 있을 때 원격 서버에서 SSH로 tar 파이프를 사용하여 두 원격 호스트 간에 복사하는 방법은 무엇입니까?

두 서버 간에 디렉터리를 전송하고 싶지만 전송하기 전에 원격 호스트의 디렉터리를 압축한 다음 다른 호스트로 압축을 풉니다. 나는 모든 것을 파이프로 연결하여 하나의 라이너로 수행하는 것이 가능하다고 확신합니다.

호스트 간에 직접 전송할 수 있으면 확실히 더 좋을 것이라는 것을 알고 있지만 여기에는 키 전송 등이 포함되며 저는 Unix 단일 와이어 전동 공구를 좋아합니다. 나는 사람들이 이를 수행하기 위한 몇 가지 다른 방법을 생각해낼 수 있다고 확신합니다. 나는 가장 짧은 구문과 가장 보수적인 대역폭을 찾고 있습니다.

먼저 나는

ssh -n REMOTEHOST 'tar zcvf - DIRTOCOPY' | localZip.tar.gz 

답변1

무엇과 비슷하다jw013별도의 압축/압축 풀기 단계를 사용하는 것이 주석에서 제안되었습니다. 즉, 두 개의 ssh 명령을 파이프와 결합합니다.

compress=gzip
decompress=gunzip

ssh remote1 "cd srcdir; tar cf - dir | $compress" |
ssh remote2 "cd destdir; $decompress | tar xvf -"

압축/압축 해제는 구성 가능하며 tar.

고쳐 쓰다

파이프라인에 체크섬 유효성 검사를 추가할 수도 있습니다.

compress=gzip
decompress=gunzip

ckprg=md5sum
cksum=/tmp/cksum

ssh remote1 "cd srcdir; tar cf - dir | $compress | tee <($ckprg > $cksum)" |
ssh remote2 "cd destdir; tee <($ckprg > $cksum) | $decompress | tar xvf -"

ssh remote1 cat $cksum
ssh remote2 cat $cksum

답변2

두 호스트 간에 직접 연결을 설정할 수 있으면 전송 속도가 더 빨라집니다. 그러나 이것이 누락된 가장 쉬운 방법은 cp.sshfs

mkdir ~/net ~/net/sourcehost ~/net/destinationhost
sshfs sourcehost: ~/net/sourcehost
sshfs destinationhost: ~/net/destinationhost
cp -Rp ~/net/sourcehost/path/to/source ~/net/destinationhost/path/to/destination

압축을 활성화하세요.~/.ssh/config:

Host sourcehost
HostName sourcehost.example.com
Compression yes
CompressionLevel 9

Host destinationhost
HostName destinationhost.example.com
Compression yes
CompressionLevel 9

답변3

귀하가 제안한 답변:

ssh -n REMOTEHOST 'tar zcvf - DIRTOCOPY' | localZip.tar.gz

나에게는 작동하지 않습니다. 파일에 대한 파이프가 실패합니다.

나는 이것을 했고 그것은 효과가 있었다:

ssh -n REMOTEHOST 'tar zcvf - DIRTOCOPY' | cat - > localZip.tar.gz

표준 입력을 통해 "cat"으로 파이프하고 출력을 파일로 리디렉션합니다.

또 다른 해결책은 "| cat -"을 제거하고 SSH 출력을 tarball로 직접 보내는 것입니다.

ssh -n REMOTEHOST 'tar zcvf - DIRTOCOPY' > localZip.tar.gz

관련 정보