应使用 find /path -type d ( -perm /2000 -o -perm /1000 ) 查找设置了 sgid 或 sticky 位的目录,因 -perm /7000 会误匹配非目录的 suid 文件且无法准确区分目录特殊权限。

不能直接用 find -perm /7000 搜索“具有特殊位的目录”,因为这个写法会匹配所有含任一特殊权限位(SUID、SGID、Sticky)的文件或目录,不区分类型,也不保证是目录。
明确目标:只找设置了特殊权限位的目录
关键在于两点:一是限定类型为目录,二是准确表达特殊权限位的组合逻辑。SUID(4000)、SGID(2000)、Sticky(1000)对应八进制高位,但它们在目录上生效的规则不同:
- SUID 对目录**基本无实际作用**(现代系统忽略),一般不用于目录
- SGID 对目录有效:新创建文件自动继承目录所属组
- Sticky 对目录有效:仅文件所有者/目录所有者/root 可删改其下文件(如
/tmp)
正确写法:用 -type d + 精确权限模式
要找设置了 SGID 或 Sticky 的目录,推荐以下方式:
- 找设置了 SGID 位的目录:
find /path -type d -perm /2000 - 找设置了 Sticky 位的目录:
find /path -type d -perm /1000 - 找同时设置了 SGID 和 Sticky 的目录:
find /path -type d -perm /3000(2000+1000) - 找至少含 SGID 或 Sticky 的目录(最常用):
find /path -type d \( -perm /2000 -o -perm /1000 \)
为什么 -perm /7000 不合适?
/7000 表示“任意一个高位为1即可”,它会命中 SUID 文件(如 /usr/bin/passwd),而这类文件几乎都不是目录。你真正关心的是目录上的 SGID/Sticky,所以应避免泛泛匹配 SUID 位。另外,-perm /7000 还可能漏掉权限显示为大写 S 或 T 的情况(比如目录没执行权却设了 SGID/Sticky),更稳妥的做法是结合 -ls 查看实际权限字符:
find /tmp -type d -perm /3000 -ls
验证是否真有 Sticky 或 SGID 目录
运行后检查输出中的权限字段:
-
drwxrwsr-x→ 小写s在组执行位 → SGID 目录(组有执行权) -
drwxrwxr-t→ 小写t在其他执行位 → Sticky 目录(其他有执行权) -
drwxr-Sr-x→ 大写S→ SGID 但组无执行权(通常无效) -
drwxrwxr-T→ 大写T→ Sticky 但其他无执行权(通常无效)











