Решение проблем

Terminal выдаёт «zsh: permission denied» на Mac - решение

Terminal выдаёт «zsh: permission denied» на Mac - решение

Ошибка «zsh: permission denied» в Terminal - частый сюрприз для тех, кто начинает работать с командной строкой на Mac. Появляется при попытке запустить скрипт, открыть файл или выполнить команду. Причин несколько - разберёмся в каждой.

Что значит эта ошибка

Ошибка permission denied означает, что Unix-права файла не позволяют выполнить запрошенное действие. Это базовая защита macOS (как в Linux): каждый файл имеет атрибуты - «чтение», «запись», «выполнение» - для трёх групп пользователей: owner, group, others.

Если у файла нет флага «выполнение» (execute), вы не можете его запустить.

Способ 1: Самая частая причина - нет флага execute

Скачали скрипт с интернета, пытаетесь запустить:

./install.sh
# zsh: permission denied: ./install.sh

Решение: добавить флаг выполнения.

chmod +x install.sh
./install.sh
# теперь работает

Что делает chmod +x: устанавливает executable-флаг для всех пользователей. Команда chmod u+x - только для owner.

Способ 2: Проверить права файла

Прежде чем менять права, посмотрите текущие:

ls -la script.sh

Вывод:

-rw-r--r--  1 user  staff  1234 Apr 18 10:00 script.sh

Расшифровка:
- - - обычный файл (не директория, не link).
- rw- - owner может читать и писать, но не выполнять.
- r-- - group только читать.
- r-- - others только читать.

Для выполнения нужно:

chmod 755 script.sh
# или
chmod u+x,g+x,o+x script.sh
# или просто
chmod +x script.sh

Числовой формат chmod:
- 4 = read, 2 = write, 1 = execute.
- 755 = 7 (rwx) для owner, 5 (rx) для group, 5 (rx) для others.
- 644 = 6 (rw) для owner, 4 (r) для group, 4 (r) для others - без execute.
- 777 = все права всем (небезопасно, не используйте).

Способ 3: Вы не owner файла

Если файл принадлежит другому пользователю или root, у вас может не быть прав его запускать даже с +x:

ls -la /usr/local/bin/mytool
# -rwxr-xr-x  1 root  wheel  ...  mytool

Здесь owner = root. Если вам нужно его запустить:

sudo /usr/local/bin/mytool

sudo - выполнить как root, требует пароль.

Способ 4: Нет доступа к директории

Иногда проблема не в файле, а в папке, где он лежит:

./script.sh
# zsh: permission denied: ./script.sh

ls -la .
# d---------  ...
# rwx для owner сняты

Проверьте права папки:

ls -la .
ls -lad /path/to/folder

Для входа в папку (cd, ls) нужен execute флаг директории (счёт прав для директорий работает слегка иначе: x = «войти внутрь»).

Исправить:

chmod +x /path/to/folder

Способ 5: Quarantine flag (Gatekeeper)

MacOS помечает файлы, скачанные из интернета, атрибутом com.apple.quarantine. Это не чистый permission denied, но результат похож.

xattr скрипт.sh
# com.apple.quarantine

xattr -d com.apple.quarantine скрипт.sh
# снимаем quarantine

# Или рекурсивно
xattr -dr com.apple.quarantine ~/Downloads/package/

После снятия quarantine файл можно запускать без дополнительных предупреждений.

Способ 6: System Integrity Protection (SIP)

SIP - защита системных файлов macOS. Вы не можете изменить или запустить файлы в некоторых системных локациях даже с sudo.

Проверить статус SIP:

csrutil status
# System Integrity Protection status: enabled.

Если запрещено писать в /System/, /usr/ (кроме /usr/local/), /bin/, /sbin/ - это SIP.

Обходить SIP не рекомендуется. Вместо этого:

  • Устанавливайте ПО в /usr/local/bin/ или /opt/homebrew/bin/ (Apple Silicon).
  • Для home-directory скриптов - ~/bin/ или ~/.local/bin/.

Способ 7: Полный диск защищён FileVault / прав на volume

Если пишете в странное место и видите permission denied:

touch /Volumes/ExternalDisk/file
# Permission denied

