Что означает ошибка код
Ошибка chmod: changing permissions of '<файл>': Operation not permitted (код EPERM) возникает, когда команда chmod не может изменить атрибуты доступа (права) файла или каталога. В Linux это системная ошибка, означающая, что операция запрещена текущим пользователем или файловой системой.
Полный текст ошибки обычно выглядит так:
chmod: changing permissions of 'example.txt': Operation not permitted
Ошибка блокирует выполнение команды chmod и не позволяет задать новые права (например, 755, 644 или специальные биты вроде setuid).
Причины возникновения
- Недостаточно прав — вы не являетесь владельцем файла и не суперпользователем (root). Только владелец файла или root могут менять его права.
- Файловая система с ограничениями — файл расположен на разделе, смонтированном с опциями
noexec(запрет выполнения),nosuid(запрет setuid/setgid) илиro(только чтение). Типично для USB-накопителей, сетевых (NFS) или защищённых разделов. - Атрибут immutable или append-only — файл защищён флагами
chattr +i(неизменяемый) илиchattr +a(дозапись). Эти флаги блокируют любые изменения, включая права, даже для root. - Некорректное использование setuid/setgid — попытка установить бит
s(setuid/setgid) на:- неисполняемый файл (отсутствует
xдля владельца/группы); - каталог (setuid/setgid на каталогах игнорируется или запрещён).
- неисполняемый файл (отсутствует
- Попытка изменить права на символическую ссылку — если вы не root,
chmodпо умолчанию пытается изменить права на целевом файле ссылки, а не на самой ссылке. Если целевой файл вам не принадлежит, возникнет EPERM.
Способ 1: Использование sudo (если вы не владелец)
Если файл принадлежит другому пользователю (например, root), используйте sudo для выполнения команды от имени суперпользователя.
- Проверьте владельца файла:
ls -l /путь/к/файлу
Пример вывода:-rw-r--r-- 1 root root 1024 Feb 17 10:00 example.txt
Здесь владелец —root. - Выполните
chmodсsudo:sudo chmod 644 /путь/к/файлу
или, для установки setuid (если нужно):sudo chmod u+s /путь/к/исполняемому_файлу
⚠️ Важно: Используйте
sudoтолько для доверенных файлов. Изменение прав на системные файлы может нарушить работу ОС.
Способ 2: Смена владельца файла (если у вас есть права sudo)
Если вы администратор и хотите, чтобы пользователь мог менять права самостоятельно, смените владельца файла.
- Смените владельца на нужного пользователя (например,
alex):sudo chown alex /путь/к/файлу
Можно одновременно сменить группу:sudo chown alex:developers /путь/к/файлу - Теперь пользователь
alexможет изменять права безsudo:chmod 755 /путь/к/файлу
Способ 3: Проверка и изменение параметров монтирования
Если файл находится на внешнем носителе (USB, сетевой диск) или отдельном разделе, проверьте, как смонтирована файловая система.
- Найдите точку монтирования файла:
findmnt /путь/к/файлу
Пример вывода:TARGET SOURCE FSTYPE OPTIONS /mnt/usb /dev/sdb1 vfat rw,noexec,nosuid,nodev,relatime,uid=1000,gid=1000,... - Если в колонке
OPTIONSестьnoexec,nosuidилиro(только чтение), нужно перемонтировать раздел:sudo mount -o remount,rw,exec /dev/sdb1 /mnt/usb
Для постоянного решения отредактируйте/etc/fstabи удалитеnoexec/nosuidиз опций для соответствующего раздела.
Способ 4: Снятие атрибутов immutable/append-only
Если файл защищён флагами chattr, снимите их перед изменением прав.
- Проверьте атрибуты:
lsattr /путь/к/файлу
Пример вывода:----i--------e-- /путь/к/файлу
Букваiозначаетimmutable. - Снимите атрибут (требует
sudo):sudo chattr -i /путь/к/файлу
Дляappend-only(a):sudo chattr -a /путь/к/файлу - Теперь измените права:
sudo chmod 644 /путь/к/файлу
💡 Совет: Флаги
chattrчасто используются для защиты критических системных файлов (например,/etc/passwd,/etc/shadow). Будьте осторожны при их снятии.
Способ 5: Проверка setuid/setgid и исполняемости
Если ошибка возникает при установке специальных битов (s или S), проверьте исполняемость файла.
- Убедитесь, что файл исполняем (имеет
xдля владельца):ls -l /путь/к/файлу
Пример правильного вывода для setuid:-rwsr-xr-x 1 root root 12345 Feb 17 10:00 program
Букваsв позиции владельца (вместоx) означает setuid. - Если
xотсутствует, добавьте его:sudo chmod u+x /путь/к/файлу
Затем установите setuid:sudo chmod u+s /путь/к/файлу - Для setgid (бит
sв группе) аналогично:sudo chmod g+x /путь/к/файлу sudo chmod g+s /путь/к/файлу
Профилактика
- Избегайте изменения прав на системные файлы без явной необходимости. Используйте
sudoосознанно. - При работе с внешними носителями монтируйте их с опциями
rw,exec(если нужно выполнять файлы) и безnosuid, если не требуется setuid. - Не устанавливайте атрибут
immutable(chattr +i) на файлы, которые могут потребовать изменения прав в будущем. - Проверяйте исполняемость перед установкой setuid/setgid. Запомните: setuid/setgid требуют, чтобы файл был исполняемым для соответствующей категории (владелец/группа).
- Регулярно проверяйте владельца файлов, особенно в каталогах, где работают несколько пользователей. Используйте
ls -lдля аудита.