【发布时间】:2012-05-15 14:39:53
【问题描述】:
我有一个在 linux 移动设备上运行的用户级 C++ 测试应用程序。其中一项测试涉及启用/禁用需要 root 权限写入设备文件的打印机纸张传感器。有没有办法授予我的应用程序这种特权?如果没有,是否有解决方法?
【问题讨论】:
我有一个在 linux 移动设备上运行的用户级 C++ 测试应用程序。其中一项测试涉及启用/禁用需要 root 权限写入设备文件的打印机纸张传感器。有没有办法授予我的应用程序这种特权?如果没有,是否有解决方法?
【问题讨论】:
这样就可以了,
作为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 规则,该规则将特定设备的写入权限授予给定组。
【讨论】: