Как скопировать между двумя удаленными узлами, используя tar, переданные в SSH с удаленного сервера, когда за брандмауэром?

Я хотел бы передать каталог между двумя серверами, но перед отправкой сжимать каталог на удаленном хосте, а затем распаковать на другой хост. Я уверен, что можно полностью проложить все это и сделать это в одном лайнере.

Я понимаю, что было бы лучше, если бы я мог напрямую переходить между хостами, но это связано с передачей ключей, а что нет, и я люблю инструменты Unix One line power. Я уверен, что люди могут придумать несколько способов сделать это. Я ищу кратчайший синтаксис и большую полосу консервативности.

Чтобы начать, у меня есть

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

Подобно тому, что 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 

Ваша передача будет быстрее, если вы сможете установить прямое соединение между двумя узлами. Но, не имея этого, самый простой способ – использовать 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 

Ваш предложенный ответ:

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

не работал для меня – труба в файл не удалась.

Я сделал это вместо этого, и это сработало:

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

Поместите его на «кошку» с помощью стандартного ввода и перенаправьте вывод в файл.

другим решением было бы удалить «| cat -» и просто отправить SSH-файл непосредственно в tarball:

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