Фон
Работая на Windows Серверной станции и используя Cygwin , я пишу сценарий bash, который выполняет подстановку шаблонов с помощью sed, редактируя на месте с помощью резервной копии file (-i.ext
параметр).
Здесь файл destination должен иметь точно таких же разрешений , что и у исходного, и здесь начинается веселье.
sed
не удается сохранить разрешения для файла резервной копии; также после выполнения sed
, сделав щелчок правой кнопкой мыши по файлу → Свойства → щелкните по На вкладке "Безопасность" отображается сообщение об ошибке ниже и NULL SID
запись указана среди разрешений:
Неправильно упорядочены разрешения на "
Использование getfacl src.txt | setfacl -f - dest.txt
" работает на моей машине ", а не у клиента.
- В итоге я использовал код, основанный на
icacls.exe
, который работает в системе клиента.
Я предпочитаю избегать устанавливать записи разрешений по одному для чтения файлов свойств, предпочитая копировать разрешения из источника. icacls
позволяет это:
icacls.exe file /save acls.txt
для сохранения разрешений как `acls. txt icacls.exe file /restore acls.txt
для восстановления прав доступа acls.txt
Сама проблема
Проблема, acls.txt
содержит имя исходного файла и каждый символ хранится в двух байтах, второй является символом NULL:
00000000 73 00 72 00 63 00 2e 00 74 00 78 00 74 00 0d 00 |s.r.c...t.x.t...|
00000010 0d 00 |....
Для замены sr c .txt на dest.txt Я попробовал строку ниже, и восстановление работало с файлом назначения:
perl -p -e 's/s\x00r\x00c\x00\.\x00t\x00x\x00t/d\x00e\x00s\x00't\x00.\x00t\x00x\x00t' \
acls.txt > acls-dst.txt
Я мог бы сделать что-то подобное, чтобы добавить к каждому символу представление символа NULL:
rgxp="$(echo "src.txt" | perl -p -e 's/(.)/\1\\x00/g')"
rpl="$(echo "dst.txt" | perl -p -e 's/(.)/\1\\x00/g')"
perl -p -e "s/${rgxp}/${rpl}/" acls.txt > acls-dst.txt
Тем не менее, Есть ли более простой способ выполнить эту замену? Я не смог найти документацию об этом формате файла ACLS.
Примечание: в моем случае , решение может быть:
- Сохранение ACLS
- Переименование исходного файла с расширением резервной копии (
.bak
или что-то) - Копирование резервной копии
- Выполнение (с заменой sed на месте)
- Восстановление ACLS (целевой файл назван так, как исходный файл был ранее)
Переименование сохраняет права, а не копирование. Тем не менее, я оставил вопрос здесь, потому что это интересный случай imho.