На внешнем диске может быть выставлен «read-only» или владельцы не те:

# Проверить
ls -la /Volumes/ExternalDisk/

# Включить «Ignore ownership» в Finder
Finder → выделить диск → Get Info → ☑️ «Ignore ownership on this volume»

Для NTFS-дисков с Windows - Mac не может писать (без Mounty или Paragon).

Способ 8: Homebrew permission denied

Частый случай: Homebrew пытается писать в /usr/local/Cellar, а права не настроены (особенно после обновления macOS).

brew install wget
# Error: /usr/local/Cellar is not writable.

Решение:

# Intel Mac
sudo chown -R $(whoami) /usr/local/Cellar /usr/local/Homebrew /usr/local/etc /usr/local/sbin /usr/local/share /usr/local/var

# Apple Silicon Mac (Homebrew в /opt/homebrew)
sudo chown -R $(whoami) /opt/homebrew

После этого Homebrew будет работать без sudo.

Способ 9: Скрипт внутри защищённой папки

Некоторые папки (Documents, Desktop, Downloads) требуют явного разрешения macOS для доступа программам.

./script.sh в ~/Documents
# может выдать permission denied даже с chmod +x

Решение: разрешите Terminal (или iTerm2) доступ к папке:

System Settings → Privacy & Security → Files and Folders → Terminal → галочки на Documents/Desktop/Downloads.

Или дайте Terminal Full Disk Access:

System Settings → Privacy & Security → Full Disk Access → + → добавить Terminal или iTerm2.

Способ 10: Изменить владельца файла

Если файл принадлежит кому-то не тому (например, root после sudo-копирования):

ls -la file
# -rwxr-xr-x  1 root  wheel  ...  file

sudo chown $(whoami) file
# теперь вы - владелец

sudo chown -R $(whoami):staff /path/to/folder
# рекурсивно для папки

Распространённые сценарии

«./configure: permission denied»

Типичная ошибка при компиляции из исходников. Решение: chmod +x configure.

«zsh: permission denied: brew»

Проблема с PATH или правами. Проверьте:

which brew
# должен показать /opt/homebrew/bin/brew (Apple Silicon) или /usr/local/bin/brew (Intel)

ls -la /opt/homebrew/bin/brew
# -rwxr-xr-x - должен быть x

Если брю не там - переустановите Homebrew.

«Operation not permitted»

Это НЕ permission denied, это другая ошибка - macOS Security & Privacy блокирует действие. Решается через разрешения в System Settings (Full Disk Access, Files & Folders).

Сломана домашняя папка

Если cd ~ или ls ~ выдают permission denied - домашняя папка повреждена (редко, но случается после миграции):

sudo chown -R $(whoami):staff ~/

Осторожно: эта команда даст вам права на ВСЮ домашнюю папку. Это нормально если вы её единственный пользователь, опасно - если там есть чужие файлы.

Безопасность

НЕ делайте:

  • chmod 777 где попало - это даёт права всем пользователям.
  • sudo chown -R на всё подряд - можно сломать систему.
  • Отключать SIP без понимания последствий.
  • Запускать неизвестные скрипты с sudo.

Правильные практики:

  • Минимальные необходимые права: 644 для файлов, 755 для скриптов/папок, 700 для приватных данных.
  • Проверяйте что делает скрипт перед запуском - cat script.sh или откройте в VS Code.
  • Используйте sudo только когда нужно, не «на всякий случай».

Итог

Алгоритм диагностики «permission denied»:

  1. ls -la file - посмотреть текущие права.
  2. Нет x? - chmod +x file.
  3. Файл не ваш? - sudo chown $(whoami) file или запуск через sudo.
  4. Папка недоступна? - chmod +x /path/to/folder или права на родителя.
  5. Скачали с интернета? - xattr -d com.apple.quarantine file.
  6. Homebrew ошибка? - sudo chown -R $(whoami) /opt/homebrew.
  7. Терминал не может читать папку? - Privacy & Security → Files and Folders → Terminal.

В 80% случаев помогает пункт 2 (забыли chmod +x). Остальные сценарии встречаются реже, но диагностируются похоже: ls -la, проверка владельца, проверка папки, разрешения macOS.

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

Пока нет комментариев.