Linux shell 脚本执行权限异常的排查

2次阅读

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

Linux shell 脚本执行权限异常的排查

如果您在 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 当前状态为 EnforcingPermissive

2、使用 ls -Z script.sh 查看脚本的安全上下文,正常可执行脚本应为 unconfined_u:object_r:user_home_t:s0 或类似类型。

3、若类型为 user_home_t 但执行仍失败,可临时测试:运行 chcon -t bin_t script.sh 修改类型为可执行类型,再尝试运行。

text=ZqhQzanResources