终端脚本执行失败主因是磁盘访问权限不足和SIP限制,需在“隐私与安全性”中授予终端及iTerm2等应用“完全磁盘访问权限”,并将脚本移至用户目录或/usr/local/bin,同时清除quarantine属性。
macos 终端脚本执行失败,如果错误提示包含 operation not permitted、getcwd: cannot access parent directories 或脚本在快捷指令/spotlight 中能运行、但单独执行就卡住,大概率不是网络权限问题,而是系统级访问控制在起作用——真正受限的是磁盘访问权限和sip 保护机制,而非传统意义上的“网络权限”。苹果系统中并不存在独立的“网络权限”开关来限制终端脚本联网;脚本能否发请求(如 curl、wget),取决于它是否能正常读写路径、调用系统接口,而这由隐私授权与内核保护共同决定。
检查并授予终端“完全磁盘访问权限”
这是最常见也最直接的修复点。macOS 10.15(Catalina)起,默认禁止终端访问用户目录以外的多数位置,即使你有文件权限,也会被拦截。
- 打开「系统设置」→「隐私与安全性」→「完全磁盘访问权限」
- 点击右下角锁图标,输入管理员密码解锁
- 点击「+」号,将「终端」应用添加进列表(若已存在,先关闭再重新勾选)
- 重启终端,再运行脚本测试
⚠️ 注意:如果使用 iTerm2、VS Code 内置终端或 zsh/fish 等 shell,也要一并添加对应应用或 shell 进程(如 iTerm2.app、Code.app、zsh)。
确认脚本所在路径未被 SIP 限制
System Integrity Protection(SIP)会硬性阻止对某些系统路径的访问,比如 /usr/bin、/System、/bin。如果你的脚本试图 cd 进入、读取或修改这些目录下的内容,就会触发 Operation not permitted,且 sudo 也无法绕过。
- 运行
csrutil status(需进入恢复模式才能执行,日常无需改动)可查看 SIP 状态,但不建议关闭 SIP - 更安全的做法是:把脚本和依赖文件移到用户可管区域,例如
~/Scripts、~/Projects或/usr/local/bin(后者需确保该路径已加入 PATH 且你有写权限) - 避免让脚本尝试操作
/etc、/usr/sbin等受保护路径;如必须修改配置,改用sudo配合tee或sh -c安全重定向
排查辅助功能与开发者工具授权缺失
部分脚本依赖自动化能力(如 AppleScript 调用、UI 元素操作、窗口管理),这类行为需要额外权限,否则看似执行了,实则静默失败。
- 前往「系统设置」→「隐私与安全性」→「辅助功能」:添加终端、iTerm2、脚本启动器等应用
- 同页面下滑至「开发者工具」:勾选你使用的终端、shell(如 zsh)、以及 VS Code / Sublime Text 等编辑器(它们可能调用命令行工具)
- 若脚本涉及键盘监听、屏幕录制(如截图、录屏逻辑),还需分别开启「输入监视」和「屏幕录制」权限
验证脚本自身权限与隔离属性
从网页下载的 .sh 文件可能被 macOS 标记为“来自互联网”,带 quarantine 属性,导致即使 chmod +x 了,执行时仍被拦截。
- 给脚本加执行权限:
chmod +x ~/Scripts/myscript.sh - 移除隔离属性:
xattr -d com.apple.quarantine ~/Scripts/myscript.sh(无需 sudo,当前用户即可) - 检查是否生效:
xattr -l ~/Scripts/myscript.sh,输出中不应再出现com.apple.quarantine
如果脚本是通过 curl 下载后立即执行(如 curl xxx.sh | bash),建议先保存再运行,避免流式执行触发更多沙盒限制。


















