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

非root权限下Rust读取Linux /dev文件的权限处理及绕过方案

Rust读取Linux /dev目录文件的权限处理方案

为什么你的代码会失败

/dev目录下的设备文件(比如/dev/input)的权限修改必须拥有root权限,普通用户调用fs::set_permissions必然返回"operation not permitted"。这是因为Linux权限模型规定,只有文件所有者(通常是root)或拥有CAP_CHOWN/CAP_FOWNER能力的进程,才能修改文件权限。你的代码逻辑本身没问题,但缺少执行权限,所以无法生效。

可行的权限处理方法

  • 利用系统用户组权限
    Linux下多数/dev设备会归属特定用户组,比如输入设备(/dev/input/*)默认属于input组。将运行程序的用户加入该组即可获得访问权限:

    sudo usermod -aG input $USER
    

    登出并重新登入后,Rust程序无需root就能直接读取目标设备文件。

  • 给二进制文件添加特定能力
    无需让用户加入组,可给编译后的Rust二进制文件赋予绕过权限检查的能力,比如CAP_DAC_OVERRIDE(通用权限绕过)或更精细的CAP_SYS_RAWIO(针对IO设备):

    sudo setcap cap_dac_override+ep ./your_rust_binary
    

    赋予能力后,程序以普通用户身份运行也能访问/dev设备,注意此方法会提升程序权限,需谨慎使用。

  • 自定义udev规则
    创建udev规则让目标设备生成时自动设置可访问权限。比如创建/etc/udev/rules.d/99-input-access.rules文件,内容如下:

    SUBSYSTEM=="input", GROUP="input", MODE="0660"
    

    执行sudo udevadm control --reload-rules && sudo udevadm trigger重载规则后,新生成的input设备会允许input组用户访问,同样需要将用户加入该组。

  • 临时通过sudo运行
    如果程序仅偶尔需要访问/dev设备,可让用户通过sudo启动程序:

    sudo ./your_rust_binary
    

    此方法依赖用户的sudo权限,适合非长期运行的场景。

内容的提问来源于stack exchange,提问作者Christian Yemele

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:45:00