Почему нельзя очистить биты setuid/setgid/sticky с помощью восьмеричной записи с помощью chmod?

Почему нельзя очистить биты setuid/setgid/sticky с помощью восьмеричной записи с помощью chmod?

Итак, сегодня на работе неожиданно появляется руководство и просит меня провести экспресс-курс по использованию Linux для группы инженеров. Видимо, они пронюхали о моем несогласии с Microsoft (из-за проблем с конфиденциальностью и безопасностью Win 10), и теперь я штатный "эксперт" по всему *nix.

После объяснения группе красоты простоты Linux, есть вопросы о правах доступа к файлам. Я объясняю chmodи восьмеричный синтаксис user-group-world для назначения прав доступа.

Затем перейдем к биту setuid/setgid/sticky — я демонстрирую это на простом примере, например, chmod 2755 somefile.txtи указываю, что бит setgid теперь включен. Чтобы очистить этот бит, я запускаю chmod 0755, но, к моему ужасу, бит setgid сохраняется. Что?? Я знаю, что я уже использовал этот синтаксис для очистки липких битов раньше (хотя, вероятно, десять лет назад). Было довольно неловко обнаружить, что он не работает сразу после того, как я рассказал, какой элегантный дизайн.

В любом случае, я также показал им g+sальтернативную g-sстенографию и обнаружил, что g-sона работает.

После презентации я подумал, что нашел ошибку в chmod, но, просмотрев manстраницу, я обнаружил, что такое поведение было «задумано», поскольку есть явное примечание о том, что его chmodможно использовать для установки липких флагов, но не для их снятия.

ПОЧЕМУ была удалена возможность chmodочищать липкие биты с помощью восьмеричной записи? Я погуглил и нашел некоторых людей, которые говорили, что начальный ноль «сбивает с толку» и должен быть опущен. Серьезно? По этой логике мы могли бы также сказать, что байтам (например, коду ASCII) запрещено содержать начальные биты «0», потому что это «сбивает с толку». Люди, которые считают начальный ноль сбивает с толку, могут использовать символическую запись. Люди, которые хотят использовать восьмеричную запись, должны иметь возможность использовать восьмеричную.

Почему была chmodограничена поддержка восьмеричной записи для очистки липких битов?

решение1

Проблема в том, что до введения sticky bits уже было много shell-скриптов и т. д., которые просто использовали три восьмеричные цифры (или меньше). Кроме того, соглашение о том, что любое число может быть дополнено ведущими нулями, довольно глубоко укоренилось.

Так что если бы кто-то позволил восьмеричной форме с ведущим нулем сбрасывать липкие биты, многие скрипты случайно сбросили бы липкие биты. Отладка этого была бы кошмаром, поэтому вместо этого chmodпришлось ограничиться тем, что вы не можете сбросить липкие биты в восьмеричной форме. В конце концов, если вы действительно хотите сбросить их (что случается редко), вы всегда можете использовать альтернативную форму.

Итак, как и во многих других формах удивительной сложности, ответ — «обратная совместимость».

Связанный контент