Чи можна змусити SCP ігнорувати символічні посилання під час копіювання?


80

Мені потрібно перевстановити один з наших серверів, а також в якості запобіжного заходу, я хочу рухатися /home, /etc, /optі /Servicesна резервний сервер.

Однак у мене проблема: через велику кількість символічних посилань багато файлів копіюються кілька разів.

Чи можна змусити scpігнорувати символічні посилання (або насправді скопіювати посилання як посилання, а не як каталог чи файл)? Якщо ні, чи є інший спосіб це зробити?

Відповіді:


82

Я знав, що це можливо, я просто взяв неправильний інструмент. Я зробив це за допомогою rsync

rsync --progress -avhe ssh /usr/local/  XXX.XXX.XXX.XXX:/BackUp/usr/local/

1
То що означає ця команда? Це ігнорує символічні посилання чи створює нові? -авхе?
Ернестас Станкевичюс

3
aє архівом (зберігає речі), vбагатослівним, hзручним для читання результатом, eвкажіть послугу, яку ви хочете використовувати (в даному випадку це ssh). Детальніше читайте тут
тихий конкурс

Дякую. Старий сервер пропадає. Новий сервер потребував вмісту. Втратили всі програмні посилання, але багато з них були зламані, тому це зараз буде повільним завданням обслуговування на новому сервері. Знову дякую.
jlettvin

1
--safe-links дозволяє зберігати посилання, що знаходяться всередині каталогу, і не копіювати ті, що вказують поза ним.
Колін Пітрат

29

Я виявив , що метод не працює для мене, однак я знайшов альтернативу , яка зробила роботу на цьому сайті ( www.docstore.mik.ua/orelly ).rsync

Зокрема, розділ 7.5.3 "O'Reilly: SSH: Захищена оболонка. Остаточний посібник" .

7.5.3. Рекурсивна копія каталогів

...

Хоча scp може копіювати каталоги, це не обов'язково найкращий метод. Якщо ваш каталог містить жорсткі або м’які посилання, вони не дублюватимуться. Посилання копіюються як звичайні файли (ціль посилання), і що ще гірше, кругові посилання на каталог змушують scp1 циклічно необмежено тривати. (scp2 виявляє символічні посилання та замість цього копіює їх цілі.) Інші типи спеціальних файлів, такі як іменовані канали, також не копіюються правильно. Кращим рішенням є використання tar, який правильно обробляє спеціальні файли, і відправити його на віддалений машина для зняття зірки через SSH:

$ tar cf - /usr/local/bin | ssh server.example.com tar xf -

1
Це хороша порада, якщо rsync не встановлено на віддаленому кінці, або (з невеликими змінами), якщо у вас вже є tarball вихідного каталогу.
Trebor Rude

1
Для збереження дозволів у пункті призначення потрібен "p" (tar xpf).
Paul Lynch

Зверніть увагу, що цю команду потрібно запустити з вихідного комп'ютера, підштовхуючи файли до цільового комп'ютера. У моєму випадку (багато невеликих, нестиснутих файлів) це працювало краще та швидше, scpабо rsync.
Gerardo Lima

18

Використання tarover sshяк відправника, так і одержувача також робить трюк:

cd $DEST_DIR
ssh user@remote-host 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -

Я додав на стороні джерела --one-file-systemта на стороні призначення, pщоб зберегти дозволи.
закінчення

сторінка довідки для tar говорить; --one-file-system = не перетинати точки монтування
AnneTheAgile

2

Одним із рішень є використання оболонкової труби. У мене ситуація, коли я отримав кілька файлів * .gz та символічні посилання, створені деяким програмним забезпеченням, для посилання на ті самі * .gz файли з трохи коротшим ім'ям. Якщо я просто використовую scp, тоді символічні посилання будуть скопійовані як звичайні файли, що призведе до дублікатів. Я знаю, що rsync може ігнорувати символічні посилання, але мої файли gz не стискаються з параметрами, що синхронізуються, і синхронізація дуже повільно копіює ці файли gz. Тому я просто використовую такий сценарій для копіювання файлів:

find . -type f -exec scp {} target_host:/directory/name/data \;

Параметр -f буде знаходити лише звичайні файли та ігнорувати символічні посилання. Вам потрібно дати цю команду на вихідному хості. Сподіваюся, це може допомогти якомусь користувачеві в моїй ситуації. Повідомте мене, якщо я щось пропустив.


0

Одне вкладене рішення, яке можна виконати на клієнті для копіювання папки з сервера за допомогою команди tar + ssh.

ssh user@<Server IP/link> 'mkdir -p <Remote destination directory;cd <Remote destination directory>; tar cf - ./' | tar xf - C <Source destination directory>

Примітка: mkdir є обов'язковим, якщо віддаленого каталогу призначення немає, команда просто стисне весь будинок віддаленого сервера та витягне його до клієнта.

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