📖 Теория — Права доступа и bash-скрипт

К оглавлению урока

⚡ Кратко: права и bash-скрипт

  • ls -la — строка прав: -rwxr-xr-- (тип + 3 × rwx: владелец/группа/остальные)
  • Числовой chmod: 4=r, 2=w, 1=x; сумма трёх цифр; chmod 755, chmod 644, chmod 600
  • Буквенный chmod: u+x, go-w, a+x, u=rw,go=r
  • Bash-скрипт: первая строка #!/bin/bash (shebang); комментарий #; переменная name="Andrew"
  • Запуск: chmod +x script.sh./script.sh

1. Права на файлы — строка ls -la

Запустите ls -la в любой директории. Первая колонка — строка из 10 символов:

-rwxr-xr--  1 alice devs  1234 Jun 11 10:00 script.sh
drwxr-xr-x  2 alice devs  4096 Jun 11 09:00 mydir

Структура строки прав

Позиция Значение Пример
Символ 1 Тип файла: - файл, d директория, l симлинк -
Символы 2–4 Права владельца (user): r w x rwx
Символы 5–7 Права группы (group): r w x r-x
Символы 8–10 Права остальных (others): r w x r--

Типы прав

  • r (Read) — чтение файла / просмотр списка директории
  • w (Write) — запись в файл / создание/удаление файлов в директории
  • x (Execute) — выполнение файла / переход в директорию (cd)
  • - (minus) — право отсутствует

2. Специальные биты: SUID, SGID, sticky

Кроме rwx существуют три специальных бита — они меняют поведение при запуске или доступе к директории.

SUID (Set User ID)

Обозначается s вместо x у владельца: -rwsr-xr-x. Файл запускается с правами его владельца, а не того, кто запустил. Пример: /usr/bin/passwd — запускается с правами root, чтобы обновить /etc/shadow.

SGID (Set Group ID)

Обозначается s у группы: -rwxr-sr-x. Файлы, созданные в директории с SGID, наследуют группу директории — удобно для общих папок команды.

Sticky bit

Обозначается t у остальных: drwxrwxrwt. Только владелец файла может его удалить, даже если директория доступна для записи всем. Классический пример: /tmp.

ls -la /tmp
# drwxrwxrwt  10 root root 4096 Jun 11 10:00 /tmp
#                         ^ sticky bit

3. Цвета файлов в терминале

Команда ls --color (или просто ls с цветами по умолчанию) использует цвета для разных типов:

  • Зелёный — исполняемые файлы (имеют бит x)
  • Белый / серый — обычные файлы
  • Синий — директории
  • Голубой — символические ссылки (симлинки)
  • Красный — архивы (.tar, .gz, .zip, .rpm)

4. chmod — числовой режим

Каждое право — это число: 4 = r, 2 = w, 1 = x. Сумма трёх чисел — права одной группы. Три цифры = права для владельца / группы / остальных.

Число rwx-запись Значение
7rwx4+2+1: чтение + запись + выполнение
6rw-4+2: чтение + запись
5r-x4+1: чтение + выполнение
4r--4: только чтение
0---нет прав

Типичные значения

chmod 755 script.sh   # rwxr-xr-x: владелец всё; группа/остальные — читать+запускать
chmod 644 file.txt    # rw-r--r--: владелец читает+пишет; остальные — только читают
chmod 600 private.key # rw-------: владелец читает+пишет; никто больше
chmod 700 mydir       # rwx------: директория только для владельца
chmod -R 755 mydir    # рекурсивно для всей директории
⚠️ ОПАСНО: chmod 777
chmod 777 file даёт права на чтение, запись и исполнение всем пользователям системы. Это серьёзная дыра в безопасности. Никогда не применяйте chmod 777 к конфигурационным файлам, SSH-ключам, файлам на продакшн-сервере. Если хотите дать права только себе — используйте chmod 600 или chmod 700.

Для приватного SSH-ключа используйте: chmod 600 ~/.ssh/id_rsa

5. chmod — буквенный режим

Буквенный синтаксис: chmod КТО ДЕЙСТВИЕ ПРАВА файл

КТО ДЕЙСТВИЕ ПРАВА
u — владелец (user)
g — группа (group)
o — остальные (others)
a — все (all)
+ — добавить
- — убрать
= — установить точно
r — чтение
w — запись
x — выполнение
chmod u+x script.sh        # добавить владельцу право на выполнение
chmod go-w file.txt        # убрать у группы и остальных право на запись
chmod a+x script.sh        # добавить право выполнения всем
chmod +x script.sh         # то же самое (a подразумевается)
chmod u=rw,go=r file.txt   # точно установить: владелец rw, группа/остальные r
chmod o= file.txt          # убрать все права у остальных

6. Bash-скрипты: shebang и структура

Bash-скрипт — текстовый файл с набором команд Bash (Bourne Again SHell). Расширение .sh необязательно, но помогает ориентироваться. Главное — первая строка скрипта.

Shebang

Первая строка #!/bin/bash называется shebang (или hashbang). Она сообщает системе, каким интерпретатором запускать файл. #! — специальная последовательность; /bin/bash — путь к интерпретатору.

Комментарии

Строка, начинающаяся с # (кроме shebang), является комментарием и игнорируется при выполнении.

Структура скрипта

script.sh

#!/bin/bash
# Это комментарий — игнорируется при выполнении
name="Andrew"
echo "Hello $name"
date

Переменные

Переменная объявляется без пробелов вокруг =: name="Andrew". Для чтения значения — добавить $ перед именем: $name.

7. Три способа запуска скрипта

# Способ 1: ./script.sh  (из текущей директории — ПРАВИЛЬНЫЙ)
chmod +x script.sh
./script.sh

# Способ 2: полный путь (из любой директории)
chmod +x /path/to/script.sh
/path/to/script.sh

# Способ 3: bash script.sh  (обходит права на выполнение — не требует chmod +x)
bash script.sh
Примечание о третьем способе: bash script.sh запускает скрипт, даже если у него нет бита x. Это создаёт ложное ощущение, что скрипт работает — на самом деле вы вызываете интерпретатор, а не сам файл. В продакшн-окружении предпочтительны способы 1 и 2.

8. Смена владельца и группы

chown alice file.txt           # сменить владельца
chown alice:devs file.txt      # сменить владельца и группу
chgrp devs file.txt            # сменить только группу
chown -R alice:devs mydir/     # рекурсивно
⚠️ Проверить по документации: set -euo pipefail в начале bash-скрипта — современный best practice безопасности. -e прерывает выполнение при ошибке, -u запрещает необъявленные переменные, -o pipefail передаёт код ошибки через конвейер.
⚠️ ОПАСНО: rm -rf
rm -rf путь удаляет файлы и директории необратимо, без корзины. Это одна из самых опасных команд Linux. Особая опасность — пустая переменная в пути: если переменная VAR не задана, команда rm -rf $VAR/data превращается в rm -rf /data и уничтожает системный каталог.

Экстремальный пример: rm -rf $VAR/ при пустом VARrm -rf / — удаление всей файловой системы. Всегда проверяйте путь перед Enter. Всегда проверяйте, что переменная не пуста.