Итак, сегодня на работе неожиданно появляется руководство и просит меня провести экспресс-курс по использованию 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
пришлось ограничиться тем, что вы не можете сбросить липкие биты в восьмеричной форме. В конце концов, если вы действительно хотите сбросить их (что случается редко), вы всегда можете использовать альтернативную форму.
Итак, как и во многих других формах удивительной сложности, ответ — «обратная совместимость».