如何在不切换到 root 的情况下以 root 身份运行 smartctl?

如何在不切换到 root 的情况下以 root 身份运行 smartctl?

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。

我尝试过但没有成功的方法:

  1. CAP_SYS_ADMIN为程序可执行文件添加了功能。
  2. 添加CAP_DAC_OVERRIDEsmartctl可执行文件(按照建议这里)并且我还将它添加到程序可执行文件中。
  3. 我曾经setcap 'cap_dac_override=+ep' cpptest添加过该功能(也适用于CAP_SYS_Admin),但当我使用时,getcap我只获得其中之一,而不是两者。 (你能帮我吗?)
  4. 我将 的权限更改/dev/sda为 755、777、766,并使用 将该设备的所有权更改为我的组chown root:users /dev/sda

我编写了一个程序,使用套接字执行一些网络操作,它需要 root 权限,但我添加了它CAP_NET_ADMIN并且它起作用了。我只是不知道为什么功能不起作用。

这是一个非常重要的问题。非常感谢任何帮助。

请注意:我提供了 C 代码,但这是 Linux 的问题,而不是编程问题。

答案1

根据讨论CAP_SYS_RAWIO能力需要应用于smartctl可执行文件。

相关内容