Перейти до вмісту

Модуль 0.2: Оточення та Дозволи (Хто ви та де ви)

Hands-On Lab Available
Ubuntu intermediate 30 min
Launch Lab ↗

Opens in Killercoda in a new tab

Щоденне використання | Складність: [QUICK] | Час: 45 хв

Перед початком цього модуля:


Що ви зможете робити після цього модуля

Розділ «Що ви зможете робити після цього модуля»

Після завершення цього модуля ви зможете:

  • Налаштувати змінні оточення (PATH, HOME, PS1) та пояснити, як вони успадковуються
  • Дебажити помилки “command not found”, відстежуючи змінну PATH
  • Використовувати sudo безпечно та пояснити, чому працювати від root небезпечно
  • Керувати правами власності та дозволами файлів для різних користувачів і груп

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

Уявіть ситуацію. Ви завантажуєте скрипт з інструкції. Вводите ./deploy.sh. Термінал відповідає:

bash: ./deploy.sh: Permission denied

Ви пробуєте ще раз, просто deploy.sh (без ./). Тепер отримуєте:

bash: deploy.sh: command not found

Ви дивитеся на екран. Файл ось він, прямо тут. Ви бачите його через ls. Чому Linux вдає, що його не існує? І чому, коли ви вказуєте прямо на нього, Linux відмовляється його запускати?

Ці дві помилки — «Permission denied» (Відмовлено у доступі) та «command not found» (команду не знайдено) — мабуть, найбільше дратують початківців у Linux. Вони здаються випадковими й несправедливими. Але вони зовсім не випадкові. Вони походять від двох систем, які працюють саме так, як було задумано:

  1. Оточення (Environment) — набір налаштувань, які кажуть вашій оболонці (shell), де шукати програми, хто ви такий і як поводитися.
  2. Дозволи (Permissions) — система безпеки, яка контролює, хто може читати, записувати та виконувати кожен файл у системі.

Щойно ви зрозумієте ці дві системи, ці загадкові помилки перетворяться з глухих стін на корисні вказівники. Ви будете знати точно, що не так і точно, як це виправити. Що ще важливіше, коли ви почнете працювати з Kubernetes, ви зрозумієте, чому контейнери працюють не від root, навіщо потрібні ServiceAccounts і чому важливий RBAC — бо всі вони побудовані на цих самих концепціях дозволів.


  1. Змінна $PATH з’явилася в Unix Version 7 у 1979 році. До цього доводилося вводити повний шлях до кожної команди — уявіть, що ви пишете /usr/bin/ls щоразу, коли хочете переглянути список файлів.

  2. Числова система дозволів (наприклад, chmod 755) базується на вісімковій (base-8) системі числення. Кожна цифра представляє три бінарні біти — для читання, запису та виконання. Це буквально двійкова математика, яку можна рахувати в умі.

  3. Команда sudo записує кожен виклик у файл /var/log/auth.log. Ваш системний адміністратор бачить точно, що ви запускали й коли. З sudo немає жодних таємниць.

  4. У більшості дистрибутивів Linux домашня директорія користувача root — це /root, а не /home/root. Root настільки особливий, що навіть не живе в одному “районі” зі звичайними користувачами.


1. Змінні оточення: Панель налаштувань вашого термінала

Розділ «1. Змінні оточення: Панель налаштувань вашого термінала»

Думайте про змінні оточення (environment variables) як про додаток «Налаштування» у вашому телефоні. Ваш телефон зберігає обрану мову, браузер за замовчуванням, шпалери — щоб кожен додаток знав, як поводитися, не запитуючи вас щоразу. Змінні оточення роблять те саме для вашого термінала та кожної програми, що в ньому працює.

Змінна оточення — це просто пара назва=значення, що зберігається в пам’яті. За домовленістю назви пишуться ВЕЛИКИМИ_ЛІТЕРАМИ з підкресленнями:

Terminal window
# Подивитися ВСІ ваші змінні оточення (їх багато!)
env
# Або використайте printenv для того ж самого
printenv
# Подивитися значення конкретної змінної — знак $ каже "дай мені значення"
echo $USER
echo $HOME

Основні змінні, які варто знати

