# File permissions: rwx и chmod _Файловая система · LinuxLab Knowledge Base_ **TL;DR:** Каждый файл имеет три набора прав - для владельца, группы и остальных. Каждый набор это три бита: read (r), write (w), execute (x). Меняем через `chmod`. ## Структура Когда `ls -l ~/.bashrc` показывает `-rw-r--r-- 1 student student 3771 ...`, расшифровка такая: - `-` - тип объекта (`-` файл, `d` директория, `l` symlink, `c/b` устройство) - `rw-` - права владельца (user) - `r--` - права группы - `r--` - права всех остальных (other) Каждый набор - три флага: | бит | значение для файла | значение для директории | |---|---|---| | r | прочитать содержимое | вывести список файлов (`ls`) | | w | изменить содержимое | создать/удалить/переименовать файлы внутри | | x | выполнить как программу | войти в директорию (`cd`) и обращаться по полному пути | Важно: для директории `r` без `x` означает «вижу имена, но не могу зайти и прочитать содержимое отдельных файлов» - встречается редко но бывает. ## Восьмеричная нотация Каждый набор кодируется одной цифрой 0-7: `r=4 + w=2 + x=1`. | mode | rwx | смысл | |---|---|---| | 7 | rwx | всё | | 6 | rw- | чтение+запись | | 5 | r-x | чтение+выполнение | | 4 | r-- | только чтение | | 0 | --- | ничего | Полные права файла = три цифры, например `644 = rw-r--r--`, `755 = rwxr-xr-x`. ## Команды ```bash chmod 600 file.txt # rw------- (только владелец читает/пишет) chmod +x script.sh # добавить execute для всех (u+g+o) chmod u+x,g-w file # символическая запись: u/g/o + a (all) chmod -R go-w /var/www # рекурсивно убрать write у group и other ``` ## chown - владелец и группа `chmod` меняет права. **Владельца** меняет `chown`: ```bash sudo chown alice file.txt # сменить владельца sudo chown alice:developers file.txt # владельца + группу sudo chown -R www-data: /var/www # рекурсивно ``` ## umask - права новых файлов Когда программа создаёт файл (`touch`, `> redirect`), реальные права = `desired_mode & ~umask`. Дефолт `umask 022` означает что новые файлы будут создаваться без write для group и other - то есть `0666 & ~022 = 0644`. ## Special bits: setuid, setgid, sticky Кроме обычных rwx есть три дополнительных бита (4-я восьмеричная цифра): - **setuid** на исполняемом файле - программа стартует с эффективным UID владельца файла, а не запускающего. Так работает `sudo`, `passwd`, `ping` - **setgid** на директории - новые файлы внутри наследуют группу директории (полезно для shared-папок) - **sticky bit** на директории - файлы внутри может удалять только владелец файла, даже если другие имеют write на директорию. Так защищён `/tmp` ```bash ls -ld /tmp /usr/bin/sudo # drwxrwxrwt ... /tmp ← t = sticky # -rwsr-xr-x ... /usr/bin/sudo ← s = setuid ``` ## Команды ```bash stat -c '%a %n' file.txt ``` Вывести права в восьмеричном виде (например `644 file.txt`) ```bash chmod 600 ~/.ssh/id_rsa ``` Закрыть приватный SSH-ключ от всех кроме владельца - обязательное требование sshd ```bash umask ``` Текущая маска создания файлов в этом шелле ```bash find / -perm -4000 2>/dev/null ``` Найти все setuid-бинари в системе (важно для security audit) ## См. также - [Inode](/kb/inode.md) - [POSIX ACL - расширенные права доступа](/kb/posix-acl.md) - [Extended attributes (xattr) - произвольные метаданные файла](/kb/extended-attributes.md) - [SUID, SGID, sticky bit - спецбиты прав](/kb/setuid-setgid-sticky.md) - [Hard link](/kb/hard-link.md)