2012-06-14 2 views
58

Мне нужно переустановить один из наших серверов, и в качестве меры предосторожности я хочу переместить /home, /etc, /opt и /Services на резервный сервер.Можно ли заставить SCP игнорировать символические ссылки во время копирования?

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

Возможно ли сделать scp игнорировать символические ссылки (или фактически скопировать ссылку как ссылку не как каталог или файл)? Если нет, есть ли другой способ сделать это?

ответ

55

Я знал, что это возможно, я просто принял неправильный инструмент. Я сделал это с Rsync

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

Так что же это за команда? Не игнорирует ли ссылки или создает новые? -avhe? –

+1

'a' - архив (сохраняет вещи),' v' verbose, 'h' человеко-читаемый вывод,' e' указывает службу, которую вы хотите использовать (в данном случае это 'ssh'). Подробнее [здесь] (https://linux.die.net/man/1/rsync) – tenCupMaximum

23

Я обнаружил, что the rsync method не работает для меня, однако я нашел альтернативу, которая сделала работу на этом сайте (www.docstore.mik.ua/orelly).

В частности, раздел 7.5.3 of "O'Reilly: SSH: The Secure Shell. The Definitive Guide".

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

...

Хотя УППЫ могут копировать каталоги, это не лучший способ. Если ваш каталог содержит жесткие ссылки или софт-ссылки, они не будут дублироваться. Ссылки копируются как простые файлы (целевые ссылки), и, что еще хуже, круговые каталоги ссылаются на scp1 на бесконечность. (scp2 обнаруживает символические ссылки и копирует их цели.) Другие типы специальных файлов, таких как именованные каналы, также не копируются правильно. Лучшим решением является использование tar, который правильно обрабатывает специальные файлы и отправляет его на удаленный машина будет untarred, с помощью SSH:

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

Это хорошее предложение, если rsync не установлен на удаленном конце или (с небольшими изменениями), если вы случайно уже есть tarball исходного каталога. –

+0

Для сохранения разрешений в пункте назначения ему нужен «p» (tar xpf). –

12

Использование tar над ssh как отправитель и получатель делает трюк, а также:

cd $DEST_DIR 
ssh [email protected] 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf - 
+0

Я добавил на стороне источника '--one-file-system' и на стороне назначения' p' для сохранения разрешений. – ceving

+0

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

0

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

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

Опция -f будет только найти правильные файлы и игнорировать символические ссылки. Вам нужно передать эту команду на исходный хост. Надеюсь, это может помочь некоторым пользователям в моей ситуации. Дай мне знать, если я пропустил что-нибудь.

Смежные вопросы