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», и непрерывный поток данных декомпрессии, поступающий из источника.

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

Справка

  • Почему mutt не удается отправить электронное письмо с некоторым вложением файла tgz?
  • Как проверить, содержит ли каталог те же файлы в архиве TAR?
  • Почему tar не хватает места на диске, когда его осталось?
  • Тар сжать папку без указания имени файла
  • Тар большие файлы в разных каталогах
  • Восстановление инкрементного резервного копирования Tar с помощью одной команды
  • Почему конкретная последовательность вариантов имеет значение для команды tar?
  • tar + rsync + untar. Любое преимущество по скорости только за rsync?
  • Установка файла tar.gz без цели установки
  • Как определить, будет ли запущенный tar вызвать диск для заполнения
  • изменять права собственности на файлы в архиве tar
  • Linux и Unix - лучшая ОС в мире.