Передача з використанням linux ssh та підтримка дозволів


2

Мені потрібно передавати файли через ssh на інший сервер. Файлові структури ідентичні з обох сторін. Я використовував scp -r, але він не зберігає права на початковий файл / каталог. rsync виконує завдання збереження дозволів в такті, але не видаляє файли на кінці призначення, якщо я хочу перезаписати їх через зміни. Я знаю, rsync буде писати зміни, коли вихідні файли новіші, але мені потрібно, щоб просто скопіювати все reguardless дату (тобто замінити каталог призначення з одним я рухаюся) без оболонки в пункт призначення першого і вручну видалити dir .

Я чув, що смола може зробити це, але я не можу змусити його працювати без помилок. Синтаксис

tar -cf - /directory/directory | ssh host.name tar -xf - C /destination_directory

Будь-яка допомога буде оцінена.

Відповіді:


2

rsync може видаляти файли в пункті призначення за допомогою синтаксису --delete. Якщо ви хочете, щоб перезаписати файл у всій повноті, порівняно з частковою реалізацією синхронізації, спробуйте --whole-file.

Витяги з http://www.samba.org/ftp/rsync/rsync.html :

-W, - цілий файл       За допомогою цього параметра алгоритм дельта-передачі rsync не використовується   і весь файл надсилається як є   замість цього. Передача може бути швидше, якщо   цей параметр використовується при пропускній здатності   між джерелом і пунктом призначення   машини вище, ніж пропускна здатність   на диск (особливо коли "диск" є   фактично мережева файлова система). Це   є типовим, коли обидва джерела   і призначення вказані як місцеві   шляхи, але тільки якщо немає запису партій   діє.

--видалити       Це говорить rsync видаляти сторонні файли з прийому   сторони (ті, що не надсилаються   сторони), але тільки для каталогів   які синхронізуються. Ти повинен   попросили rsync надіслати все   каталог (наприклад, "dir" або "dir /")   без використання шаблону для   вміст каталогу (наприклад, "dir / *")   оскільки шаблон розширюється за допомогою   shell і rsync таким чином отримує запит   передавати окремі файли, а не   батьківський каталог файлів. Файли   виключені з передачі   також виключено з видалення   якщо ви не використовуєте --delete-excluded   або позначити правила як тільки   відповідності на стороні відправлення (див   включити / виключити модифікатори в   Розділ ФІЛЬТРОВІ ПРАВИЛА).


0

Як зазначив Едді, rsync --delete -Ha зробить роботу за вас. Переконайтеся, що використовуєте --dry-run / -n , перш ніж ви фактично запустите його, щоб уникнути випадкового видалення всього в неправильному каталозі. Rsync інтерпретує ваші каталоги по-різному, залежно від того, додаєте ви кінцеву слеш (див man rsync і шукати "трейлінг"), тому можна легко помилитися, якщо ви не звертаєте уваги.

Я також використовую смолу, як і ви. Я думаю, ви просто пропускаєте тире перед C у вашій команді вище. Як правило, ви можете пропустити лише тире в першому параметрі. (Але ви також можете використовувати cd замість незручного -C синтаксис.) З tar з вашого джерела ви створюєте додатковий лідер directory/ у назв шляхів у вашому архіві, тому я б cd спочатку на стороні джерела. The -f - є надлишковим (tar використовує стандартний stdin / stdout). Ось як виглядають мої канали

cd /some/dir; tar c my_dir | ssh host 'cd /the/target/dir; rm -rf my_dir; tar x'

Використовуйте sudo tar на приймаючій стороні зберегти власність при видобутку. (Порада. Використовуйте cz / xz замість c / x для передачі за допомогою gzip або труби lzop і lzop -d для стиснення в реальному часі, якщо ви передаєте через кабель Ethernet.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.