Перейти к содержанию
Избранное

Калькулятор chmod — права доступа к файлам в Linux

Обновлено:

Переводите права доступа к файлам в Linux между интерактивной сеткой флажков, восьмеричным кодом (например, 755) и символьной записью (например, rwxr-xr-x). Получите готовые команды chmod, предпросмотр вывода ls -l и заметки о безопасности для обычных файлов и каталогов.

Преобразование прав доступа Linux между флажками, восьмеричным кодом и символьной записью

Поля ввода
Владелец (u)
Группа (g)
Остальные (o — все прочие)
Особые биты
Если включено, результат будет автоматически обновляться при изменении любого значения.

Формула chmod

Формула
\[ d = 4 \cdot r + 2 \cdot w + 1 \cdot x \] \[ \text{режим} = (4 \cdot s_{\text{uid}} + 2 \cdot s_{\text{gid}} + 1 \cdot s_{\text{sticky}})\,(d_{\text{владелец}})(d_{\text{группа}})(d_{\text{остальные}}) \]

Обозначения:

  • \(r\), \(w\), \(x\) — биты чтения, записи и выполнения: каждый равен 1, если право предоставлено, и 0, если нет;
  • \(d\) — восьмеричная цифра одного класса (владелец, группа или остальные), собранная из весов 4–2–1;
  • \(s_{\text{uid}}\), \(s_{\text{gid}}\), \(s_{\text{sticky}}\) — специальные биты setuid, setgid и sticky (также 0 или 1).

Каждому классу прав соответствует одна восьмеричная цифра: чтение считается как 4, запись — как 2, выполнение — как 1; сумма предоставленных значений даёт число от 0 до 7. Необязательная ведущая цифра кодирует специальные биты по тем же весам 4–2–1, поэтому 4755 означает setuid плюс привычные 755.

Chmod — пример расчёта

Пример: скрипт, который владелец может свободно изменять и запускать, а группа и все остальные — только читать и запускать. Это классический набор прав 755 (и он же задан в калькуляторе по умолчанию: владелец r+w+x, группа r+x, остальные r+x).

\[ d_{\text{владелец}} = 4 + 2 + 1 = 7 \]
\[ d_{\text{группа}} = 4 + 0 + 1 = 5 \]
\[ d_{\text{остальные}} = 4 + 0 + 1 = 5 \]
\[ \text{режим} = 755 \]

Результат: восьмеричный режим 755, символьный режим rwxr-xr-x, команда chmod 755 file. В выводе ls -l файл отобразится как -rwxr-xr-x.

Как пользоваться калькулятором

  1. Откройте выпадающий список Способ ввода и выберите, как вы хотите описать права: Флажки (сетка прав), Восьмеричный код, Символьная запись или Готовые наборы. Видимыми останутся только поля, относящиеся к выбранному способу.
  2. В режиме Флажки отметьте Чтение, Запись и Выполнение для каждого класса — владелец (u), группа (g) и остальные (o) — а при необходимости и специальные биты Setuid, Setgid и Sticky.
  3. В поле Восьмеричный код введите три цифры (например, 755) либо четыре с ведущей цифрой специальных битов (например, 4755). В поле Символьная запись укажите девять символов, например rwxr-xr-x, либо вставьте полную строку из ls -l вида -rwxr-xr-x — ведущий символ типа файла отбрасывается автоматически. В режиме Готовые наборы достаточно выбрать предложенный вариант прав.
  4. Установите Тип файла — Обычный файл (-) или Каталог (d), чтобы пояснение и предпросмотр ls -l использовали правильные формулировки.
  5. Изучите результаты: числовой (восьмеричный) режим, символьный режим, готовые к копированию команды chmod, предпросмотр в стиле ls -l, понятное объяснение и заметки о безопасности.

Что такое права доступа в Linux и как их читать

У каждого файла и каталога в Linux есть девять битов прав, разделённых на три класса: владелец (u), создавивший файл, группа (g), к которой файл относится, и остальные (o) — все прочие пользователи машины. Внутри каждого класса три бита показывают, может ли класс читать (r), записывать (w) и выполнять (x) файл. Команда chmod изменяет эти биты, а калькулятор переводит любое их представление во все остальные.

Восьмеричная запись упаковывает каждый класс в одну цифру по весам 4–2–1 — отсюда режимы вроде 644 или 755. Символьная запись описывает те же биты девятью символами, читаемыми слева направо: триада владельца, триада группы, триада остальных. Прочерк означает отсутствие права, поэтому rw-r--r-- — это доступный для чтения, но не для выполнения режим 644. Обе формы описывают ровно одни и те же биты — выбирайте ту, которую принимает инструмент, с которым вы работаете.

Смысл битов зависит от типа файла. Для обычного файла r — это просмотр содержимого, w — его изменение, x — запуск как программы. Для каталога r — просмотр списка имён внутри, w — создание, переименование и удаление записей, а x — возможность войти в него командой cd и открывать находящиеся в нём файлы. Именно поэтому каталогу нужен бит x, чтобы его содержимым можно было пользоваться, и именно поэтому 700 — стандартный режим для личных папок вроде ~/.ssh.

