← Linux: основы
12 мин · просто · Урок 6 из 8

Права доступа

rwx, octal, владельцы и группы. Почему скрипт не запускается, даже когда chmod +x.

Три категории, три права

У каждого файла есть владелец (user) и группа (group). Права задаются отдельно для трёх категорий:

И три вида доступа:

Как читать ls -l

-rwxr-xr--  1 deploy  www-data  4096 May 29 12:00 deploy.sh

Первый блок -rwxr-xr-- разбивается так:

-     rwx        r-x       r--
тип   владелец   группа    остальные

Octal-форма

Те же права записываются числом. Каждая категория записывается одной цифрой, сумма битов:

Складываем внутри категории: rwx = 4+2+1 = 7, r-x = 4+1 = 5, r-- = 4. Значит -rwxr-xr-- это 754.

Частые комбинации, которые стоит узнавать на глаз:

OctalПраваГде встречается
644rw-r--r--обычный файл: владелец пишет, все читают
600rw-------приватный файл: только владелец (ключи SSH)
755rwxr-xr-xскрипт/бинарник: все запускают, меняет владелец
700rwx------приватная папка/скрипт только для владельца
777rwxrwxrwxвсё всем. Почти всегда ошибка, не делай так

Команды

chmod 755 deploy.sh         # octal-форма
chmod +x deploy.sh          # добавить execute всем категориям
chmod u+x,go-w deploy.sh    # символьная форма: точечно
chown deploy file           # сменить владельца
chown deploy:www-data file  # владельца и группу
chgrp www-data file         # только группу

Менять владельца (chown) может только root. Менять права (chmod) - владелец файла или root.

Права на директории работают иначе

Для директории биты значат не то же самое:

Коварный момент: чтобы прочитать файл /a/b/file.txt, нужен x на /a и /a/b, даже если на сам файл права есть. Без x на папке до содержимого не добраться.

Спецбиты

umask

Новые файлы создаются от базовых прав 666, а директории от 777, и из этой базы umask вычитается. Типичный umask 022 снимает w у группы и остальных: файлы рождаются 644, директории 755. Текущее значение показывает команда umask.

Ловушки

Кто ты и что у файла

Свой uid/gid и группы показывает id, а полную карточку файла даёт stat:

$ id
uid=1000(deploy) gid=1000(deploy) groups=1000(deploy),27(sudo)

$ stat deploy.sh
  File: deploy.sh
  Size: 4096   Blocks: 8   IO Block: 4096   regular file
Access: (0754/-rwxr-xr--)  Uid: ( 1000/ deploy)  Gid: ( 33/www-data)

stat показывает права и в octal (0754), и в символьном виде, плюс владельца и группу. Без id непонятно, под каким uid ты работаешь, а значит, попадаешь ли ты в категорию u, g или o.

Что важно запомнить

rwx для u/g/o. В octal: r=4, w=2, x=1; 755, 644, 600 узнавай на глаз.

На директории x — это право войти, без него не добраться до файлов внутри.

chmod +x не спасёт, если раздел смонтирован с noexec или в шебанге застрял виндовый \r. 777 — почти всегда ошибка.

В контейнере права смотрят на числовой uid, отсюда Permission denied на bind-mount.

В следующем уроке разберём pipes и редиректы: как соединять команды и перенаправлять вывод.

Дрилл · вопросы как на собесе

Проверь себя без подсказок

Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.

01

chmod -x chmod. Что делать, если у chmod убрали права на исполнение?

LIN-096
02

Что такое наделение бинарника capabilities (`setcap`/`getcap`)? Чем лучше SUID?

LIN-084
03

Что такое SUID, SGID и sticky bit? Чем плохи и чем заменить?

LIN-114

Прошли материал до конца? Отметьте урок пройденным.