smartctl
我有这个运行命令并获取其输出的C 代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int main()
{
cout << "Hello ! " << endl;
FILE *fp;
char path[1035];
/* Open the command for reading. */
fp = popen("smartctl -A /dev/sda", "r");
if (fp == NULL) {
printf("Failed to run command\n" );
exit(1);
}
/* Read the output a line at a time - output it. */
while (fgets(path, sizeof(path), fp) != NULL) {
printf("%s", path);
}
/* close */
pclose(fp);
return 0;
}
机器是openSUSE 13.2。我的问题是它需要root权限,但我不想切换到root。
我尝试过但没有成功的方法:
CAP_SYS_ADMIN
为程序可执行文件添加了功能。- 添加
CAP_DAC_OVERRIDE
到smartctl
可执行文件(按照建议这里)并且我还将它添加到程序可执行文件中。 - 我曾经
setcap 'cap_dac_override=+ep' cpptest
添加过该功能(也适用于CAP_SYS_Admin
),但当我使用时,getcap
我只获得其中之一,而不是两者。 (你能帮我吗?) - 我将 的权限更改
/dev/sda
为 755、777、766,并使用 将该设备的所有权更改为我的组chown root:users /dev/sda
。
我编写了一个程序,使用套接字执行一些网络操作,它需要 root 权限,但我添加了它CAP_NET_ADMIN
并且它起作用了。我只是不知道为什么功能不起作用。
这是一个非常重要的问题。非常感谢任何帮助。
请注意:我提供了 C 代码,但这是 Linux 的问题,而不是编程问题。
答案1
根据这讨论CAP_SYS_RAWIO
能力需要应用于smartctl
可执行文件。