You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell中如何检测其他用户对文件的可写权限及对应权限位

跨用户文件可写权限准确校验方案

Shell内置的-w判断逻辑仅对当前执行脚本的用户生效,无法直接校验其他用户的权限,也无法感知文件属主、属组变更带来的权限归属变化,硬编码匹配权限位的方式也无法覆盖属主变动后的实际权限归属场景,可根据实际需求选择以下方案实现:

方案1:严格校验文件权限位为-rw-r--r--

不要解析ls输出做判断(ls输出受locale、环境变量影响容易出现匹配错误),直接用stat命令读取文件的八进制权限值即可,-rw-r--r--对应的八进制权限标识为644,判断代码如下:

file_perm=$(stat -c "%a" test1.log)
if [ "$file_perm" = "644" ]; then
    echo "文件权限位符合-rw-r--r--要求"
else
    echo "文件权限位不符合预期,当前权限八进制值为$file_perm"
fi

注意:该方案仅能校验权限位字符串,无法直接等价于「某指定用户拥有写权限」。例如文件属主变更为dev2后,哪怕权限位保持644不变,写权限的归属也会从原属主dev变为新属主dev2,此时要准确判断指定用户的实际写权限,需使用方案2。

方案2:跨用户精准校验指定用户的实际写权限

这是准确率最高的实现方式,不会受属主/属组变更、ACL规则、特殊权限位、文件系统挂载属性影响,无需自行拆解权限位做逻辑判断:以root身份执行脚本时,通过runuser临时切换到目标用户身份,调用系统自带的test -w做权限检测,返回结果和目标用户实际登录操作的权限表现完全一致。
示例代码如下:

# 校验dev1用户对test1.log的写权限
if runuser -u dev1 -- test -w test1.log; then
    echo "dev1 拥有该文件的写权限"
else
    echo "dev1 无该文件的写权限"
fi

# 校验dev2用户对test1.log的写权限
if runuser -u dev2 -- test -w test1.log; then
    echo "dev2 拥有该文件的写权限"
else
    echo "dev2 无该文件的写权限"
fi

如果执行脚本的用户没有root权限,无法切换到其他用户身份,就需要自行拆解权限位做判断,核心逻辑为:

  • 读取文件的属主ID、属组ID、八进制权限值
  • 读取目标用户的用户ID、所属的全部用户组ID
  • 若目标用户ID和文件属主ID一致,判断属主权限位是否包含写权限
  • 若目标用户不属于文件属主,判断目标用户是否在文件的属组列表内,命中则判断属组权限位是否包含写权限
  • 若既不属主也不属组,判断其他用户权限位是否包含写权限

注意:该自行实现的逻辑默认未覆盖ACL规则、文件只读属性、文件系统只读挂载、suid/sgid特殊权限等场景,结果可能存在偏差,非必要不推荐使用。参考实现代码如下:

target_user=dev1
file_path=test1.log

# 读取文件核心属性
file_uid=$(stat -c "%u" "$file_path")
file_gid=$(stat -c "%g" "$file_path")
file_perm=$(stat -c "%a" "$file_path")
# 读取目标用户核心属性
target_uid=$(id -u "$target_user")
target_gids=($(id -G "$target_user"))

has_write=0
if [ "$target_uid" -eq "$file_uid" ]; then
    # 属主位写权限值为2,按位与判断是否存在写权限
    [ $(( ${file_perm:0:1} & 2 )) -ne 0 ] && has_write=1
else
    in_group=0
    for gid in "${target_gids[@]}"; do
        if [ "$gid" -eq "$file_gid" ]; then
            in_group=1
            break
        fi
    done
    if [ $in_group -eq 1 ]; then
        # 属组位写权限判断
        [ $(( ${file_perm:1:1} & 2 )) -ne 0 ] && has_write=1
    else
        # 其他用户位写权限判断
        [ $(( ${file_perm:2:1} & 2 )) -ne 0 ] && has_write=1
    fi
fi

if [ $has_write -eq 1 ]; then
    echo "$target_user 对该文件有写权限"
else
    echo "$target_user 对该文件无写权限"
fi

内容的提问来源于stack exchange,提问作者Farid Arshad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 16:12:17