【新手易混】find 命令中 -perm 选项的知识点

find 命令是 Linux/Unix 系统中强大的文件查找工具,广泛用于根据文件名、类型、时间、权限等条件搜索文件。其中,-perm 选项用于按文件权限查找文件,而在 -perm /mode 中出现的斜杠 / 是一种特殊的语法,表示“按位或(OR)匹配权限位”。本文将围绕这一知识点,结合实际案例,深入讲解其原理、用法及注意事项,帮助读者掌握 find 命令中 -perm 选项的精妙之处。


一、-perm 选项的基本概念

在 Linux 文件系统中,每个文件或目录都有权限位,用于控制用户对文件的读(r)、写(w)和执行(x)权限。这些权限通过八进制数字表示,分为用户(owner)、组(group)和其他用户(others)三类,每类权限用一个八进制数字表示。例如:

  • r(读) = 4
  • w(写) = 2
  • x(执行) = 1

因此,常见权限组合如 rwxr-xr-x 可表示为八进制 755,其中:

  • 用户权限:rwx = 4+2+1 = 7
  • 组权限:r-x = 4+0+1 = 5
  • 其他用户权限:r-x = 4+0+1 = 5

除了普通权限外,Linux 还支持特殊权限位:

  • setuid(4000):设置后,执行该文件的用户将以文件拥有者的身份运行。
  • setgid(2000):设置后,执行该文件的用户将以文件所属组的身份运行。
  • sticky bit(1000):常用于目录,限制只有文件拥有者才能删除目录中的文件(如 /tmp 目录)。

find 命令的 -perm 选项允许用户根据这些权限位查找文件,而 /mode 语法则是其高级用法之一。

二、-perm /mode 语法详解

