Права доступа
rwx, octal, владельцы и группы. Почему скрипт не запускается, даже когда chmod +x.
Три категории, три права
У каждого файла есть владелец (user) и группа (group). Права задаются отдельно для трёх категорий:
- u (user) — владелец файла,
- g (group) — члены группы файла,
- o (other) — все остальные.
И три вида доступа:
- r (read) — читать,
- w (write) — изменять,
- x (execute) — запускать (для файла) или входить (для директории).
Как читать ls -l
-rwxr-xr-- 1 deploy www-data 4096 May 29 12:00 deploy.sh
Первый блок -rwxr-xr-- разбивается так:
- rwx r-x r--
тип владелец группа остальные
-в начале — тип (-файл,dдиректория,lсимлинк),rwx— владелецdeployможет читать, писать, запускать,r-x— группаwww-dataможет читать и запускать, но не менять,r--— остальные только читают.
Octal-форма
Те же права записываются числом. Каждая категория записывается одной цифрой, сумма битов:
r= 4,w= 2,x= 1.
Складываем внутри категории: rwx = 4+2+1 = 7, r-x = 4+1 = 5,
r-- = 4. Значит -rwxr-xr-- это 754.
Частые комбинации, которые стоит узнавать на глаз:
| Octal | Права | Где встречается |
|---|---|---|
644 | rw-r--r-- | обычный файл: владелец пишет, все читают |
600 | rw------- | приватный файл: только владелец (ключи SSH) |
755 | rwxr-xr-x | скрипт/бинарник: все запускают, меняет владелец |
700 | rwx------ | приватная папка/скрипт только для владельца |
777 | rwxrwxrwx | всё всем. Почти всегда ошибка, не делай так |
Команды
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.
Права на директории работают иначе
Для директории биты значат не то же самое:
r— можно посмотреть список файлов (ls),w— можно создавать/удалять файлы внутри,x— можно войти в директорию (cd) и обращаться к файлам по имени.
Коварный момент: чтобы прочитать файл /a/b/file.txt, нужен x на
/a и /a/b, даже если на сам файл права есть. Без x на папке до
содержимого не добраться.
Спецбиты
- sticky bit (
1спереди, напр.1777на/tmp): в такой директории удалять файлы может только их владелец, даже если папка открыта всем на запись. - SUID (
4): исполняемый файл запускается с правами владельца файла, а не запустившего. Так работаетpasswd(меняет/etc/shadowот root). Мощно и опасно. - SGID (
2): то же для группы; на директории новые файлы наследуют группу папки.
umask
Новые файлы создаются от базовых прав 666, а директории от 777, и из
этой базы umask вычитается. Типичный umask 022 снимает w у группы и
остальных: файлы рождаются 644, директории 755. Текущее значение
показывает команда umask.
Ловушки
chmod +xне помог. Бит стоит, а./script.shотвечает ошибкой. Две частые причины. Первая: раздел смонтирован с опциейnoexec, и оттуда нельзя запускать ничего, как права ни ставь. Проверяется черезfindmnt -T ./script.sh. Вторая: файл приехал из Windows, и в конце строки шебанга остался символ\r. Система ищет интерпретатор с именем/bin/bash\r, не находит и говорит «bad interpreter». Лечитсяdos2unix script.shилиsed -i 's/\r$//' script.sh.- Permission denied в Docker. Внутри контейнера процесс под uid
1000, а bind-mount каталог на хосте принадлежит другому uid. Файлы есть, а доступа нет: права смотрят на числовой uid, не на имя. 777"чтобы заработало". Так "чинят" права в спешке, и это дыра: любой может переписать файл. Правильнее выдать права точечно нужной категории.
Кто ты и что у файла
Свой 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 и редиректы: как соединять команды и перенаправлять вывод.
Дрилл · вопросы как на собесе
Проверь себя без подсказок
Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.
chmod -x chmod. Что делать, если у chmod убрали права на исполнение?
LIN-096Что такое наделение бинарника capabilities (`setcap`/`getcap`)? Чем лучше SUID?
LIN-084Что такое SUID, SGID и sticky bit? Чем плохи и чем заменить?
LIN-114Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс