Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Базовая система прав в Linux
Система прав в Linux — это механизм контроля доступа, который определяет, какие пользователи и группы могут выполнять какие операции над файлами и директориями. Это критически важно для безопасности и многопользовательского окружения.
Основные компоненты
Три типа пользователей:
- Owner (Владелец) — пользователь, создавший файл
- Group (Группа) — группа пользователей, связанная с файлом
- Others (Прочие) — все остальные пользователи
Три типа прав:
- Read (r) = 4 — чтение файла или список содержимого директории
- Write (w) = 2 — изменение файла или создание/удаление в директории
- Execute (x) = 1 — выполнение файла или доступ в директорию
Просмотр прав: команда ls -l
ls -l файл.txt
-rw-r--r-- 1 alice staff 1024 Mar 23 10:30 файл.txt
Разбор:
-rw-r--r-- 1 alice staff 1024 Mar 23 10:30 файл.txt
│││││││││ │ │ │ │ │
││││││││└─┤ │ │ │ └─ Имя файла
││││││││ │ │ │ └─────── Размер
││││││││ │ │ └──────────────── Группа
││││││││ │ └───────────────────── Владелец
││││││││ └─────────────────────── Количество ссылок
││││││││
│└┴┴┴┴┴┴── Права для others (r--)
│└──┴──┴── Права для group (r--)
└───────── Права для owner (rw-)
Первый символ:
-= обычный файлd= директорияl= символическая ссылкаc= символьное устройствоb= блочное устройство
Восьмеричная нотация прав
rwx = 7 (4+2+1)
rw- = 6 (4+2)
r-x = 5 (4+1)
r-- = 4
-w- = 2
--x = 1
--- = 0
Примеры:
644 = rw-r--r-- (файл)
755 = rwxr-xr-x (исполняемый файл или директория)
777 = rwxrwxrwx (все права для всех)
600 = rw------- (только владелец читает и пишет)
Изменение прав: команда chmod
Восьмеричный способ:
# Дать права 755 файлу
chmod 755 script.sh
# Дать права 644 файлу
chmod 644 документ.txt
# Дать все права
chmod 777 файл.txt
# Рекурсивно для директории и содержимого
chmod -R 755 /path/to/directory
Символический способ:
# Добавить право на выполнение для владельца
chmod u+x script.sh
# Добавить право на чтение для группы
chmod g+r файл.txt
# Удалить право на запись для других
chmod o-w файл.txt
# Дать права для всех
chmod a+x script.sh
# Простые комбинации
chmod u=rwx,g=rx,o=rx script.sh # Эквивалент 755
Примеры в Python:
import os
import stat
# Изменить права файла на 755
os.chmod('script.sh', 0o755)
# Изменить права на 644
os.chmod('document.txt', 0o644)
# Добавить право на выполнение
st = os.stat('file.txt')
os.chmod('file.txt', st.st_mode | stat.S_IXUSR)
# Удалить право на запись для других
st = os.stat('file.txt')
os.chmod('file.txt', st.st_mode & ~stat.S_IWOTH)
# Проверить права
st = os.stat('file.txt')
mode = stat.filemode(st.st_mode)
print(f"Права: {mode}") # -rw-r--r--
Изменение владельца и группы: chown
# Изменить владельца
chown alice файл.txt
# Изменить владельца и группу
chown alice:staff файл.txt
# Рекурсивно для директории
chown -R alice:staff /path/to/directory
# Только изменить группу
chgrp staff файл.txt
В Python:
import os
# Получить UID и GID
import pwd
import grp
uid = pwd.getpwnam('alice').pw_uid
gid = grp.getgrnam('staff').gr_gid
# Изменить владельца и группу
os.chown('file.txt', uid, gid)
Специальные биты: SUID, SGID, Sticky Bit
SUID (Set User ID) — 4000:
# Файл выполняется с правами владельца, не запустившего
chmod 4755 /usr/bin/passwd
SGID (Set Group ID) — 2000:
# Файл выполняется с правами группы
chmod 2755 /path/to/binary
Sticky Bit — 1000:
# В директории только владелец может удалить свои файлы
chmod 1777 /tmp
Полная нотация:
# 4755 = -rwsr-xr-x (SUID + rwx для owner)
# 2755 = -rwxr-sr-x (SGID + rwx для owner)
# 1755 = -rwxr-xr-t (Sticky Bit + rwx для owner)
Проверка прав в Python
import os
import stat
def check_permissions(filepath):
st = os.stat(filepath)
mode = st.st_mode
# Проверка прав
is_readable = bool(mode & stat.S_IRUSR) # Владелец может читать?
is_writable = bool(mode & stat.S_IWUSR) # Владелец может писать?
is_executable = bool(mode & stat.S_IXUSR) # Владелец может выполнять?
print(f"Владелец может читать: {is_readable}")
print(f"Владелец может писать: {is_writable}")
print(f"Владелец может выполнять: {is_executable}")
# Более удобный способ
perms = stat.filemode(mode)
print(f"Права: {perms}") # Например: -rw-r--r--
check_permissions('file.txt')
Практические примеры
Создание скрипта с правами на выполнение:
chmod +x script.sh
./script.sh
Защита приватных файлов:
chmod 600 ~/.ssh/id_rsa # Только владелец может читать
chmod 644 ~/.ssh/id_rsa.pub # Владелец пишет, остальные читают
chmod 700 ~/.ssh # Только владелец может входить в директорию
Общее хранилище для группы:
mkdir /data/shared
chown alice:team /data/shared
chmod 770 /data/shared # Владелец и группа могут читать/писать
Маска прав по умолчанию: umask
# Посмотреть текущую маску
umask # Например: 0022
# Установить маску
umask 0027 # Новые файлы будут иметь права 640
# В Python
import os
os.umask(0o027)
Временные права и безопасность
import os
import tempfile
from contextlib import contextmanager
@contextmanager
def secure_file(filename):
# Создать файл с правами 600
old_umask = os.umask(0o077)
try:
with open(filename, 'w') as f:
yield f
finally:
os.umask(old_umask)
# Убедиться, что права установлены правильно
os.chmod(filename, 0o600)
# Использование
with secure_file('secret.txt') as f:
f.write('sensitive data')
Система прав в Linux — это основной инструмент для обеспечения безопасности в многопользовательских системах, позволяющий точно контролировать доступ к ресурсам.