Короткий ответ: если вы хотите замаскировать с включенным битом выполнения, вы должны явно установить его с помощью setfacl
после touch
. Безопасность запрещает его неявную настройку.
setfacl -n -m m::rwx foo
"-n" для подавления пересчета маски (может не понадобиться).
"m::rwx" устанавливает значение маски равным "rwx". Обратите внимание, что "m::x" отключит все операции чтения и записи.
Я не могу показать, почему маска "rw-". Я предполагаю, что каталог по умолчанию, в котором touch
создает файл, остается неизменным для всего примера OP.
В записи каталога для 'foo' должен отображаться владелец 'root' (из-за команды sudo и группы 'guards', потому что для каталога установлен бит SUID. Разрешения будут по умолчанию '-rw-...r- -' с групповыми разрешениями каталога '-...rx...' (из-за того, что бит SUID отображается как маленькая буква s).
Затем идут ACL, которые должны быть каталогом по умолчанию. Учитывая, что ACL наследуют , я не ожидаю, что будут созданы какие-либо ACLe, а маска ACLE будет использоваться по умолчанию для каталога, 'rwx'.
Но если они будут созданы, я ожидаю, что новые ACLe будут подготовлены по умолчанию, снова оставив маска в 'rwx'. Если они не загрунтованы от значений по умолчанию, это, казалось бы, противоречит идее ACL по умолчанию - ACL "по умолчанию" будет предоставлять только ACL именованных пользователей и именованных групп.
Это теперь умоляет Вопрос о том, какой должна быть маска ACLe. Я ожидаю, что это будет «rwx» из записи маски по умолчанию. Но она может быть создана с пустой маской, и тогда применяются всевозможные юридические аспекты.
setfacl
, предполагая, что те же правила применяются к созданию файлов. Существует пункт:
Если ACL содержит записи именованных пользователей или именованных групп, а записи маски не существует, создается запись маски, содержащая те же разрешения, что и запись группы.
Это установит маску ACL на «r-x», если запись группы ACL была создана из записи каталога файлов, или «r-x», если запись группы ACL поступила из ACL по умолчанию. (В любом случае, в этом случае результат тот же.)
Также есть пункт:
Если список ACL по умолчанию содержит именованные записи пользователей или именованных групп, а запись маски не существует, запись маски, содержащая добавляются те же разрешения, что и для записи группы ACL по умолчанию. ... разрешения записи маски дополнительно настраиваются, чтобы включить объединение всех разрешений, затронутых записью маски.
Если применяется это правило, маска будет начинаться как «r-x» (та же логика), что и в предыдущем предложении), а затем будет изменена на «объединение всех разрешений, затронутых записью маски».
«Разрешения, на которые влияет ввод маски», не определены в документации по команде setfacl
. В документации POSIX ACL говорится:
Маска представляет собой комбинацию всех прав доступа группы-владельца и всех записей пользователей и групп.
Укажите слово «союз», которое является аддитивным, я бы прочитал «сочетание» как логическое ИЛИ.Другими словами, если какая-либо группа или пользователь ACLe имеет разрешение «x», маска будет содержать «x».
Приведенное выше рассуждение должно быть ошибочным, так как x для выполнения не появляется в маске.
Следовательно, должно существовать какое-то правило о том, как вычисляется маска, которое было «скрыто» от общих источников документации (или мы нашли ошибку).
Мой вывод состоит в том, что 'x' всегда безоговорочно удаляется, а документация слабая.
Это изменение, вероятно, было сделано по соображениям «безопасности» — ни один файл не должен быть неявно исполняемым, но должен иметь включенный исполняемый бит после его создания.
Вот список выбранных дескрипторов (замените terminal.exe
именем приложения):
$ winedbg --command "info wnd" | grep -wf <(winedbg --command "info thread" | ex + "/ terminal.exe \ n \ zs /;, / ^ \ S / -p" -scq! / dev / stdin | awk '{print $ 1} ')
В основном мы grep
обрабатываем список всех оконных обработчиков ( info wnd
) по определенному списку потоков. Список анализируется редактором ex
на основе вывода информационных потоков
и сохраняется в специальный файл ( / dev / fd
), который загружается grep
( -f
). Команда awk используется для печати первого столбца, в котором перечислены идентификаторы потоков.
Объяснение используемого синтаксиса ex
:
+ «cmd»
- выполнить команду /terminal.exe\n\zs /;, / ^ \ S / -p
/ pattern1 /;, / pattern2 /
- поиск по диапазону (;
помещает курсор после первого шаблона) /terminal.exe\n\zs/
- поиск для terminal.exe
и отметьте начальную точку ( \ zs
) / ^ \ S /
- выбор заканчивается на первой непустой строке - p
- печатает выделенное выше, за вычетом одной строки (связанное сообщение ) -scq!
- s тихо и принудительно (!
) выполнить команду q uit c / dev / stdin
- прочитать содержимое из стандартного ввода