Что делает chmod -u?

19

Случайно я побежал, chmod -u filenameи он удалил все разрешения, которые у меня были filename.

Страница man не ссылается на -uопцию. Экспериментируя, я смог сделать вывод, что он удаляет не все разрешения, а только права на чтение и выполнение, оставляя доступ на запись без изменений.

Так что же это делает?


Мой вывод выше неправильный, теперь я думаю, что он удаляет разрешения, которые есть у владельца, из всех категорий.


Я думаю, что поведение аналогично a=u, только оно -вместо =и aможет быть отброшено, как, например, с помощью a+x.

y_wc
источник
6
For1 для того, чтобы задать основной вопрос, которого нет на странице руководства.
1
«Формат символьного режима [ugoa...][[-+=][perms...]...], где perms есть либо нуль или более буквы из набора rwxXst, или одной буквы из набораugo » (GNU CHMOD человека страница); POSIX довольно неясен, но определяет производство «permcopy» для того же эффекта.
Майкл Гомер
1
@MichaelHomer Это не говорит, что это делает.
y_wc
1
@y_wc "Вместо одной или нескольких из этих букв вы можете указать ровно одну из букв ugo : разрешения, предоставленные пользователю, которому принадлежит файл ( u), разрешения, предоставленные другим пользователям, которые являются членами группы файла ( g) и разрешения, предоставленные пользователям, которые не входят ни в одну из двух предыдущих категорий ( o). "
Майкл Гомер
1
Да, я прочитал это. Я не вижу, что в нем упоминается, что он делает. Там написано, что я могу указать одно из этих писем. Указывая, например u, я буду указывать разрешения, предоставленные пользователю, которому принадлежит файл. Но это не говорит о том, что он делает. Что означает даже означает?
y_wc

Ответы:

19

Это не вариант, а стандартный (но необычный) способ указания разрешений. Это означает , что для удаления ( -) разрешений , связанные с владельцем файла ( u) для всех пользователей (без предшествующих u, gили o). Это будет описано в справочной странице.

Справочная страница GNU chmod документирует это как:

Формат символьной режима [ugoa...][[-+=][perms...]...], где permsесть либо нуль или более букв из набора rwxXst, или одна буква из множества Ugo

и позже

Вместо одной или нескольких из этих букв вы можете указать ровно одну из букв ugo: разрешения, предоставленные пользователю, которому принадлежит файл ( u), разрешения, предоставленные другим пользователям, которые являются членами группы файла ( g), и разрешения, предоставленные пользователям, которые не входят ни в одну из двух предыдущих категорий ( o)

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


Это также задокументировано в POSIX , но более нечетко определено: спецификация разрешений широко who[+-=]perms(или число), и эффект от них дополнительно определен:

В permcopy символы u, gи oпредставляют текущие разрешения , связанные с пользователем, группой, и другие части бит режима файла, соответственно. Остальная часть этого раздела permотносится к нетерминалам permи permcopyграмматике.

а потом

-

... Если кто не указан, биты режима файла, представленные perm для владельца, группы и других разрешений, кроме тех, которые имеют соответствующие биты в маске создания режима файла процесса вызова, должны быть очищены.

Майкл Гомер
источник
Спасибо, Майкл. Документация POSIX убедительна. GNU однако ... Пожалуйста, смотрите этот мой комментарий. Я не понимаю, как то, что следует после «Так», следует из того, что было раньше. permsможет быть u, что я и получил. Да, uуказывает разрешения или владельца. Но как следует, что -uудаляет разрешения владельца (модуля umask) от всех пользователей?
y_wc
Потому что это то, что -всегда делает: оно удаляет указанные разрешения у указанного класса пользователей. -uточно аналогично -wили (ближе) к ugo-u.
Майкл Гомер
Я собирался сказать, что я не пришел сюда для обсуждения документации и что я был рад просто понять, что происходит, но документы просто щелкнули. Благодарю.
y_wc
Могу я побеспокоить вас еще одним chmodвопросом по документации? Дайте мне знать, если вы считаете, что это заслуживает отдельного вопроса. «и = вызывает их добавление и приводит к удалению безымянных битов, за исключением того, что неизменяемые биты идентификатора пользователя и идентификатора группы не затрагиваются». Для меня это говорит о том, что, учитывая каталог, владелец которого имеет только доступ на запись, chmod u=rx directoryоставит разрешения владельца как rwx. Но этого не происходит, вместо этого они становятся ожидаемыми r-x. Я неправильно истолковываю что-то?
y_wc
Это говорит о том, что sбиты setuid / setgid ( ) остаются одни, если вы не упоминаете их, а все, что вы не указали, удаляется.
Майкл Гомер
2

Ответ немного похож на /unix//a/429424/255251 .

chmod -u file_name

не удаляет все разрешения, но учитывает umaskценность.

umask
0022
ls -l file
-rwxrwxrwx 1 user user 4 Feb 25 15:17 file
chmod -u file
chmod: file: new permissions are ----w--w-, not ---------
ls -l file
-----w--w- 1 user user 4 Feb 25 15:17 file

Теперь измените значение umask

umask 777
chmod 777 file
chmod -u file
chmod: file: new permissions are rwxrwxrwx, not ---------
ls -l file
-rwxrwxrwx 1 user user 4 Feb 25 15:17 file
Prvt_Yadav
источник
2
Поучительно, полезно знать и очень полезно, но я думаю, что это не совсем проблема, хотя она очень тесно связана. Благодарю.
y_wc