Shell 脚本执行报错 permission denied 怎么解决?

文章导读
遇到 Shell 脚本执行报 permission denied,最常见的原因是脚本文件缺少执行权限位,或者当前用户没有权限读取该文件。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
A A

遇到 Shell 脚本执行报 permission denied,最常见的原因是脚本文件缺少执行权限位,或者当前用户没有权限读取该文件。

先说结论:优先检查文件权限位,其次尝试用 bash 显式调用脚本。

  • 先确认:使用 ls -l 查看文件权限位是否包含 x
  • 先处理:通过 chmod 添加执行权或用解释器直接运行
  • 再验证:重新执行脚本并检查退出码是否为 0

命令速用版

如果你需要立刻让脚本跑起来,可以尝试以下两条命令中的一条:

chmod +x ./script.sh && ./script.sh

或者不修改权限,直接调用解释器:

bash ./script.sh

注意:第二种方法不需要执行权限,但要求脚本内容符合 bash 语法。

为什么会这样

Linux 系统对文件权限有严格控制,执行脚本本质上是请求内核加载并运行该文件。报错通常涉及三个层面:

1. 权限位缺失:文件没有 x(execute)标志,普通用户无法直接执行。

2. 解释器问题:脚本第一行 shebang 指定的解释器路径不存在,或文件格式不对。

Shell 脚本执行报错 permission denied 怎么解决?

3. 挂载选项:文件系统被挂载为 noexec,禁止任何二进制或脚本执行。

分步处理

按照以下顺序排查,每一步确认后再进行下一步:

1. 检查文件权限

运行 ls -l 脚本名,查看输出结果。如果权限位类似 -rw-r`--r--`,说明缺少执行权。

解决方法:chmod +x 脚本名

2. 检查解释器路径

运行 head -n 1 脚本名,确认第一行是否为 #!/bin/bash 或 #!/usr/bin/env bash。

Shell 脚本执行报错 permission denied 怎么解决?

如果路径错误,修改第一行或直接用 bash 运行。

3. 检查挂载选项

如果权限正确仍报错,运行 findmnt -no OPTIONS . 查看当前目录所在分区的挂载选项。

如果输出中包含 noexec,说明该分区禁止执行。建议将脚本移到用户家目录或其他允许执行的分区。

4. 检查文件换行符

如果报错提示 bad interpreter: No such file or directory 但路径存在,可能是 Windows 换行符导致。

修复命令:sed -i 's/\r$//' 脚本名 或 dos2unix 脚本名

Shell 脚本执行报错 permission denied 怎么解决?

怎么验证是否生效

执行脚本后,立即运行 echo $? 检查退出码。

如果返回 0,表示脚本成功执行完毕;如果返回 126 或 127,通常代表权限问题或命令未找到。

同时观察脚本预期的输出是否正常打印,没有报错信息。

常见坑

1. Windows 换行符:脚本在 Windows 编辑后上传,可能包含 CRLF 换行符,导致解释器识别失败。

2. SELinux 限制:在 CentOS 或 RHEL 系统上,即使权限正确,SELinux 上下文错误也会拦截执行。

注意:仅在测试环境临时执行 setenforce 0,排查后请立即恢复 (setenforce 1),生产环境建议调整文件上下文 (chcon) 而非关闭策略。

3. 目录权限:父目录如果没有 x 权限,用户也无法进入目录执行其中的脚本。