2012-05-07 80 views
2

我有一个在Linux移动设备上运行的用户级C++测试应用程序。其中一项测试涉及启用/禁用需要在设备文件上写入root权限的打印机纸张传感器。有没有办法让我的应用程序具有这种特权?如果没有,是否有解决方法?如何授予用户应用程序的根访问权限?

回答

3

这将做,

作为root执行:

chown -v root:root /path/to/yourapp 
chmod -v 4755 /path/to/yourapp  

或替代地

chmod -v u+s /path/to/yourapp 

或替代地

man chmod 

这将不适用于脚本。是的,你应该认真对待什么jdizzle说关于放弃不必要的特权。

解决此问题的另一种方法是使运行应用程序的用户成为拥有设备文件的组的成员。例如,printer

ls -la /dev/devicefile 
crw-rw---- 1 root printer 4, 0 may 6 10:56 /dev/devicefile 

成员可以读取和写入设备,所以你只需要添加joeprinter组(并重新启动会话)。

gpasswd -a joe printer 

如果需要调整设备文件的权限,你可能需要编辑udev规则,使之永久化。但chmod也应该工作。

其他值得调查的选择:setcap(8)(很好的指南here)和sudo(8)

2

您可以设置程序setuid root,这意味着它即使在用户运行时也会始终以root身份运行。这通常需要特别小心,一旦完成需要根访问的必要操作,就会在程序内部放弃权限。

1

你也可以有一个帮助程序,本身setuid根或具有适当的功能,或开始通过sudo - 与打印机通信。你的主应用程序将分支执行程序并通过管道与它通信,所以它不应该以root身份运行。

助手程序将是一个简单的可执行文件(用适当的能力),这将只能通过主应用程序(用户不能直接)启动和通管或程序参数与它通信等

一许多图形管理程序也是这样做的:图形化的部分是一个与管理部分分离的程序,并且它们适当地进行通信。只有管​​理程序(通常是现有的命令行程序adduser)需要特殊权限。

+0

帮助程序是什么意思?你能给我一个简单的例子吗? :D – Owen

+0

在我编辑的答案中解释 –

-2

您应该明确地尝试避免以“root”身份运行程序,因为这不仅会让您的程序读取/写入/ dev/sensordevice,而且还会授予您系统中几乎所有内容的访问权限(包括完全砖它)

因此,你应该尝试添加到你需要的资源的细粒度访问,使用适当的组,并确保您的设备文件授予您的组写入权限。 参见(例如)udev关于如何编写适当的udev规则,该规则将特定设备的写入访问授予给定组。