← Назад к вопросам

Что такое базовая система прав в Linux?

1.0 Junior🔥 251 комментариев
#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Базовая система прав в Linux

Система прав в Linux — это механизм контроля доступа, который определяет, какие пользователи и группы могут выполнять какие операции над файлами и директориями. Это критически важно для безопасности и многопользовательского окружения.

Основные компоненты

Три типа пользователей:

  1. Owner (Владелец) — пользователь, создавший файл
  2. Group (Группа) — группа пользователей, связанная с файлом
  3. 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 — это основной инструмент для обеспечения безопасности в многопользовательских системах, позволяющий точно контролировать доступ к ресурсам.