非root权限下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

