最稳妥方式是chmod a-x script.sh:仅清除文件自身执行位,不改动读写权限,且语义明确;Linux运行脚本只取决于文件x位,与目录权限无关。

直接用 chmod -x script.sh 就能取消执行权限,但要注意:Linux 判断“能不能运行”,只看文件自身有没有 x 位,跟目录权限无关;哪怕目录是 777,只要脚本没 x,./script.sh 就会报 Permission denied。
怎么安全地去掉单个脚本的执行权限
最常用、最稳妥的方式就是用 chmod 移除 x 位:
-
chmod -x script.sh—— 默认作用于所有用户(等价于a-x),够用且不易出错 -
chmod a-x script.sh—— 明确指定所有人,语义更清晰 -
chmod ugo-x script.sh—— 效果一样,但多打几个字母,没必要
别用 chmod 644 script.sh 这类数字写法——它会同时改读写权限,可能误删原本需要的 r 或 w;也别漏掉后缀,chmod -x script 如果文件没扩展名,容易误操作其他同名文件。
批量清理目录下所有脚本的执行权限
上传目录或用户可写区里常混着一堆 .sh、.py 文件,手动一个一个处理不现实:
- 只清常见脚本后缀:
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输出应类似-rw-r--r--,不能有x - 慎用全文件清
x:find /path -type f -exec chmod a-x {} \;会把二进制工具、配置文件也一并去执行位,可能破坏服务
为什么光改权限还不够?noexec 挂载才是关键防线
chmod -x 只防 ./evil.sh 这种直接执行,拦不住 bash evil.sh 或 python3 backdoor.py —— 这些靠解释器显式调用,不检查文件 x 位:
- 临时启用:
mount -o remount,noexec /var/www/uploads - 永久生效:编辑
/etc/fstab,在对应挂载行选项加noexec(如defaults,noexec),再mount -o remount /var/www/uploads -
noexec对所有文件类型生效,但不影响解释器调用——这点必须心里有数,不能以为加了就万无一失
新文件一落地就带 x 权限?得从源头掐住
很多上传服务、编辑器(比如 vim)会保留原文件权限,新建的 .sh 可能默认就有 x:
- 设
umask 022(新建文件默认644)或更严的umask 027,在服务启动脚本或用户 shell 配置里写死 - 用默认 ACL 锁死:
setfacl -d -m u::rw-,g::r--,o::r-- /upload/dir,确保新文件权限固定为644 - 别信系统默认行为——Linux 不保证新建文本文件没
x,必须主动干预
真正麻烦的不是删掉已有 x,而是让后续每个新文件都“天生没执行位”。这步漏了,防护就等于开了口子。


















