Структура
Когда ls -l ~/.bashrc показывает -rw-r--r-- 1 student student 3771 ...,
расшифровка такая:
-- тип объекта (-файл,dдиректория,lsymlink,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.
Команды
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:
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
ls -ld /tmp /usr/bin/sudo
# drwxrwxrwt ... /tmp ← t = sticky
# -rwsr-xr-x ... /usr/bin/sudo ← s = setuid