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 начинать с './'
  • «Тар» - результат поиска, сохраняющий структуру каталогов
  • Почему tar не требует перезаписи существующих файлов?
  • Почему tar не хватает места на диске, когда его осталось?
  • tar.bz2 7zip выборочная экстракция
  • Как разблокировать файл, пропуская начало структуры каталогов?
  • Использование tar в файле с символом @ (при символе)
  • Установить установленную систему в файл tar.gz
  • Формат индексированного архива?
  • Как загрузить архив и извлечь его, не сохраняя архив на диск?
  • Interesting Posts

    Перемещение подкаталога в новый родительский каталог, где новое имя каталога увеличивается на 1

    Как захватить пользовательский ввод в DC?

    Используйте JQ для генерации CSV из поиска ножей

    Простой «киоск» – StartX с одним приложением говорит, что протокол не указан

    Ошибка Debian 6.0 и Xen PyGrub

    Удалять последовательные строки, если шаблоны соответствуют каждой строке

    скрипт, чтобы проверить, действительно ли сертификат SSL

    при синхронизации времени выполнения команды с помощью sudo `time` должно быть до` sudo` или после `sudo`?

    Unix: поиск файлов конфигурации службы в файловой системе

    Сделать вкладку «Баш». Автозаполнение соответствует «Содержит» во всех возможных файлах вместо «Начиная с»,

    Как запустить службу через определенное время в SystemD?

    нет ввода в меню для / dev / ttyusb0, не загружаемого

    Слияние трех анимаций .gif

    Использование вызова функции системы для выполнения команды оболочки

    CentOS 7 добавляет нового пользователя с привилегиями root

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