scp і стиснення одночасно, проміжного збереження немає


63

Який канонічний спосіб:

  • 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

Відповіді:


102

Є багато способів робити те, що ти хочеш. Найпростішим є використання 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чоловіка:

    НЕ ВИКОРИСТОВУЙТЕ 7-zip формат для резервного копіювання на Linux / Unix, оскільки:
    - 7-zip не зберігає власника / групу файлу.


3
Хороший зауваження додати, що якщо ви не здійснюєте передачу через загально повільну мережу, скажімо, Інтернет, краще уникати стиснення, оскільки це просто уповільнює швидкість передачі. У локальній мережі, -zяк мінімум, удвічі повільніше. Для навіть більшої швидкості, ніж rsyncing над ssh, встановіть демон rsync та rsync, використовуючи -Wпрапор ( копіюйте файли цілими (без алгоритму дельта-
xfer

2
Дякую! Я прийму цю чудову відповідь, але, будь ласка, додамо повний, окремий командний рядок, який використовує і те, rsync і 7za з кінцевим висновком у віддалену файлову систему. Мені сподобалось, -zале я хотів би роз'єднати ступінь стиснення так .. як би я користувався rsyncв такому випадку, будь ласка?
Robottinosino

2
@Robottinosino див. Оновлену відповідь. Немає сенсу використовувати rsyncс 7z. Він повинен працювати з rsync та subhel, як показано, але я не міг зрозуміти, як все-таки.
тердон

4
+1 для scp -C. На віддаленому диску не було достатньо місця, щоб вмістити стислий файл, тому я не міг стиснути перед передачею. Один маленький варіант командного рядка усунув мою проблему.
користувач37931

1
@knutole спочатку зашпаклюйте файл, а потім rsync його. Будь ласка, задайте нове запитання, якщо вам потрібні додаткові деталі.
тердон

13

Я думаю, що ця команда зробить трюк

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: Старий варіант 'f' вимагає аргументу.
Димитрій Копріва

7

Невелике покращення для відповіді dkbhadeshiya : вам цього не потрібно робити cd dir, просто вкажіть робочий каталог tarзамість цього:

ssh user@host "tar -C /path/to/data/ -zc directory_name" | tar zx 

Ви також можете завантажити каталог таким же чином:

tar zc directory_name/ | ssh user@host "tar zx -C /new/path/to/data/"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.