Удалённое копирование всех свойств файла, за исключением его содержимого

Удалённое копирование всех свойств файла, за исключением его содержимого

Все описанное ниже выполняется с помощью скрипта Bash.

Я хочу захватить состояние определенного набора файлов на определенном наборе удаленных хостов. "Состояние" файла зависит от типа файла:

  • Обычный файл: полный путь, содержимое файла, режим, владелец, группа
  • Символическая ссылка: полный путь к самой ссылке, путь, на который она указывает, режим (всегда 777), владелец, группа
  • Каталог: полный путь, режим, владелец, группа

При создании локального файла для представления состояния удаленного файла я различаю файлы с одинаковым полным путем, но которые отличаются на разных хостах, добавляя к локальному имени файла хэш перечисленных выше признаков. Затем я архивирую удаленный файл (не рекурсивно, так что в случае каталога я получаютолькокаталог), пропустить его через SSH, распаковать на локальную машину и mv к имени файла с добавленным хешем. Я использую tar, потому что он сохраняет те черты, которые мне важны.

HASH=$(ssh -n "$ONE_HOST" "{ cat $ONE_FILE_PATH; stat -c \"%a %u %g %F\" $ONE_FILE_PATH; } | sha512sum")
ONE_HASH=${ONE_HASH:0:20}

TARGET_FILENAME_FOR_COPY="$FILENAME"."$ONE_HASH"
TARGET_PATH_FOR_COPY="$TARGET_DIRECTORY_FOR_COPY"/"$TARGET_FILENAME_FOR_COPY"

ssh -n "$ONE_HOST" \
     "tar -C $DIRECTORY --no-recursion -cf - $FILENAME" | \
     tar -xf - -C "$TARGET_DIRECTORY_FOR_COPY"

mv "$TARGET_PATH_UNHASHED" "$TARGET_PATH_FOR_COPY"

Все это на месте и работает.

Теперь, что касается случаяобычные файлы, у меня есть дополнительная потребность в обработке конфиденциальных файлов, содержимое которых я не хочу копировать (хотя содержимое будет по-прежнему представлено в хэше). Моя цель — создать точно такой же локальный файл, который я бы создал в процессе, описанном выше, но чтобы файл был пустым, а не содержал содержимое удаленного файла.

Примечание: Я не могу скопировать файл, а затем очистить копию содержимого. Поскольку файл является конфиденциальным, его содержимое не должно передаваться по сети.

Я не знаю способа заставить tar передавать "оболочку" обычного файла, которая имеет режим, владельца и группу файла, но не включает содержимое в tarball. Если кто-то не знает трюка, чтобы заставить tar сделать это, я думаю, мне придется искать какой-то другой механизм, кроме tar.

Как мне проще всего этого добиться?

ОБНОВЛЕНИЕ №1

Один из подходов, который я пробую, заключается в том, чтобы сначала создать временную копию файла (используяср -рчтобы сохранить атрибуты файла, которые мне интересны) на удаленной системе, очистите этот временный файл от содержимого (сусечение -s 0), а затем скопировать его на мою локальную машину с помощью tar / ssh, как описано выше. Это неудобно и неэлегантно. Я надеюсь найти способ сделать это, не прибегая к использованию временного файла.

решение1

Перед запуском tar можно смонтировать пустой файл поверх конфиденциальных файлов.

touch /tmp/emptyfile
mount --bind /tmp/emptyfile /home/user/.ssh/id_rsa

Или что-то подобное.

Связанный контент