修复polkit规则:优化PCRE正则匹配/proc/status中的特定GID
修复polkit规则中匹配进程GID的正则表达式问题
问题分析
原正则表达式"^Groups:.+?\\\s990[\\\s\\\0]"的问题在于:
- 非贪婪匹配的
.+?会尽可能少地匹配字符,当目标GID(990)不是紧跟在Groups:后的第一个组时,无法正确定位到目标GID的位置; - 没有明确的边界匹配,存在误匹配包含990的其他GID(如1990)的风险。
优化后的正则表达式
推荐使用以下两种正则之一,根据实际需求选择:
方案1:匹配独立GID(推荐)
确保990是一个独立的组ID,同时允许它出现在Groups行的任意位置:
"^Groups:.*\\b990\\b"
方案2:兼容行尾空字符
如果需要处理/proc/[pid]/status文件可能存在的行尾空字符\0,可以使用:
"^Groups:.*\\b990(?:\\s|\\0)"
优化点说明
- 将非贪婪的
.+?替换为贪婪的.*:可以匹配Groups:之后的所有内容,直到找到目标GID; - 添加
\\b单词边界:保证990是一个独立的数字,避免匹配到类似1990、9901这类包含990的无关GID; - 可选的
(?:\\s|\\0):匹配990之后的分隔符(空格或行尾空字符),确保匹配的完整性。
验证示例
假设/proc/1234/status中的Groups行内容为:
Groups: 1000 990 992
执行以下命令会成功匹配:
grep -Po '^Groups:.*\b990\b' /proc/1234/status
替换后的正则可以让polkit规则正确识别进程所属的目标组ID,无论该GID在Groups列表中的位置如何。
内容的提问来源于stack exchange,提问作者AtomicPorkchop
相关产品推荐
相关产品推荐

