关键在于清除脚本文件自身的执行位(x权限),而非锁定目录;需用find批量执行chmod a-x清除.sh/.py等文件的x位,配合noexec挂载阻止直接执行,并通过umask或默认ACL确保新文件无x位。

直接禁止脚本执行,关键不是锁住目录,而是清除文件自身的执行位(x权限)。Linux判断“能否运行一个文件”,只看它有没有x权限,跟目录读写权限无关。哪怕目录是777,只要脚本本身没x位,./script.sh就会报 Permission denied。
批量清除已有脚本的执行权限
用 find 扫描目标目录下常见脚本后缀,统一去掉所有人(a)的执行权限:
find /var/www/uploads -type f \( -name "*.sh" -o -name "*.py" -o -name "*.pl" -o -name "*.rb" \) -exec chmod a-x {} \;- 执行后用
ls -l script.py确认输出中没有x,例如-rw-r--r--是安全的;-rwxr-xr-x则仍可执行,需再处理 - 若场景极敏感(如用户上传区),可对所有普通文件去x:
find /path -type f -exec chmod a-x {} \;,但要留意是否影响其他非脚本类可执行配置(如某些二进制工具)
挂载时启用 noexec 防绕过
仅改权限不能防“解释器显式调用”(如 python3 evil.py),但 noexec 能彻底阻止 ./evil.py 这类直接执行,且对所有文件类型生效:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 临时生效:
mount -o remount,noexec /var/www/uploads - 永久生效:编辑
/etc/fstab,在对应挂载行的选项字段加入noexec(如defaults,noexec),再运行mount -o remount /var/www/uploads - 注意:
noexec不影响通过sh script.sh或python3 script.py方式调用——这类防护需靠更上层策略(如限制解释器访问或使用容器隔离)
控制新文件默认不带执行位
防止上传或新建的脚本一落地就有x权限,得从创建源头约束:
- 设置 umask:在服务启动环境或用户 shell 中设
umask 022(新建文件默认 644,无x);更严可用umask 027 - 设默认 ACL:
setfacl -d -m u::rw-,g::r--,o::r-- /path/to/dir,这样新文件自动继承 644 权限,不会意外带上 x - 避免依赖系统默认行为——很多上传服务或编辑器会保留原文件权限,必须主动干预
补充:别忽略脚本自身权限设置
如果是你写的运维脚本,执行权限本身就要严格控制:
- 禁止用
chmod 755;应设为750,确保只有属主+指定组可执行 - 组成员必须精简(如新建
deployers组,只加必要账号),避免任意本地用户都能触发 - 验证方式:用非属主/非组用户测试
sudo -u nobody ./deploy.sh,应明确报 Permission denied










