두 서버 간에 디렉터리를 전송하고 싶지만 전송하기 전에 원격 호스트의 디렉터리를 압축한 다음 다른 호스트로 압축을 풉니다. 나는 모든 것을 파이프로 연결하여 하나의 라이너로 수행하는 것이 가능하다고 확신합니다.
호스트 간에 직접 전송할 수 있으면 확실히 더 좋을 것이라는 것을 알고 있지만 여기에는 키 전송 등이 포함되며 저는 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