scp и сжимать одновременно, без промежуточного сохранения

Каков канонический способ:

  • scp файл в удаленном месте
  • сжимать файл в пути ( tar или нет, отдельный файл или целую папку, 7za или что-то еще более эффективное)
  • сделайте это без сохранения промежуточных файлов

Я знаком с оболочками:

 tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z 

по существу:

  • перетаскивание всей папки в один tar
  • передавать данные через stdout в stdin программы сжатия
  • применять агрессивное сжатие

Каков наилучший способ сделать это по ссылке ssh с приземлением файла на удаленной файловой системе?


Я предпочитаю не монтировать sshfs .


Это не работает:

 scp <(tar cvf - MyBackups | 7za a -si -mx=9 -so) localhost:/tmp/tmp.tar.7z 

потому как:

 /dev/fd/63: not a regular file 

2 Solutions collect form web for “scp и сжимать одновременно, без промежуточного сохранения”

Есть много способов сделать то, что вы хотите. Самое простое – использовать pìpe:

 tar zcvf - MyBackups | ssh user@server "cat > /path/to/backup/foo.tgz" 

Здесь сжатие обрабатывается tar который вызывает gzip (флаг z ). Вы также можете использовать compress ( Z ) и bzip ( j ). Для 7z сделайте следующее:

 tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z | ssh user@server "cat > /path/to/backup/foo.7z" 

Однако лучший способ – rsync .

  Rsync is a fast and extraordinarily versatile file copying tool. It can copy locally, to/from another host over any remote shell, or to/from a remote rsync dae‐ mon. It offers a large number of options that control every aspect of its behavior and permit very flexible specification of the set of files to be copied. It is famous for its delta-transfer algorithm, which reduces the amount of data sent over the network by sending only the differences between the source files and the exist‐ ing files in the destination. Rsync is widely used for backups and mirroring and as an improved copy command for everyday use. 

rsync имеет слишком много вариантов. Это действительно стоит прочитать через них, но они страшны с первого взгляда. Те, о которых вы заботитесь в этом контексте, являются:

  -z, --compress compress file data during the transfer --compress-level=NUM explicitly set compression level -z, --compress With this option, rsync compresses the file data as it is sent to the desti‐ nation machine, which reduces the amount of data being transmitted -- something that is useful over a slow connection. Note that this option typically achieves better compression ratios than can be achieved by using a compressing remote shell or a compressing transport because it takes advantage of the implicit information in the matching data blocks that are not explicitly sent over the connection. 

Итак, в вашем случае вам нужно что-то вроде этого:

 rsync -z MyBackups user@server:/path/to/backup/ 

Файлы будут сжаты во время транзита и будут распаковываться в месте назначения.


Еще несколько вариантов:

  • Сам scp может сжать данные

      -C Compression enable. Passes the -C flag to ssh(1) to enable compression. $ scp -C source user@server:/path/to/backup 
  • Там может быть способ заставить rsync и 7za играть хорошо, но нет никакого смысла в этом. Преимущество rsync состоит в том, что он будет копировать только биты, которые были изменены между локальными и удаленными файлами. Однако небольшое локальное изменение может привести к очень другому сжатому файлу, поэтому нет смысла использовать rsync для этого. Это просто осложняет вопросы без каких-либо преимуществ. Просто используйте прямой ssh как показано выше. Если вы действительно хотите это сделать, вы можете попробовать, предоставив подглазу в качестве аргумента для rsync . В моей системе я не мог заставить это работать с 7za потому что он не позволяет вам записывать сжатые данные в терминал. Возможно, ваша реализация отличается. Попробуйте что-то вроде ( это не работает для меня ):

     rsync $(tar cf - MyBackups | 7za a -an -txz -si -so) \ user@server:/path/to/backup 
  • Другое дело, что 7z не следует использовать для резервного копирования в Linux . Как указано на странице 7z man:

    НЕ ИСПОЛЬЗУЙТЕ 7-zip-формат для целей резервного копирования в Linux / Unix, потому что:
    – 7-zip не сохраняет владельца / группу файла.

Я думаю, что эта команда сделает трюк

 ssh user@host "cd /path/to/data/;tar zc directory_name" | tar zx 

EDIT: более ранняя версия была с двумя неправильными опциями «f».

Теперь, прежде всего, вы должны выполнить эту команду с целевого хоста. И детали, которые нужно объяснить:

  1. ssh user @ host откроет соединение с хост-машиной, откуда данные будут переданы.
  2. cd / path / to / data будут доставлены в каталог, где хранятся требуемые данные
  3. tar zc * инициирует сжатие и помещает его в STDOUT
  4. Теперь pipe (|) будет конвейер STDOUT источника в STDIN адресата, где выполняется «tar zx», и непрерывный поток данных декомпрессии, поступающий из источника.

Как вы можете видеть, эта команда сжимается «на лету» и экономит полосу пропускания. Вы также можете использовать другие сжатия для достижения лучших результатов, но помните, что сжатие и декомпрессия требуют циклов процессора.

Справка

  • Сравните содержимое динамически созданных архивов
  • Извлекает ли tar -x в текущий каталог или извлекает его из источника архива?
  • почему бы вам tar zip-файл
  • Я хочу, чтобы каталог tar X не включал его родителей
  • Почему tar не хватает места на диске, когда его осталось?
  • unpigz (и untar) в определенный каталог
  • Автоматическое резервное копирование и исключение определенных папок
  • в каких единицах измеряется таргетинг?
  • Почему tar не может извлекать .zip-файлы?
  • файлы списка tar, перерыв в первом файле
  • Как создать tar-файл gnu, который может быть извлечен с помощью соляристой смолы
  • Interesting Posts

    ошибка калибровки калибровки 403 в файле epub

    Функция добавления двух чисел в awk

    Тихая статистика для проверки наличия файла

    Могут ли другие пользователи просмотреть аргументы, переданные команде?

    зациклить введенную пользователем строку в скрипте

    Аудио не работает Debian Jessie

    Создайте двухстрочный текстовый файл без записи на stdout

    Объясните, какая команда выводится во втором столбце

    переместите каталог с одним символом (обратная цитата) в качестве его имени

    скрипту необходимо добавить еще один цикл

    Snapper – как отменить изменения, сохраняя отметки времени?

    chfs не работает в логине ksh shell

    Сгенерируйте порядковый номер для каждой строки в конце. Изменено. Может ли кто-нибудь помочь и предложить на этом

    Как адрес ядра заменяет страницы памяти на swap partition \ file?

    Как применить awk-скрипт к нескольким файлам в одной папке с использованием цикла

    Linux и Unix - лучшая ОС в мире.