Можно ли заставить 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). Подробнее читайте здесь
quietContest

Спасибо. Старый сервер консервируется. Новому серверу нужен контент. Все программные ссылки потеряны, но многие из них были сломаны, поэтому сейчас это будет медленная задача обслуживания нового сервера. Еще раз спасибо.
jlettvin

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

29

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

В частности, раздел 7.5.3 "O'Reilly: SSH: The Secure Shell. Полное руководство" .

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

...

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

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

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

1
Ему нужен "p" (tar xpf) для сохранения разрешений в месте назначения.
Пол Линч

Примечание, эта команда должна быть запущена из исходного компьютера, толкая файлы в целевом компьютере. В моем случае (много небольших несжатых файлов) он работал лучше и быстрее scpили rsync.
Херардо Лима

Последующий вопрос: на стороне источника, хранит ли команда tar данные tarball сначала локально, прежде чем передавать их на удаленный компьютер? [Это может стать проблемой, когда исходный диск почти заполнен - ​​скажем, на 98%]
Jungle Editor

18

Использование tarover в sshкачестве отправителя и получателя тоже помогает:

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

Я добавил на исходной стороне --one-file-systemи на стороне назначения, pчтобы сохранить разрешения.
03

страница руководства по 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.