scp + копирование символических ссылок

Вопрос или проблема

Почему команда scp не копирует ссылки с локального компьютера на другой?

scp -rp dir linux:/dir_target

Как я могу скопировать ссылки, если в исходном каталоге у меня есть как файлы, так и ссылки?

Если я правильно понимаю, что вы хотите. Вы хотите точно отразить dir на локальной машине в dir_target на linux, и она копирует содержимое символьной ссылки, а не саму символьную ссылку. Чтобы сделать точную копию, вам нужно использовать rsync вместо scp.

rsync -Wav --progress dir linux:dir_target

Я подозреваю, что это даст желаемый результат. В любом случае я обычно использую rsync, потому что он будет копировать только те файлы, которые нужно скопировать, и, как правило, более умный, чем scp.

Это хороший вопрос. К сожалению, scp не копирует символьные ссылки, и похоже, что нет планов добавить эту функцию: https://bugzilla.mindrot.org/show_bug.cgi?id=485.

Тем не менее, существуют альтернативы. Вы можете:

  • Использовать tar cvfz, чтобы сжать папку (tar сохранит ссылки); затем scp файл tar
  • Использовать переключатель rsync -e ssh для синхронизации по ssh (например, rsync -ave ssh /src/dir user@hostname:/folder)
  • Использовать команду типа этой, чтобы найти и перечислить символьные ссылки, а затем воссоздать их на другой стороне (не отлично, но я рассматривал возможность реализации этого сам):

    ls -la `find openddr_ODRINT1/ -type l`

Если вы не хотите использовать “безопасную” часть scp (“s”), вы можете использовать его предшественника “cp”.

Например, для отдельного файла выполните: cp -a ссылка, которую вы хотите сохранить или/и замените -a на -P

Если вы используете cp -r, чтобы скопировать одну папку в другое место, то символьные ссылки в исходном каталоге сохраняются в месте назначения.
например, cp -r dir-с-ссылками dest-dir –символьные ссылки остаются внутри dest-dir

На (целевых) системах, где rsync недоступен (например, LibreElec не имеет установленного rsync) и где файловая система назначения поддерживает символьные ссылки, вы можете использовать tar без создания временного файла.

tar -C dir -cf - . | ssh linux tar -C dir_target -xf -

Это копирует файлы + символьные ссылки в dir_target на хосте linux.
dir_target должен существовать.

При желании вы можете сделать следующее:

tar -cf - dir | ssh linux tar -C dir_target -xf -

Это копирует файлы + символьные ссылки из dir в dir_target/dir на хосте linux. dir_target должен существовать.

Ответ или решение

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

Почему scp не копирует символические ссылки?

Команда scp предназначена для безопасного копирования файлов между хостами в сети и работает по протоколу SSH. Однако scp имеет ряд ограничений, одним из которых является то, что она по умолчанию не копирует само содержимое символических ссылок (symlinks), а лишь их целевые файлы. Это может вызвать проблемы, если вы хотите создать точную копию директории, которая содержит как файлы, так и символические ссылки. При использовании scp, команда копирует только содержимое по ссылке, а не саму ссылку.

Проблема с копированием символических ссылок с помощью scp подробно обсуждается в это баг-отчет, который указывает на отсутствие планов по исправлению данной особенности scp.

Альтернативные методы для копирования символических ссылок

Если ваша цель — создать точную копию директории, содержащей как файлы, так и символические ссылки, рекомендуется использовать другие инструменты, такие как rsync или tar.

  1. Использование rsync:
    rsync является мощным инструментом для синхронизации файлов, который умеет работать с символическими ссылками. Для копирования директории вместе с символическими ссылками вы можете использовать следующую команду:

    rsync -avh --progress dir linux:/dir_target

    Здесь ключ -a (archive) сохраняет символические ссылки, а -v (verbose) выводит дополнительную информацию о процессе копирования.

  2. Использование tar:
    Если rsync недоступен, есть возможность использовать tar. Данная команда позволяет сохранять и восстанавливать символические ссылки без необходимости создания временного файла. Пример команды:

    tar -C dir -cf - . | ssh linux tar -C dir_target -xf -

    Этой командой происходит копирование файлов и символических ссылок из dir в dir_target на удалённом хосте.

  3. Копирование с помощью cp:
    Если вам нужно скопировать символическую ссылку в локальную директорию, вы можете использовать команду cp с ключом -P или -a:

    cp -a dir-with-links dest-dir

    Ключ -a сохраняет все атрибуты файлов, включая символические ссылки.

Заключение

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

Это объяснение, несомненно, поможет вам выбрать правильный подход в зависимости от ваших требований и ограничений среды, в которой вы работаете.

Оцените материал
Добавить комментарий

Капча загружается...