我编写了一个程序,它访问硬件(设备文件)并需要 root 权限才能运行。我希望这个程序可以由非特权用户执行,而无需 root 密码。我尝试通过sudo chmod u+s programName
重启来修改权限,但程序无法运行sudo ./programName
我记得我 12 年前做过这个,但现在我搞不懂了。有什么建议吗?
答案1
如果你将程序的可执行文件的所有者设置root
为
sudo chown root /path/to/program/executable
然后使用以下方法设置它的 setuid 位
sudo chmod u+s /path/to/program/executable
然后你既不需要重新启动,也不需要使用sudo
。通过名称正常启动程序将以 root 权限执行它。但是这将允许任何用户以 root 权限运行该程序,因此你应该非常确保您以这样的方式对其进行了编程,它不会被滥用来执行您使用 root 权限之外的其他操作。
第一步至关重要。setuid 位的作用是使程序以文件所有者的 UID 运行。如果所有者不是,root
则程序将不具有 root 权限,即使您使用 运行它sudo
,因为 setuid 位会覆盖 的效果sudo
。
所以任何一个运行你的程序sudo
或者使用 设置 setuid 位chmod u+s
,但不能同时使用两者。
注意:不要以 root 权限运行程序,最好设置其访问的设备文件的权限,以允许运行它的普通用户获得必要的访问权限。