find 命令中,-perm 选项支持三种匹配模式:

  1. 精确匹配(-perm mode:文件权限必须完全等于指定的 mode
  2. 包含匹配(-perm -mode:文件权限必须包含 mode 中的所有权限位,但可以有额外的权限。
  3. 按位或匹配(-perm /mode:文件权限只需包含 mode 中任意一个权限位即可。

/mode 中的斜杠 / 表示“按位或(OR)匹配”。以 find / -perm /6000 为例,这条命令的含义是:

查找系统中至少设置了 setuid(4000)或 setgid(2000)中任意一个权限位的文件或目录。

2.1 数字 6000 的二进制组成

Linux 文件权限用 12 位二进制表示,分为 4 个部分(每个部分对应一个八进制数字,占 3 位):

  • 第 1 部分(3 位):特殊权限(setuid、setgid、sticky bit)。
  • 第 2-4 部分(各 3 位):用户、组、其他用户的读、写、执行权限。

八进制 6000 表示为 12 位二进制如下:

6    0    0    0      ← 八进制
110  000  000  000    ← 二进制
↑    ↑    ↑    ↑setuid / setgid / sticky + 普通权限(用户、组、其他)

具体分解:

  • 6 = 110(二进制):
    • 第 1 位(4000,setuid) = 1
    • 第 2 位(2000,setgid) = 1
    • 第 3 位(1000,sticky bit) = 0
  • 后 9 位(000 000 000):普通权限位(读、写、执行)均为 0。

因此,6000 的二进制表示为 110000000000,表示“setuid 或 setgid 至少有一个为 1”。

2.2 /6000 的按位或匹配规则

/6000(即 /110000000000)的含义是:

只要目标文件权限的 12 位二进制表示中,第 1 位(setuid)或第 2 位(setgid)中至少有一个为 1,就算匹配成功。

这意味着:

  • 如果文件权限的二进制表示中,第 1 位(100000000000,即 setuid)为 1,则匹配。
  • 如果第 2 位(010000000000,即 setgid)为 1,也匹配。
  • 如果第 1 位和第 2 位都为 1(即同时有 setuid 和 setgid),仍然匹配。
  • 其他 10 位(sticky bit 及普通权限位)的值不影响匹配结果。

从数学角度看,6000 = 4000 | 2000(按位或运算),表示“setuid 或 setgid”。-perm /6000 的逻辑是检查文件权限的二进制位与 110000000000 进行按位或运算后,是否至少有一个匹配的 1。

示例验证

以下是一些文件的权限及其是否匹配 -perm /6000 的分析:

文件权限(八进制)二进制(12 位)是否匹配 /6000原因
4755100 111 101 101第 1 位(setuid)为 1
2755010 111 101 101第 2 位(setgid)为 1
6755110 111 101 101第 1、2 位(setuid 和 setgid)均为 1
0755000 111 101 101第 1、2 位(setuid 和 setgid)均为 0

总结-perm /6000 的核心是检查文件权限的二进制表示中,是否至少有一个位与 110000000000 中为 1 的位(即 setuid 或 setgid)匹配,而其他位的状态(如普通读写执行权限)无关紧要。

2.3 / 语法的核心逻辑

斜杠 / 触发的“按位或”逻辑使得 -perm /6000 非常灵活,具体表现为:

  • 宽松匹配:只需文件权限包含 setuid(4000)或 setgid(2000)中的任意一个即可。
  • 忽略无关位:普通权限(读、写、执行)以及 sticky bit 的状态不影响匹配结果。
  • 高效筛选:适合快速查找具有特定特殊权限的文件,而无需精确指定所有权限位。

这种匹配方式特别适合需要查找“至少具有某些权限”的场景,例如在安全审计中定位可能存在提权风险的 setuid 或 setgid 文件。

三、实际案例分析

为了更直观地理解 -perm /6000 的作用,我们来看几个具体的文件权限示例,并结合二进制分析:

  1. 文件 A:-rwsr-xr-x(八进制 4755

    • 权限分解:
      • 二进制:100 111 101 101
      • 4000(setuid):第 1 位为 1。
      • 0755:普通权限(rwxr-xr-x)。
    • 匹配结果:第 1 位(setuid)为 1,满足 -perm /6000
  2. 文件 B:-rwxr-sr-x(八进制 2755

    • 权限分解:
      • 二进制:010 111 101 101
      • 2000(setgid):第 2 位为 1。
      • 0755:普通权限(rwxr-xr-x)。
    • 匹配结果:第 2 位(setgid)为 1,满足 -perm /6000
  3. 文件 C:-rwxr-xr-x(八进制 0755

    • 权限分解:
      • 二进制:000 111 101 101
      • 无 setuid 或 setgid(第 1、2 位均为 0)。
      • 0755:普通权限(rwxr-xr-x)。
    • 匹配结果:第 1、2 位均为 0,不满足 -perm /6000
  4. 文件 D:-rwsr-sr-x(八进制 6755

    • 权限分解:
      • 二进制:110 111 101 101
      • 4000(setuid):第 1 位为 1。
      • 2000(setgid):第 2 位为 1。
      • 0755:普通权限(rwxr-xr-x)。
    • 匹配结果:第 1、2 位均为 1,满足 -perm /6000

通过这些例子可以看出,-perm /6000 的匹配条件非常宽松,只要文件权限的二进制表示中第 1 位(setuid)或第 2 位(setgid)至少有一个为 1 即可。

四、与其他 -perm 写法的对比

为了更清晰地理解 /mode 语法的独特性,我们将它与其他两种 -perm 匹配模式进行对比:

写法含义
-perm 6000精确匹配:文件的权限必须完全等于 6000(即必须同时具有 setuid 和 setgid,且其他权限位必须为 0)。
-perm -6000包含匹配:文件的权限必须同时包含 setuid(4000)和 setgid(2000),但可以有额外的权限位(如读、写、执行)。
-perm /6000按位或匹配:文件的权限只需包含 setuid(4000)或 setgid(2000)中的任意一个,其他权限位可以任意。

4.1 对比示例

假设系统中存在以下文件:

  • 文件 A:-rwsr-s---6700
  • 文件 B:-rwsr-xr-x4755
  • 文件 C:-rwxr-sr-x2755
  • 文件 D:-rwxr-xr-x0755

我们分别使用三种写法进行查找:

  1. -perm 6000
    • 匹配结果:无文件匹配。因为没有文件的权限完全等于 6000(即只有 setuid 和 setgid,且其他位为 0)。
  2. -perm -6000
    • 匹配结果:仅文件 A(6700)匹配。因为只有它同时具有 setuid 和 setgid。
  3. -perm /6000
    • 匹配结果:文件 A(6700)、文件 B(4755)、文件 C(2755)都匹配。因为它们至少包含 setuid 或 setgid 中的一个。

通过对比可以看出,-perm /6000 的匹配范围最广,适合需要查找“任意一种特殊权限”的场景。

五、总结

find 命令中的 -perm /mode 语法通过“按位或”匹配,为查找具有特定权限位的文件提供了灵活的方式。以 -perm /6000 为例,它能够快速定位系统中设置了 setuid 或 setgid 的文件,广泛应用于安全审计、权限调试等场景。与 -perm mode-perm -mode 相比,/mode 语法的匹配条件最为宽松,适合需要“至少包含某权限位”的场景。

通过本文的讲解,相信读者已经能够熟练掌握 -perm /6000 的用法及其背后的逻辑。在实际操作中,结合具体需求和环境,合理使用 find 命令的权限查找功能,将大大提升系统管理的效率和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93752.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gdb的load命令和传给opeocd的monitor flash write_image erase命令的区别

问: "monitor flash write_image erase ${workspaceFolder}/obj/ylad_led_blink.elf", 和 "load", "executable" : "${workspaceFolder}/obj/ylad_led_blink.elf", 的区别?答: 你提到的 "monit…

1. Docker的介绍和安装

文章目录1. Docker介绍核心概念核心优势与虚拟机的区别一句话总结2. Docker的安装Windows 10/11 安装 Docker Desktop(推荐 WSL2 方式)Linux(以 Ubuntu / Debian 系为例)Docker 是一个开源的容器化平台,它允许开发者将…

fastdds.ignore_local_endpoints 属性

Fast DDS 的 fastdds.ignore_local_endpoints 属性用于控制同一 DomainParticipant 下的本地端点(即 DataWriter 和 DataReader)是否自动匹配。以下是对该功能的详细解释,并翻译为中文,结合其上下文、实现原理和使用场景&#xff…

华清远见25072班C语言学习day11

重点内容:函数:定义:返回值类型 函数名(参数列表) { //函数体 }函数的参数列表中可以有多个数据返回值:如果函数没有返回值可以写成void 返回值的作用,函数的结果用来返回给主调函数的,如果主调函数处不需要函数的结果…

视觉语言导航(7)——VLN的数据集和评估方法 3.2

这是课上做的笔记,因此很多记得比较急,之后会逐步完善,每节课的逻辑流程写在大纲部分。成功率(SR)导航误差(NE)成功加权路径长度(SucceedPLength)轨迹长度(TL)先知成功率(OS&#xf…

ElasticSearch不同环境同步索引数据

目的:在生产环境把一个索引的数据同步到测试环境中1、在生产环境导出json数据curl -u "adims_user:xkR%cHwR5I9g" -X GET "http://172.18.251.132:9200/unify_info_mb_sp_aggregatetb_0004/_search?scroll1m" -H Content-Type: applicatio…

咨询进阶——解读咨询顾问技能模型

适应人群为咨询行业从业者、咨询团队管理者、想提升咨询技能的职场人士及咨询公司培训人员。主要内容围绕咨询顾问技能模型展开,核心包括五大核心能力(解决问题能力,涵盖洞察力、分析技巧、问题构建等,从识别问题实质到构建新分析方法分层次阐述;管理能力,涉及管理他人与…

2025年- H98-Lc206--51.N皇后(回溯)--Java版

1.题目描述2.思路 二维数组集合 (1)N皇后规则 1)不能同行(同一行不能出现2个皇后) 2)不能同列(同一列不能出现2个皇后) 3)不能说45度或135度(斜对角线不能出现2个皇后&am…

5G + AI + 云:电信技术重塑游戏生态与未来体验

在数字娱乐蓬勃发展的今天,游戏产业已然成为科技创新的前沿阵地。电信网络也经历了一场深刻的蜕变,从最初仅仅是 “内容传输管道”,摇身一变成为与游戏深度绑定的技术共生体。5G 不断刷新着体验的边界,AI 彻底颠覆传统的创作模式&…

【React Hooks】封装的艺术:如何编写高质量的 React 自-定义 Hooks

【React Hooks】封装的艺术:如何编写高质量的 React 自-定义 Hooks 所属专栏: 《前端小技巧集合:让你的代码更优雅高效》 上一篇: 【React State】告别 useState 滥用:何时应该选择 useReducer 作者: 码力…

华为GaussDB的前世今生:国产数据库崛起之路

在数据库领域,华为GaussDB已成为一颗耀眼的明星,为企业核心业务数字化转型提供坚实的数据底座。但这并非一蹴而就,其背后是长达二十余年的技术沉淀、战略投入与持续创新。本文将深入探寻华为GaussDB的历史沿革与核心技术细节,展现…

数据结构初阶(16)排序算法——归并排序

2.4 归并排序 归并排序(Merge Sort)是基于分治思想的经典排序算法。核心逻辑: 分而治之——把复杂排序问题拆分成简单子问题解决,再合并子问题的结果。联系链表的合并:两个有序链表l1、l2创建新链表l3(带头…

MATLAB实现匈牙利算法求解二分图最大匹配

MATLAB实现匈牙利算法求解二分图最大匹配 匈牙利算法(也称为Kuhn-Munkres算法)是解决二分图最大匹配问题的经典算法。 代码 function [matching, max_match] hungarian_algorithm(adjMatrix)% HUNGARIAN_ALGORITHM 实现匈牙利算法求解二分图最大匹配% 输…

自定义table

更好<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"utf-8"><title>数据表格</title><style>* {margin: 0;padding: 0;box-sizing: border-box;font-size: 14px;}html,body {width: 100%;height: 100%…

面向R语言用户的Highcharts

如果您喜欢使用 R 进行数据科学创建交互式数据可视化&#xff0c;那么请你收藏。今天&#xff0c;我们将使用折线图、柱状图和散点图来可视化资产回报。对于我们的数据&#xff0c;我们将使用以下 5 只 ETF 的 5 年月回报率。 SPY (S&P500 fund)EFA (a non-US equities fun…

【测试工具】OnDo SIP Server--轻松搭建一个语音通话服务器

前言 Ondo SIP Server 是一款基于 SIP(Session Initiation Protocol)协议的服务器软件&#xff0c;主要用于实现 VoIP(Voice over IP)通信&#xff0c;支持语音通话、视频会议等多媒体会话管理&#xff0c;非常适合学习和测试VoIP的基本功能。本文介绍Ondo SIP Server的安装、…

疯狂星期四文案网第42天运营日记

网站运营第42天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 今日搜索引擎收录情况 网站优化点 优化一些发现的seo错误 增加颜文字栏目 增加了一些tag

使用空模型实例调用辅助函数,确定在量化过程中哪些层会被跳过(43)

在Facebook的OPT-350M中,模型的头部(lm_head)与解码器的嵌入标记层(decoder.embed_tokens)共享其权重。 print(model.model.decoder.embed_tokens) print(model.lm_head)输出结果 Embedding(50272, 512

从0-1使用Fastmcp开发一个MCP服务,并部署到阿里云百炼 -持续更新中

目的&#xff1a; 在本地使用fastmcp开发一个mcp,然后注册到阿里云的百炼里面。实现在百炼里面创建智能体的时候直接引用自己开发的MCP 已完成&#xff1a;本地环境安装 待完成&#xff1a; 1.根据需求实现一个MCP中可以调用某应用的多个API即 mcp.tool()、mcp.prompt()、接入大…

设计模式之汇总

设计模式 零、设计原则 0.1 单一职责 0.2 接口隔离 0.3 开闭原则 0.4 依赖倒置0.5 迪米特法则&#xff0c;最小知道原则用户关机 只和朋友通信 朋友条件&#xff1a; 1&#xff09;当前对象本身&#xff08;this&#xff09; 2&#xff09;以参量形式传入到当前对象方法中的对象…