Файлови права в Linux: chmod, chown, chgrp и практични примери
Подробно ръководство за файловите права в Linux – как работят потребителите, групите, chmod, chown, chgrp, числовите стойности и често срещаните проблеми с достъпа.
Файловите права са една от основните причини Linux да бъде стабилна и сигурна операционна система. Те определят кой има право да чете, променя или изпълнява даден файл, както и кой може да разглежда или променя съдържанието на директория.
В началото темата изглежда объркваща, особено когато получите съобщение като Permission denied. След като разберете логиката зад потребители, групи, собственост и разрешения, управлението на достъпа до файловете става сравнително лесно. В тази статия ще разгледаме основните команди и ще покажем практични примери за често срещани ситуации.
Какво представляват файловите права в Linux?
Всеки файл и всяка директория в Linux имат:
- собственик (owner)
- група (group)
- набор от права за собственика
- набор от права за членовете на групата
- набор от права за всички останали потребители
Трите основни права са:
r– read, или право за четенеw– write, или право за запис и промянаx– execute, или право за изпълнение
Можете да видите правата на файловете в текущата директория с командата:
ls -l
Примерен резултат:
-rw-r--r-- 1 ivan developers 2450 Sep 28 14:00 article.md
drwxr-xr-x 2 ivan developers 4096 Sep 28 14:05 images
-rwxr-xr-x 1 ivan developers 320 Sep 28 14:10 backup.sh
Първата част на всеки ред съдържа информация за типа на обекта и неговите права:
-rw-r--r--
Тя може да бъде разделена така:
- rw- r-- r--
│ │ │ └─ права за останалите потребители
│ │ └───── права за групата
│ └───────── права за собственика
└─────────── тип на обекта
В този пример:
- първият символ
-означава обикновен файл rw-означава, че собственикът може да чете и редактира файлаr--означава, че членовете на групата могат само да го четат- последното
r--означава, че всички останали потребители могат само да го четат
Ако първият символ е d, това означава директория:
drwxr-xr-x
Други възможни символи са:
l– символна връзка (symbolic link)c– символно устройствоb– блоково устройствоs– socketp– named pipe
Разлика между права за файл и директория
Една от най-честите грешки е да се приемат правата за файлове и директории по един и същ начин. Символите са същите, но значението им има важни различия.
При обикновен файл:
rпозволява съдържанието му да бъде прочетеноwпозволява съдържанието му да бъде промененоxпозволява файлът да бъде стартиран като програма или скрипт
Например shell скриптът backup.sh трябва да има право за изпълнение, ако искате да го стартирате директно:
./backup.sh
При директория:
rпозволява да видите списъка с файлове в неяwпозволява създаване, изтриване и преименуване на файлове в неяxпозволява да влезете в директорията и да достъпвате файловете в нея
Това означава, че директория без x може да създаде объркващи проблеми. Може да знаете, че даден файл съществува, но да не можете да го отворите, защото нямате право да „преминете“ през директорията, в която се намира.
Проверете правата на директория с:
ls -ld /path/to/directory
Използването на -d е важно, защото без него ls ще покаже съдържанието на директорията, а не нейните собствени права.
Какво означават chmod, chown и chgrp?
Трите най-важни команди при управление на файлови права са:
chmod– променя правата за достъпchown– променя собственика на файл или директорияchgrp– променя групата на файл или директория
Преди да използвате тези команди, винаги е добра идея да проверите текущото състояние:
ls -l filename
За директории използвайте:
ls -ld directory_name
Ако работите със системни файлове, файлове на уеб сървър или съдържание, собственост на друг потребител, най-вероятно ще са ви нужни администраторски права чрез sudo.
Промяна на права с chmod
Командата chmod идва от „change mode“ и служи за промяна на файловите права. Тя може да се използва по два основни начина:
- със символен запис
- с числов, или октален запис
Може да ви е интересно още: Командата cp в Linux
Символен запис
Символният синтаксис е удобен, когато искате да добавите или премахнете конкретно право, без да променяте останалите.
Основните обозначения са:
u– user, собственикътg– group, групатаo– others, останалите потребителиa– all, всички
Операторите са:
+– добавяне на право-– премахване на право=– задаване на точен набор от права
Например, за да направите shell скрипт изпълним, най-често се използва:
chmod +x backup.sh
Командата добавя право за изпълнение (x) към файла backup.sh. След това скриптът може да бъде стартиран директно:
./backup.sh
По-конкретният вариант:
chmod u+x backup.sh
дава право за изпълнение само на собственика на файла. Това е по-подходящо, когато не искате членовете на групата или останалите потребители да могат да стартират скрипта.
Числов запис
Числовият запис е много разпространен в Linux администрацията, при работа със сървъри, скриптове и deployment процеси. При него всяко право има числова стойност:
| Право | Стойност |
|---|---|
r |
4 |
w |
2 |
x |
1 |
Стойностите се събират за всяка от трите категории: собственик, група и останали.
Например:
7= 4 + 2 + 1 =rwx6= 4 + 2 =rw-5= 4 + 1 =r-x4=r--0=---
Командата:
chmod 644 article.md
задава следните права:
rw-r--r--
Тоест:
- собственикът може да чете и редактира
- групата може да чете
- останалите могат да четат
Това е често използвана настройка за HTML, CSS, JavaScript, Markdown, изображения и други публично четими файлове на статичен сайт.
Следната команда:
chmod 755 backup.sh
създава права:
rwxr-xr-x
Тук собственикът може да чете, променя и изпълнява файла, а всички останали могат да го четат и изпълняват.
Често използвани стойности на chmod
Следните настройки са полезни в ежедневната работа:
| Команда | Права | Типична употреба |
|---|---|---|
chmod 644 file.txt |
rw-r--r-- |
Текстови файлове, HTML, CSS, JavaScript, Markdown |
chmod 600 secret.txt |
rw------- |
Частни ключове, конфигурации с пароли, чувствителни файлове |
chmod 755 script.sh |
rwxr-xr-x |
Скриптове и изпълними файлове |
chmod 755 directory |
rwxr-xr-x |
Публично достъпни директории |
chmod 700 private-dir |
rwx------ |
Лични директории, достъпни само за собственика |
chmod 775 shared-dir |
rwxrwxr-x |
Директории за съвместна работа в група |
Избягвайте автоматичното използване на:
chmod 777 filename
Тази команда дава пълни права на всички потребители:
rwxrwxrwx
Понякога тя временно „решава“ проблем с достъпа, но почти винаги е лошо решение от гледна точка на сигурността. Всеки локален потребител или процес с достъп до системата може да редактира, изтрие или изпълни файла според неговия тип.
Вместо 777, установете кой трябва да има достъп и настройте правилно собствеността, групата и минимално необходимите права.
Смяна на собственик с chown
Всеки файл в Linux има собственик. Обикновено това е потребителят, който го е създал. Можете да видите собственика и групата във втория и третия стълб на резултата от ls -l:
-rw-r--r-- 1 ivan developers 2450 Sep 28 14:00 article.md
В този случай:
ivanе собственикътdevelopersе групата
За да смените собственика, използвайте:
sudo chown newuser filename
Пример:
sudo chown nginx index.html
Това прави потребителя nginx собственик на файла index.html.
Можете едновременно да зададете собственик и група:
sudo chown user:group filename
Например:
sudo chown ivan:developers project-file.md
При работа с уеб проекти често се налага да смените собствеността на цяла директория и всичко в нея:
sudo chown -R ivan:developers /var/www/my-site
Опцията -R означава рекурсивно действие. Тя прилага промяната към директорията, всички файлове и всички поддиректории в нея.
Използвайте -R внимателно. Грешно зададен път, особено в комбинация със sudo, може да промени собствеността на голям брой важни системни файлове.
Смяна на група с chgrp
Ако искате да промените само групата, използвайте chgrp:
sudo chgrp developers project-file.md
За рекурсивна промяна на групата в цяла директория:
sudo chgrp -R developers /var/www/my-site
Групите са особено полезни, когато по един проект работят няколко потребители. Вместо да давате достъп на всеки поотделно, можете да добавите потребителите в обща група и да зададете подходящи права за нея.
Например, ако директорията има следните права:
drwxrwxr-x
собственикът и групата могат да четат, записват и влизат в нея. Останалите могат само да я разглеждат и да достъпват публично четими файлове.
Можете да проверите към кои групи принадлежи текущият потребител с:
groups
За конкретен потребител:
groups username
Практически примери при работа със сайтове
При статичен сайт често искате вие да можете да редактирате файловете, а уеб сървърът да може да ги чете. Един разумен вариант за файловете може да бъде:
find /var/www/my-site -type f -exec chmod 644 {} \;
За директориите:
find /var/www/my-site -type d -exec chmod 755 {} \;
Това задава:
644за обикновените файлове755за директориите
Причината да използвате различни стойности е, че директориите обикновено се нуждаят от x, за да могат потребителите и услугите да влизат в тях. Обикновените HTML, CSS и Markdown файлове не трябва да бъдат изпълними.
Ако сайтът се управлява от конкретен потребител и група, можете първо да зададете правилната собственост:
sudo chown -R ivan:www-data /var/www/my-site
След това приложете ограничени права според реалната нужда. Не използвайте една и съща команда за всеки сървър без проверка, защото потребителят на уеб услугата може да бъде www-data, nginx, apache или друг, според дистрибуцията и конфигурацията.
Как да диагностицирате грешка Permission denied
Когато получите съобщение Permission denied, не бързайте веднага с chmod 777. Проверете проблема последователно.
Първо вижте правата и собствеността на файла:
ls -l filename
След това проверете директорията, в която се намира:
ls -ld /path/to/directory
Ако файлът е във вложени директории, проверете целия път:
namei -l /path/to/file
Командата namei -l е много полезна, защото показва правата за всяка директория по пътя до файла. Така може да откриете, че самият файл има правилни права, но някоя родителска директория не позволява достъп.
Проверете и с кой потребител сте влезли:
whoami
Ако изпълнявате команда през уеб приложение, cron задача, Docker контейнер или systemd услуга, реалният потребител може да е различен от този във вашия терминал. В такъв случай трябва да проверите кой потребител изпълнява конкретния процес.
Полезни правила за безопасност
Файловите права не са просто техническа настройка. Те са важна част от сигурността на системата и на вашите проекти.
Следвайте няколко добри практики:
- Давайте само необходимите права, а не максимални права „за всеки случай“
- Използвайте
600за файлове с пароли, SSH ключове и чувствителни конфигурации - Използвайте
644за повечето публично четими файлове - Използвайте
755за директории и скриптове, които трябва да се изпълняват - Проверявайте собствеността с
ls -l, преди да правите промени - Бъдете много внимателни с
sudo,chmod -Rиchown -R - Не използвайте
777, освен ако не разбирате напълно последствията и ситуацията е временно контролирана - Правете резервно копие на важни конфигурационни файлове преди промени
Например, преди да редактирате права на конфигурационен файл, можете да направите копие:
cp config.php config.php.backup
Така ще имате лесен вариант за възстановяване, ако сгрешите настройките или съдържанието на файла.
Заключение
Файловите права в Linux изглеждат сложни само докато не свикнете с основната им логика: собственик, група, останали потребители и трите действия четене, запис и изпълнение.
Най-важните команди са ls -l за проверка, chmod за промяна на права, chown за смяна на собственик и chgrp за смяна на група. В повечето случаи правилното решение не е да дадете пълни права на всички, а да определите кой точно трябва да има достъп и какъв достъп реално му е необходим.
С практиката ще започнете бързо да разпознавате типичните стойности като 644, 755 и 600. Това ще ви помогне да работите по-уверено със скриптове, сайтове, сървъри, архиви и лични файлове в Linux.