Розділ «Основні змінні, які варто знати»
ЗміннаЩо зберігаєПриклад значення
$USERВаше поточне ім’я користувачаalice
$HOMEШлях до вашої домашньої директорії/home/alice
$SHELLВаша оболонка за замовчуванням/bin/bash
$PWDВаша поточна робоча директорія/home/alice/projects
$EDITORВаш улюблений текстовий редакторvim або nano
$LANGВаша мова та кодуванняuk_UA.UTF-8
$HOSTNAMEНазва цієї машиниweb-server-01
$TERMТип вашого терміналаxterm-256color
$PATHДе шукати команди(див. наступний розділ)

Спробуйте їх зараз:

Terminal window
echo "Привіт, $USER! Ви на машині $HOSTNAME."
echo "Ваш дім — $HOME, а оболонка — $SHELL."
echo "Зараз ви знаходитесь у $PWD."

2. $PATH — найважливіша змінна у вашому житті

Розділ «2. $PATH — найважливіша змінна у вашому житті»

Коли ви вводите ls і натискаєте Enter, звідки оболонка знає, де лежить програма ls? Вона не шукає по всьому жорсткому диску — це тривало б вічність. Замість цього вона перевіряє конкретний список директорій, по порядку, і запускає перший знайдений збіг. Цей список і є вашим $PATH.

Terminal window
echo $PATH

Ви побачите щось таке (директорії, розділені двокрапками):

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/home/alice/bin

Ось як оболонка використовує це, коли ви вводите команду:

Ви вводите: kubectl
Оболонка шукає в директоріях $PATH зліва направо:
/usr/local/bin/kubectl → існує? НІ → шукаємо далі
/usr/bin/kubectl → існує? НІ → шукаємо далі
/bin/kubectl → існує? НІ → шукаємо далі
/usr/sbin/kubectl → існує? НІ → шукаємо далі
/sbin/kubectl → існує? НІ → шукаємо далі
/home/alice/bin/kubectl → існує? ТАК → ЗАПУСКАЄМО!
Якщо нічого не знайдено в жодній директорії:
→ "bash: kubectl: command not found"

Ось чому ./deploy.sh працює, а deploy.sh — ні. Поточна директорія (.) за замовчуванням не входить у ваш $PATH. Коли ви пишете deploy.sh, оболонка перевіряє всі папки з $PATH, не знаходить його і здається. Коли ви пишете ./deploy.sh, ви вказуєте явний шлях — ви кажете «запусти файл прямо тут» — тому оболонці $PATH взагалі не потрібен.

Як знайти, де лежать команди

Розділ «Як знайти, де лежать команди»
/usr/bin/ls
# which — показує повний шлях до команди
which ls
which python3
# Вивід: /usr/bin/python3
# type — показує, чим оболонка вважає команду
type ls
# Вивід: ls is aliased to 'ls --color=auto' (якщо є аліас)
# Вивід: ls is /usr/bin/ls (якщо немає)
type cd
# Вивід: cd is a shell builtin (вбудовано в сам bash)

Як додати директорію до $PATH

Розділ «Як додати директорію до $PATH»

Припустімо, ви тримаєте власні скрипти у ~/bin. Вам потрібно додати цю папку до $PATH:

Terminal window
# Тимчасово — діє, поки ви не закриєте термінал
export PATH="$HOME/bin:$PATH"
# Перевірте, чи спрацювало
echo $PATH
# Тепер /home/alice/bin з'явився на початку

Додавання директорії на початок означає, що ваші скрипти будуть знайдені першими, навіть якщо є системна команда з такою ж назвою. Додавання в кінець надає пріоритет системним командам.

Щоб зробити це назавжди, додайте рядок export PATH=... у конфігураційний файл вашої оболонки (розглянемо в розділі 4).


3. Встановлення змінних: export проти простого присвоєння

Розділ «3. Встановлення змінних: export проти простого присвоєння»

Ця різниця збиває з пантелику майже всіх. Дивіться уважно:

Terminal window
# Встановлення змінної БЕЗ export
GREETING="Привіт від батька"
echo $GREETING # Працює! Виводить: Привіт від батька
bash # Запускаємо дочірню оболонку (новий процес)
echo $GREETING # Нічого! Пусто! Дочірній процес про неї не знає
exit # Повертаємося в батьківську оболонку
# Встановлення змінної З export
export GREETING="Привіт від батька"
echo $GREETING # Працює!
bash # Запускаємо дочірню оболонку
echo $GREETING # Працює! Дочірня оболонка успадкувала змінну
exit # Повертаємося назад

Чому це важливо? Тому що кожна команда, яку ви запускаєте, є дочірнім процесом вашої оболонки. Коли ви запускаєте Python-скрипт, команду Docker або kubectl, вони є дочірніми процесами. Якщо ви встановили змінну без export, ці програми її не побачать.

Правило просте:

  • Без export: Змінна існує тільки в поточній сесії термінала. Використовуйте для швидких тимчасових значень.
  • З export: Змінна успадковується всіма дочірніми процесами. Використовуйте для налаштувань, які мають бачити програми (як-от $KUBECONFIG, $EDITOR, $JAVA_HOME).
Terminal window
# Популярні експорти, які ви побачите в роботі з Kubernetes
export KUBECONFIG=~/.kube/config
export EDITOR=vim
export JAVA_HOME=/usr/lib/jvm/java-17
# Тимчасове значення — export не потрібен
BACKUP_DATE=$(date +%Y-%m-%d)
echo "Робимо бекап за $BACKUP_DATE"
Terminal window
# Повністю видалити змінну
unset GREETING
echo $GREETING # Нічого — її більше немає

4. Конфігураційні файли оболонки: Робимо зміни постійними

Розділ «4. Конфігураційні файли оболонки: Робимо зміни постійними»

Будь-яка зміна в терміналі — тимчасова, вона зникає при закритті вікна. Щоб змінні оточення, аліаси та зміни $PATH стали постійними, їх треба додати в конфігураційний файл, який запускається автоматично при старті нової оболонки.

Але в який саме? Тут починається плутанина, бо їх декілька і вони працюють у різний час.

Коли запускається кожен файл

Розділ «Коли запускається кожен файл»
┌──────────────────────────────────────────────────────────┐
│ LOGIN SHELL (Оболонка входу) │
│ (SSH сесія, перший вхід у консоль Linux) │
│ │
│ Запускає: /etc/profile │
│ → потім ПЕРШИЙ знайдений із: │
│ ~/.bash_profile │
│ ~/.bash_login │
│ ~/.profile │
│ │
│ Думайте: "Вітаємо! Дайте мені налаштувати всю сесію." │
└──────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────┐
│ INTERACTIVE NON-LOGIN SHELL │
│ (нова вкладка/вікно термінала на робочому столі) │
│ │
│ Запускає: ~/.bashrc │
│ │
│ Думайте: "Просто ще одна оболонка, ось ваші скорочення."│
└──────────────────────────────────────────────────────────┘

На практиці більшість людей хоче мати однакові налаштування в усіх оболонках. Стандартний трюк такий:

  1. Пишете всі налаштування в ~/.bashrc
  2. Налаштовуєте ~/.bash_profile, щоб він підвантажував (source) його:
Terminal window
# Вміст ~/.bash_profile
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi

Таким чином, login-оболонки також завантажать .bashrc, і ви підтримуватимете лише один файл.

Для користувачів Zsh (стандарт у macOS): Аналогом є ~/.zshrc. Zsh читає його для кожної інтерактивної оболонки, незалежно від типу входу — це набагато простіше.

Перезавантаження після змін

Розділ «Перезавантаження після змін»

Після редагування файлу конфігурації НЕ потрібно закривати й відкривати термінал:

Terminal window
# Перезавантажити .bashrc негайно
source ~/.bashrc
# Скорочений варіант (робить те саме)
. ~/.bashrc

5. Аліаси (Aliases): Ваші власні скорочення

Розділ «5. Аліаси (Aliases): Ваші власні скорочення»

Аліас — це власне скорочення, яке розгортається в довшу команду. Вони економлять вам тисячі натискань на клавіші щодня.

Terminal window
# Створити аліас
alias ll='ls -la'
alias ..='cd ..'
alias ...='cd ../..'
alias cls='clear'
alias ports='ss -tulnp'
alias myip='curl -s ifconfig.me'

