我有一个在 linux 移动设备上运行的用户级 C++ 测试应用程序。其中一项测试涉及启用/禁用需要 root 权限写入设备文件的打印机纸张传感器。有没有办法授予我的应用程序这种特权?如果没有,是否有解决方法?
4 回答
这会做,
作为root
执行:
chown -v root:root /path/to/yourapp
chmod -v 4755 /path/to/yourapp
或者
chmod -v u+s /path/to/yourapp
或者
man chmod
这不适用于脚本。是的,你应该认真对待jdizzle所说的放弃不必要的特权。
解决此问题的另一种方法是使运行应用程序的用户成为拥有设备文件的组的成员。例如,
ls -la /dev/devicefile
crw-rw---- 1 root printer 4, 0 may 6 10:56 /dev/devicefile
该printer
组的成员可以读取和写入设备,因此您只需添加joe
到该printer
组(并重新启动会话)。
gpasswd -a joe printer
如果您需要调整设备文件权限,您可能需要编辑 udev 规则以使其永久化。但chmod
也应该工作。
您可以设置程序 setuid root,这意味着即使由用户运行,它也将始终以 root 身份运行。一旦完成需要 root 访问权限的必要操作,这通常需要特别小心地在程序中删除权限。
您还可以有一个帮助程序,它本身是 setuid root - 或具有适当的功能,或通过sudo
- 与打印机通信。您的主应用程序将分叉并执行该程序并通过管道与其通信,因此它本身不应以 root 身份运行。
帮助程序将是一个简单的可执行文件(具有适当的功能),它只能由您的主应用程序(而不是用户直接启动)启动,并通过管道或程序参数等与其通信。
很多图形管理程序也是这样做的:图形部分是一个与管理部分分开的程序,它们之间可以适当地进行通信。只有管理程序(通常是现有的命令行程序,如adduser
)需要特殊权限。
您绝对应该尽量避免以“root”身份运行您的程序,因为这不仅允许您的程序读/写 /dev/sensordevice,而且还会授予对系统上几乎所有内容的访问权限(包括完全变砖的能力)
因此,您应该尝试添加对所需资源的细粒度访问,使用适当的组并确保您的设备文件授予您的组写入访问权限。请参阅(例如)udev,了解如何编写适当的 udev 规则,该规则将特定设备的写访问权限授予给定组。