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

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

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

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

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 передать "оболочку" обычного файла, у которого есть режим, владелец и группа файла, но пропущен контент в тарболе. Если кто-то не знает хитрости, чтобы заставить tar сделать это, я думаю, что мне придется взглянуть на какой-то другой механизм, кроме tar.

Как мне легче всего это сделать?

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

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

1 ответ1

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .