Почему «chmod 1777» и «chmod 3777» устанавливают бит «залипание»?

15

Чтобы установить бит закрепления в каталоге, почему команды chmod 1777и chmod 3777обе работают?

Ляо Чжуоди
источник
2
Вы предлагаете потенциально рискованную операцию. Комбинирование липких битов и разрешений rwx для всех - плохая практика. Любой может изменить и выполнить файл, а s-бит позволяет переключиться на пользователя root без пароля.
Джиппи
1
@jippie Биты setuid и setgid пропадают, если файл изменен, поэтому вы не можете получить root-доступ таким образом.
Кайл Джонс
@KyleJones, это все еще опасно. Если бы passwdбинарный файл был доступен для записи во всем мире, вы бы не смогли получить root-доступ, изменив его, как вы говорите, но вы могли бы заменить его на какой-то другой бинарный файл, который каждый после этого будет запускать, думая, что это так passwd.
Wildcard
@Wildcard Согласен.
Кайл Джонс

Ответы:

29

Каждое число (также называемое восьмеричным, потому что оно является base8) в этой группе представляет 3 бита. Если вы превратите его в двоичный файл, это сделает его намного проще.

1 = 0 0 1
3 = 0 1 1
5 = 1 0 1
7 = 1 1 1

Таким образом, если вы сделали 1777, 3777, 5777 или 7777, вы бы установили бит закрепления, поскольку третий столбец будет равен 1. Однако при 3777, 5777 и 7777 вы дополнительно устанавливаете другие биты (SUID для первого столбца и SGID для второго столбца).

И наоборот, любое другое число в этом месте (максимум до 7) не будет устанавливать бит закрепления, потому что последний столбец не будет равен 1 или «включен».

2 = 0 1 0
4 = 1 0 0
6 = 1 1 0

JZeolla
источник
3
+1 для хорошего описания того, как восьмеричные числа работают и как это применяется к битам разрешения файла.
CVn
1
Она называется «битовая маска» и +1 также для объяснения / показа того, как ее можно установить, а также для clearстолбцов Группа владельцев и другие.
Крис К
16

Права доступа, передаваемые в качестве аргумента chmod, указываются как восьмеричное значение. Каждая цифра в значении представляет три бита. Если даны три цифры, вы устанавливаете биты чтения, записи и выполнения для владельца файла, группы и других (всех остальных). Если даны четыре цифры, крайний левый номер устанавливает биты setuid, setgid и sticky. Октябрь 1 устанавливает липкий бит. Octal 2 устанавливает бит setgid. Octal 2 + восьмеричное 1 - восьмеричное 3, которое устанавливает бит setgid и бит sticky.

Кайл Джонс
источник
1
Разве это не восьмеричное 2 | восьмеричный 1, а не восьмеричный 2 + восьмеричный 1? Операции в этом случае приводят к одному и тому же результату, но в целом это побитовое или это важно, не так ли?
Gerrit
1
@gerrit Да, в общем случае вы должны смотреть на binary orоператора. Однако, как вы указали, в этом случае это дает тот же результат, и гораздо больше людей знакомы с дополнением.
CVn