应检查脚本执行权限、shebang路径、调用方式、文件系统挂载选项及SELinux策略:一、用ls -l确认x权限,chmod添加;二、head查shebang,which验证解释器路径,file查换行符;三、必须用./script.sh调用或修改PATH;四、mount检查noexec选项;五、getenforce和ls -Z排查SELinux限制。

如果您在 Linux 系统中尝试执行一个 shell 脚本,但提示“Permission denied”或“command not found”,则可能是由于脚本文件缺乏可执行权限、路径解析异常或解释器配置错误所致。以下是排查此问题的步骤:
一、检查文件是否具有可执行权限
Linux 文件系统通过权限位控制执行行为,shell 脚本必须具备用户(u)、组(g)或其它(o)中的至少一类的执行权限(x)才能被直接运行。
1、使用 ls -l script.sh 查看脚本当前权限,确认输出中对应位置存在 x 字符。
2、若无执行权限,运行 chmod u+x script.sh 为所有者添加执行权限。
3、如需同时赋予组和其他用户执行权限,可使用 chmod 755 script.sh。
二、验证脚本首行 shebang 是否正确
shell 脚本依赖首行的 shebang(如 #!/bin/bash)告知内核应调用哪个解释器执行;若路径错误、解释器不存在或格式不规范(如含不可见空格或 DOS 换行符),将导致执行失败。
1、使用 head -n1 script.sh 查看第一行内容,确认其为形如 #!/bin/bash 或 #!/usr/bin/env bash 的有效声明。
2、运行 which bash 验证解释器实际路径,并比对 shebang 中路径是否一致。
3、使用 file script.sh 检查文件格式,若输出含 CRLF line terminators,说明存在 Windows 换行符,需用 dos2unix script.sh 修复。
三、确认脚本是否通过绝对路径或相对路径正确调用
Shell 默认不会在当前目录(.)中搜索可执行文件,即使脚本具备 x 权限,直接输入脚本名仍会因 PATH 未包含当前路径而报 “command not found”。
1、若在当前目录执行,必须显式指定路径:运行 ./script.sh 而非 script.sh。
2、若希望省略 ./,可将当前目录加入 PATH:执行 export PATH="$PWD:$PATH"(仅当前会话生效)。
3、检查是否存在同名命令冲突:运行 type script.sh,确认返回的是文件路径而非别名或函数。
四、检查文件系统挂载选项是否禁用执行权限
某些挂载点(如 NFS、FAT32 分区、或以 noexec 选项挂载的 ext4 分区)会全局禁止执行任何文件,此时 chmod 设置的 x 权限无效。
1、运行 mount | grep "$(df . | tail -1 | awk '{print $1}')" 查看当前所在分区的挂载参数。
2、确认输出中不含 noexec 字样;若存在,需重新以 exec 选项挂载,或把脚本移至支持执行的文件系统中。
3、临时验证:将脚本复制到 /tmp(通常为独立 tmpfs 且默认允许 exec),再执行 /tmp/script.sh 测试是否成功。
五、排查 SELinux 或其他强制访问控制策略限制
在启用 SELinux 的系统中,即使传统权限和挂载选项均正常,安全上下文(security context)不匹配也可能阻止脚本执行。
1、运行 getenforce 确认 SELinux 当前状态为 Enforcing 或 Permissive。
2、使用 ls -Z script.sh 查看脚本的安全上下文,正常可执行脚本应为 unconfined_u:object_r:user_home_t:s0 或类似类型。
3、若类型为 user_home_t 但执行仍失败,可临时测试:运行 chcon -t bin_t script.sh 修改类型为可执行类型,再尝试运行。