Корисні аліаси для DevOps та Kubernetes

Розділ «Корисні аліаси для DevOps та Kubernetes»
Terminal window
# Kubernetes — аліас k використовується в усьому KubeDojo
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgs='kubectl get svc'
alias kgn='kubectl get nodes'
alias kaf='kubectl apply -f'
alias kdel='kubectl delete -f'
alias klog='kubectl logs -f'
# Docker
alias dps='docker ps'
alias dimg='docker images'
alias dex='docker exec -it'
# Запобіжники — запитувати підтвердження перед дією
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'
# Швидка інфо про систему
alias meminfo='free -h'
alias diskinfo='df -h'
alias cpuinfo='lscpu'

Щоб зробити аліаси постійними, додайте їх у свій ~/.bashrc:

Terminal window
# Відкрийте .bashrc і додайте аліаси в кінець
nano ~/.bashrc
# Після додавання перезавантажте конфіг
source ~/.bashrc

Перевірка та видалення аліасів

Розділ «Перевірка та видалення аліасів»
Terminal window
# Подивитися всі поточні аліаси
alias
# Подивитися, у що розгортається конкретний аліас
alias ll
# Вивід: alias ll='ls -la'
# Тимчасово ігнорувати аліас (використати оригінальну команду)
\ls # Зворотний слеш ігнорує аліас
command ls # Ще один спосіб
# Видалити аліас для поточної сесії
unalias ll

6. Дозволи на файли: Система rwx

Розділ «6. Дозволи на файли: Система rwx»

Linux — це багатокористувацька операційна система. Навіть якщо ви єдина людина, що користується машиною, у системі є десятки системних користувачів (як www-data для вебсервера або postgres для бази даних). Дозволи гарантують, що ваш вебсервер не зможе прочитати ваші SSH-ключі, а база даних не зможе змінити код вашого додатка.

Запустіть ls -l у будь-якій директорії:

Terminal window
ls -l /etc/passwd /bin/ls /home
# Вивід виглядає так:
# -rwxr-xr-x 1 root root 142144 Sep 5 2023 /bin/ls
# -rw-r--r-- 1 root root 2775 Mar 10 14:22 /etc/passwd
# drwxr-xr-x 3 root root 4096 Mar 10 14:22 /home

Давайте розкодуємо першу колонку символ за символом:

- r w x r - x r - x
│ │ │ │ │ │ │ │ │ │
│ └──┴──┘ └──┴──┘ └──┴──┘
│ │ │ │
│ ВЛАСНИК ГРУПА ІНШІ
│ (user)
└── Тип файлу
- = звичайний файл
d = директорія
l = символічне посилання

Що насправді означають r, w, x

Розділ «Що насправді означають r, w, x»
ДозвілДля файлуДля директорії
r (read)Читати вміст (cat, less)Переглядати список файлів (ls)
w (write)Змінювати або видаляти файлСтворювати, перейменовувати чи видаляти файли всередині
x (execute)Запускати файл як програмуЗаходити в директорію (cd)
- (none)Дія забороненаДія заборонена

Дозволи для директорій часто дивують. Директорія без x — це як кімната із замкненими дверима: ви не можете зайти, навіть якщо знаєте, що всередині. Директорія без r, але з x — це як темна кімната: ви можете зайти й намацати файли, якщо знаєте їхні назви, але не можете ввімкнути світло, щоб побачити весь список.

Читання рядків дозволів — Практика

Розділ «Читання рядків дозволів — Практика»
РядокВласникГрупаІншіЗначення
-rwxr-xr-xrwxr-xr-xТипова програма: всі можуть запускати, тільки власник — редагувати
-rw-r--r--rw-r—r—Типовий конфіг: всі можуть читати, тільки власник — редагувати
-rw-------rw-------Приватний файл: тільки власник може читати й писати
-rwx------rwx------Приватний скрипт: тільки власник може запускати
drwxr-xr-xrwxr-xr-xТипова папка: всі можуть заходити й бачити список, тільки власник — змінювати
drwx------rwx------Приватна папка: тільки власник може зайти

7. Зміна дозволів за допомогою chmod

Розділ «7. Зміна дозволів за допомогою chmod»

