Как запустить smartctl как root без переключения на root?

У меня есть код C, который запускает команду smartctl и выводит ее:

 #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_OVERRIDE к исполняемому файлу smartctl (как предлагается здесь ), и я также добавил его в исполняемый файл программы.
  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, а не с проблемой программирования.

Согласно этому обсуждению возможности CAP_SYS_RAWIO должны применяться к исполняемому файлу smartctl .