Все описанное ниже выполняется с помощью скрипта 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, как описано выше. Это неловко и не элегантно. Я надеюсь найти способ сделать это, не прибегая к использованию временного файла.