chmod (change mode) змінює дозволи. Його можна використовувати двома способами.

Символьний режим — Зрозумілий для людини

Розділ «Символьний режим — Зрозумілий для людини»

Формат: chmod [хто][оператор][дозвіл] файл

  • Хто: u (user/власник), g (group), o (others/інші), a (all/всі троє)
  • Оператор: + (додати), - (забрати), = (встановити точно)
  • Дозвіл: r, w, x
Terminal window
# Зробити скрипт виконуваним для власника
chmod u+x deploy.sh
# Забрати дозвіл на запис у групи та інших
chmod go-w config.yaml
# Дати всім дозвіл на читання
chmod a+r README.md
# Встановити точно: власнику — все, іншим — нічого
chmod u=rwx,go= secret-script.sh
# Додати виконання для всіх
chmod +x run-tests.sh # Без вказання "кого", + діє на всіх
# Забрати всі дозволи у інших
chmod o= private-notes.txt # = без нічого означає "встановити в порожнечу"

Числовий режим — Швидкий і точний

Розділ «Числовий режим — Швидкий і точний»

Кожен дозвіл має число: читання = 4, запис = 2, виконання = 1. Додайте їх для кожної позиції.

Дозвіл Двійковий Десятковий
--------- --------- ----------
--- 000 0 (немає прав)
--x 001 1 (тільки виконання)
-w- 010 2 (тільки запис)
-wx 011 3 (запис + виконання)
r-- 100 4 (тільки читання)
r-x 101 5 (читання + виконання)
rw- 110 6 (читання + запис)
rwx 111 7 (все разом)

Ви вказуєте три цифри: власник, група, інші.

Terminal window
# 755 — власник: rwx (7), група: r-x (5), інші: r-x (5)
# Стандарт для скриптів та програм
chmod 755 deploy.sh
# 644 — власник: rw- (6), група: r-- (4), інші: r-- (4)
# Стандарт для звичайних файлів
chmod 644 config.yaml
# 600 — власник: rw- (6), група: --- (0), інші: --- (0)
# Приватні файли (SSH ключі, паролі)
chmod 600 ~/.ssh/id_rsa
# 700 — власник: rwx (7), група: --- (0), інші: --- (0)
# Приватні папки
chmod 700 ~/.ssh
# 444 — тільки читання для всіх
chmod 444 important-record.txt

Найпоширеніші патерни дозволів

Розділ «Найпоширеніші патерни дозволів»
ПатернЧислоВипадок використання
rwxr-xr-x755Програми, скрипти, директорії
rw-r--r--644Звичайні файли, конфіги
rw-------600Приватні ключі SSH, секрети
rwx------700Директорія .ssh, приватні скрипти
rwxrwxr-x775Спільні папки проєктів
rw-rw-r--664Спільні файли проєктів

8. Власність: chown та chgrp

Розділ «8. Власність: chown та chgrp»

Кожен файл має двох власників: користувача (user) та групу (group).

Terminal window
# Перевірка власності
ls -l myfile.txt
# -rw-r--r-- 1 alice developers 1024 Mar 10 14:22 myfile.txt
# ^^^^^ ^^^^^^^^^^
# власник група
Terminal window
# Змінити власника (потребує sudo, бо ви "віддаєте" файл)
sudo chown bob myfile.txt
# Змінити тільки групу
sudo chgrp developers myfile.txt
# Змінити обох одразу — користувач:група
sudo chown bob:developers myfile.txt
# Змінити власника папки ТА всього всередині (-R = рекурсивно)
sudo chown -R alice:webteam /var/www/mysite
# Змінити тільки групу (якщо ви самі в ній є)
chgrp devops deployment.yaml # sudo не потрібен, якщо ви в групі "devops"

Чому власність важлива для Kubernetes

Розділ «Чому власність важлива для Kubernetes»

Коли контейнер запускається, він працює від імені конкретного користувача (часто root за замовчуванням, що є ризиком). У Kubernetes securityContext ви можете встановити runAsUser та runAsGroup — це та сама концепція власності, яку ви вчите зараз, просто застосована всередині контейнера.


9. Користувач Root та sudo

Розділ «9. Користувач Root та sudo»

