noexec选项禁止在挂载点执行二进制程序或脚本,适用于/tmp、web上传目录等场景,需配合nosuid/nodev使用;可通过mount命令临时设置或在/etc/fstab中永久配置,但对解释器调用的脚本无效,且需注意服务兼容性。

Linux系统中,磁盘分区挂载时通过mount命令或/etc/fstab配置的选项,直接影响文件系统的安全性与行为。其中noexec是一个关键的安全属性,用于禁止在该挂载点上执行任何二进制程序或脚本。
noexec的作用与适用场景
noexec挂载选项会阻止内核加载并运行位于该文件系统上的可执行文件(如ELF二进制、shell脚本等),即使文件本身具有x权限也不会生效。它不改变文件权限位,仅在VFS层拦截执行请求。
- 常用于临时目录(如
/tmp、/var/tmp)防止恶意代码执行 - 适用于用户上传内容的Web目录(如
/var/www/uploads)避免PHP/Shell注入落地执行 - 配合
nosuid和nodev使用,构成基础隔离策略
如何启用noexec挂载
可通过即时挂载或永久配置两种方式设置:
- 临时挂载:
sudo mount -o remount,noexec /tmp - 永久生效:编辑
/etc/fstab,在对应分区行的挂载选项列添加noexec,例如:/dev/sdb1 /mnt/data ext4 defaults,noexec,nosuid,nodev 0 2 - 注意:若原已有
defaults,它已包含exec,需显式覆盖,即defaults,noexec才有效
常见注意事项与限制
noexec并非万能,实际使用中需注意以下几点:
- 对解释型语言(如Python、Perl脚本)是否生效,取决于调用方式:直接运行
./script.py会被拦截;但通过python script.py仍可执行——因解释器本身在/usr/bin/python等允许执行的路径下 - 某些服务(如Docker、systemd-tmpfiles)可能依赖
/tmp执行临时程序,启用noexec前应验证兼容性 - 若需临时绕过(如调试),可用
mount -o remount,exec /path恢复,但不建议长期开启 - SELinux或AppArmor等MAC机制可提供更细粒度控制,
noexec是轻量级补充而非替代方案
验证noexec是否生效
挂载后可通过简单测试确认:
- 在目标挂载点创建测试脚本:
echo '#!/bin/sh\necho "test"' > /tmp/test.sh && chmod +x /tmp/test.sh - 尝试执行:
/tmp/test.sh→ 应报错bash: /tmp/test.sh: Permission denied - 检查当前挂载参数:
findmnt -o SOURCE,TARGET,FSTYPE,OPTIONS /tmp,确认输出中含noexec










