Cygwin / Bash - Подстановка текста в файле разрешений ICACLS - PullRequest
0 голосов
/ 18 февраля 2020

Фон

Работая на 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.


Примечание: в моем случае , решение может быть:

  1. Сохранение ACLS
  2. Переименование исходного файла с расширением резервной копии (.bak или что-то)
  3. Копирование резервной копии
  4. Выполнение (с заменой sed на месте)
  5. Восстановление ACLS (целевой файл назван так, как исходный файл был ранее)

Переименование сохраняет права, а не копирование. Тем не менее, я оставил вопрос здесь, потому что это интересный случай imho.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...