Root: Всемогутній суперкористувач

Розділ «Root: Всемогутній суперкористувач»

У Linux є один особливий користувач — root (UID 0). Root може:

  • Читати, писати й запускати БУДЬ-ЯКИЙ файл незалежно від дозволів.
  • “Вбивати” будь-який процес.
  • Змінювати будь-які системні налаштування.
  • Займати системні порти (нижче 1024).
  • Форматувати диски, монтувати системи, робити абсолютно все.

Ось чому працювати під root — небезпечно. Друкарська помилка типу rm -rf / (замість rm -rf ./) миттєво знищить усю систему. Тут немає запитань «Ви впевнені?», немає кошика і немає кнопки «скасувати».

sudo: Безпечне запозичення сили Root

Розділ «sudo: Безпечне запозичення сили Root»

sudo розшифровується як “superuser do” (виконати від імені суперкористувача). Це дозволяє звичайному користувачу виконати одну команду з правами root:

Terminal window
# Встановити пакет (потребує root)
sudo apt update
sudo apt install nginx
# Редагувати системний файл
sudo nano /etc/hosts
# Перезапустити сервіс
sudo systemctl restart nginx
# Подивитися, ким ви стаєте через sudo
sudo whoami
# Вивід: root

Коли ви запускаєте sudo, воно запитує ваш пароль (не пароль root). Це підтвердження того, що людина за клавіатурою — це справді ви, а не хтось, хто підійшов до вашого розблокованого ноутбука.

Не кожен може використовувати sudo. Файл /etc/sudoers визначає, кому це дозволено. Ви ніколи не повинні редагувати його напряму — завжди використовуйте спеціальну команду visudo, яка перевіряє синтаксис перед збереженням (зламаний файл sudoers може назавжди заблокувати вам доступ до root).

На більшості систем доступ до sudo надається через членство в групі:

  • Ubuntu/Debian: група sudo
  • RHEL/CentOS/Fedora: група wheel
Terminal window
# Перевірити, у яких групах ви є
groups
# Вивід: alice sudo docker
# Якщо у списку є "sudo" або "wheel", ви можете використовувати sudo

ПомилкаЧому це стаєтьсяЯк виправити
”command not found” для скрипту в поточній папціПоточна папка . не входить у $PATH. Оболонка шукає тільки в $PATH.Запускайте як ./script.sh (явний шлях) або додайте папку до $PATH.
”Permission denied” при запуску скриптуУ файлу немає дозволу на виконання (x). Linux вимагає його явно.Виконайте chmod u+x script.sh і спробуйте знову.
Аліас зникає після закриття терміналаВи створили його в сесії, але не в ~/.bashrc. Налаштування не зберігаються самі.Додайте рядок alias у ~/.bashrc і виконайте source ~/.bashrc.
Використання sudo vim для своїх файлівФайл стає власністю root. Тепер ви не можете його правити як звичайний юзер.Використовуйте vim без sudo. Якщо вже запізно, зробіть sudo chown $USER файл.
Постійна робота під root (sudo su -)Зручно, але небезпечно. Один хибний rm — і системі кінець.Використовуйте sudo для окремих команд. Виходьте з root-оболонки відразу.
chmod 777 на все підрядДає повний доступ усім — величезна діра в безпеці.Визначте, якого саме дозволу бракує. Зазвичай 755 або 644 достатньо.

  1. Для чого потрібна змінна $PATH?

    Відповідь Це список директорій, розділених двокрапкою. Коли ви вводите назву команди, оболонка шукає програму в цих папках зліва направо. Якщо програми немає в жодній папці зі списку, ви отримуєте помилку "command not found".
  2. Яка різниця між встановленням змінної з export та без нього?

    Відповідь Без `export` змінна існує тільки в поточній оболонці. З `export` вона передається всім дочірнім процесам (командам або скриптам, які ви запускаєте). Використовуйте `export` для налаштувань, які мають бачити програми (як-от `$KUBECONFIG`).
  3. Ви бачите -rwxr--r-- на файлі. Хто може його запускати?

    Відповідь Тільки **власник** (user). У групи є тільки `r--` (читання), у інших — так само. Жоден з них не має біта `x` (виконання).
  4. Який числовий еквівалент для rwxr-xr-x?

    Відповідь **755**. Власник: r(4)+w(2)+x(1)=7. Група: r(4)+x(1)=5. Інші: r(4)+x(1)=5.
  5. Чому НЕ ВАРТО використовувати chmod 777 для виправлення помилок доступу?

    Відповідь Це дає право на читання, запис та виконання кожному користувачу в системі. Це критичний ризик безпеки. Краще розібратися, якого саме права не вистачає. Для скриптів це зазвичай `755`, для звичайних файлів — `644`, для приватних — `600`.