Полную картину дополняют три специальных бита. Setuid (4) заставляет программу выполняться с правами её владельца — так работает /usr/bin/passwd. Setgid (2) делает то же самое для группы, а на каталогах он заставляет новые файлы наследовать группу каталога. Sticky (1) ограничивает удаление в общем каталоге с правом записи: удалять можно только свои собственные файлы — это правило сохраняет безопасность /tmp (1777). В символьном выводе эти биты отображаются как s/S в позиции выполнения либо t/T в последней позиции; заглавная буква означает, что бит выполнения под ней выключен.

Популярные режимы доступа

Режим Символьная запись Типичное применение
600 rw------- Личные файлы, например SSH-ключи
644 rw-r--r-- Обычные файлы, веб-контент
700 rwx------ Личные каталоги, например ~/.ssh
755 rwxr-xr-x Программы, скрипты, файлы, отдаваемые веб-сервером
775 rwxrwxr-x Общие каталоги для доверенной группы
1777 rwxrwxrwt Общее «черновое» пространство вроде /tmp
4755 rwsr-xr-x Исполняемые файлы с setuid root (использовать осторожно)

Допущения, ограничения и практические советы

  • 777 почти никогда не бывает правильным ответом. Разрешение записи всем подряд открывает файл любой учётной записи системы. Сначала попробуйте 775 с правильно подобранной группой или списки ACL (setfacl) и лишь в крайнем случае — 777.
  • Никогда не сочетайте запись для всех с setuid или setgid. Режимы вроде 4777 или 7777 позволяют любому заменить файл, который при этом продолжает выполняться с повышенными правами, — классическая дыра для повышения привилегий.
  • Права остальных не должны превышать права владельца. Если третья цифра больше первой, вы почти наверняка ошиблись при вводе режима; калькулятор отметит это в заметках о безопасности.
  • 000 блокирует доступ всем, включая владельца. Вернуть доступ сможет только root, поэтому для конфиденциальности используйте 600 или 700.
  • Осторожнее с chmod -R. Рекурсивный числовой режим перезаписывает все биты сразу у всех файлов и подкаталогов; каталогам обычно нужен бит x, а файлам данных — нет. Задавайте права отдельно для каждого типа файлов, а не для всего дерева сразу.
  • Root игнорирует биты прав. Права ограничивают обычных пользователей, но не защищают от доступа уровня root.
  • Калькулятор сопоставляет известные представления прав, включая специальные биты, но не учитывает списки ACL, SELinux и другие системы обязательного управления доступом, которые также могут влиять на реальный доступ.

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

Часто задаваемые вопросы

Как рекурсивно задать разные права файлам и каталогам?

Используйте find, чтобы применить отдельный режим к каждому типу файлов: find /path -type d -exec chmod 755 {} + для каталогов и find /path -type f -exec chmod 644 {} + для файлов. Обычный chmod -R 755 добавляет файлам данных ненужный бит выполнения, а -R 644 наоборот лишает каталоги бита x, из-за чего в них становится невозможно войти. Разделение по типам исключает обе ошибки.

Как посмотреть текущие права файла в виде восьмеричного числа?

Выполните stat -c '%a' filename (или stat -f '%Lp' filename на macOS) — режим сразу вернётся цифрами вида 644. Длинный список ls -l показывает только символьную форму, которую придётся расшифровывать самостоятельно. Такой восьмеричный вывод — ровно то, что ожидает поле «Восьмеричный код» в калькуляторе, так что его можно вставить туда и посмотреть, что делает каждый бит.

Почему после chmod всё равно появляется «Permission denied»?

Проверьте три вещи: каждый каталог по пути к файлу должен давать вам право x (выполнение), иначе до файла не добраться — каталог с режимом 644 блокирует всё внутри, даже если сам файл имеет 777. Кроме того, нельзя выполнить chmod для файла, которым вы не владеете. Наконец, режим могут перекрывать правила уровня файловой системы: параметры монтирования вроде noexec, списки ACL, SELinux или AppArmor способны запрещать доступ независимо от битов прав.

Что означает chmod a+r и чем это отличается от o+r?

a означает «all», то есть изменение применяется сразу к владельцу (u), группе (g) и остальным (o), поэтому a+r даёт право чтения всем. Команда o+r затрагивает только класс «остальные». В восьмеричной записи такого сокращения нет: числовой режим всегда перезаписывает все девять бит. Поэтому, если нужно сохранить существующие права некоторых классов, их удобнее менять символьными операциями + и −, а не полной числовой заменой.

Почему новые файлы получают 664, а не 755? Что такое umask?

umask — это настройка уровня оболочки, которая срезает биты с режима, запрошенного программой при создании файла. При распространённом umask 002 программа, запросившая 666 (rw-rw-rw-), получит 664, а запрос 777 для каталога даст 775. Увидеть текущее значение можно командой umask, изменить — например, umask 022. chmod при создании файла не участвует: он лишь переписывает биты задним числом.

Почему setuid не работает на моём shell-скрипте?

Большинство систем Linux намеренно игнорируют бит setuid на интерпретируемых скриптах (shell, Python и подобных), потому что фактически выполняется интерпретатор, а не сам скрипт, а интерпретатор работает от имени вызвавшего пользователя. Setuid действует практически только на скомпилированные бинарные файлы вроде /usr/bin/passwd. Если скрипту нужны действия с повышенными правами, настройте правила sudo вместо надежды на chmod 4755 для скрипта.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *