应移除脚本文件执行权限并启用noexec挂载:用find批量执行chmod a-x清除.sh/.py等文件的x位;对目录所在分区挂载时添加noexec选项以阻止直接执行;配合umask或默认ACL确保新文件无执行位。

要在Linux系统中禁止特定目录下的脚本执行,核心是移除该目录内文件的“执行权限”(x),并确保用户无法绕过限制(如通过解释器直接调用)。单纯设置目录权限不能阻止脚本运行,关键在于控制文件本身的可执行位,同时配合挂载选项增强防护。
1. 移除目录中所有脚本文件的执行权限
执行权限是脚本能否被直接运行的前提。即使用户有读写权,只要没有 x 位,./script.sh 就会报错 Permission denied。
- 批量清除当前目录下所有
.sh、.py、.pl等常见脚本文件的执行位:find /path/to/dir -type f \( -name "*.sh" -o -name "*.py" -o -name "*.pl" -o -name "*.rb" \) -exec chmod a-x {} \; - 若需更严格,可对所有普通文件统一去执行位(谨慎使用):
find /path/to/dir -type f -exec chmod a-x {} \; - 确认效果:用
ls -l script.py查看,输出中不应出现x(如-rw-r--r--是安全的,-rwxr-xr-x则仍可执行)
2. 使用 noexec 挂载选项(推荐用于敏感目录)
在挂载文件系统时添加 noexec 选项,可从根本上禁止该分区上任何文件被当作程序执行——无论文件权限如何。这对存放上传文件或用户提交内容的目录特别有效。
- 临时挂载示例(假设目录挂载在
/var/www/uploads):mount -o remount,noexec /var/www/uploads - 永久生效:编辑
/etc/fstab,在对应挂载行的选项字段加入noexec(如defaults,noexec),然后运行mount -o remount /var/www/uploads - 注意:
noexec不影响脚本被解释器显式调用(如python3 script.py),但能阻止./script.py这类直接执行,且对二进制程序同样生效
3. 配合 umask 或默认 ACL 控制新文件权限
防止新上传或新建的脚本自动获得执行权限,需规范创建时的默认权限。
- 在目标目录所在 shell 环境中设置
umask 022(新建文件默认权限为644,无 x);若需更严,可用umask 027(组和其他人无写、无执行) - 对目录设置默认 ACL,强制子文件不带执行位:
setfacl -d -m u::rw-,g::r--,o::r-- /path/to/dir
这样新创建的文件默认权限为644,不会继承 x 位
4. 补充防护:禁用解释器访问(按需)
如果连 python script.py 这类调用也要限制,需控制用户对解释器的访问权限,但这属于更高层级的管控,通常不推荐粗暴禁用系统解释器。
- 更合理的方式是使用容器、chroot 或 SELinux/AppArmor 策略限制进程能力
- 简单场景下,可将用户 shell 设为
/bin/rbash(受限 bash),并清理其$PATH中的解释器路径 - 注意:此操作影响广泛,务必提前测试,避免锁死管理通道
实际部署时,建议以 移除文件执行位 + noexec 挂载 为主力组合,再辅以默认权限控制。这样既覆盖直接执行,又防御大部分绕过手段,且不影响正常读写和解释器显式调用(如日志分析、运维脚本等仍可由管理员运行)。

