Практична вправа: Оточення та Дозволи

Розділ «Практична вправа: Оточення та Дозволи»

Сценарій: Ви налаштовуєте робоче середовище на новому сервері. Потрібно налаштувати аліаси, створити структуру проєкту з правильними доступами та підготувати скрипти.

Частина 1: Змінні оточення

Розділ «Частина 1: Змінні оточення»
Terminal window
# 1. Виведіть своє ім'я користувача, домашню папку та оболонку
echo "User: $USER"
echo "Home: $HOME"
echo "Shell: $SHELL"
# 2. Подивіться свій $PATH, по одній папці на рядок (так зручніше)
echo $PATH | tr ':' '\n'
# 3. Встановіть змінну БЕЗ export — перевірте, чи бачить її дочірній процес
PROJECT_NAME="kubedojo-lab"
echo $PROJECT_NAME # Виведе: kubedojo-lab
bash -c 'echo $PROJECT_NAME' # Нічого не виведе (пусто)
# 4. Тепер зробіть export і перевірте знову
export PROJECT_NAME="kubedojo-lab"
bash -c 'echo $PROJECT_NAME' # Тепер виведе: kubedojo-lab

Частина 2: Конфігурація оболонки

Розділ «Частина 2: Конфігурація оболонки»
Terminal window
# 5. Додайте корисні аліаси у свій .bashrc
cat >> ~/.bashrc << 'EOF'
# --- Аліаси для KubeDojo ---
alias ll='ls -la'
alias cls='clear'
alias ..='cd ..'
alias k='kubectl'
EOF
# 6. Перезавантажте конфіг і протестуйте
source ~/.bashrc
ll # Має показати детальний список, включаючи приховані файли
Terminal window
# 7. Створіть структуру папок проєкту
mkdir -p ~/lab-project/{scripts,config,secrets}
# 8. Створіть скрипт деплою
cat > ~/lab-project/scripts/deploy.sh << 'EOF'
#!/bin/bash
echo "Деплоїмо проєкт $PROJECT_NAME..."
echo "Завершено о $(date)"
EOF
# 9. Спробуйте запустити його — побачите помилку
~/lab-project/scripts/deploy.sh
# Очікувано: Permission denied
# 10. Дайте право на виконання тільки власнику
chmod u+x ~/lab-project/scripts/deploy.sh
# 11. Запустіть успішно
~/lab-project/scripts/deploy.sh

Частина 4: Захист файлів

Розділ «Частина 4: Захист файлів»
Terminal window
# 12. Створіть "секретний" файл
echo "DB_PASSWORD=supersecret123" > ~/lab-project/secrets/db.env
# 13. Заблокуйте його — тільки ви можете читати й писати
chmod 600 ~/lab-project/secrets/db.env
# 14. Перевірте
ls -l ~/lab-project/secrets/db.env
# Очікувано: -rw-------
# 15. Закрийте вхід у папку secrets для всіх інших
chmod 700 ~/lab-project/secrets/

Ви успішно виконали вправу, якщо:

  • Ви можете пояснити, що робить $PATH і чому ./script.sh працює, а script.sh — ні.
  • Ваші аліаси збережені в ~/.bashrc і працюють у нових вікнах термінала.
  • Скрипт deploy.sh має право на виконання для власника.
  • Файл db.env та папка secrets/ закриті для всіх, крім вас.
  • Ви не використовували sudo для файлів, якими володієте.

Далі: Модуль 0.3: Путівник по процесах і ресурсах — Дізнайтеся, як знаходити запущені програми, моніторити ресурси системи та зупиняти процеси, що “збунтувалися”.