Como executar o smartctl como root sem mudar para root?

1

Eu tenho este código C que executa o comando smartctl e obtém sua saída:

#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;
}

A máquina é o openSUSE 13.2. Meu problema é que requer privilégios de root, mas eu não quero mudar para root.

O que eu tentei e não funcionou:

  1. Adicionada a capacidade CAP_SYS_ADMIN ao executável do programa.
  2. Adicionado CAP_DAC_OVERRIDE ao executável smartctl (como sugerido ) e também adicionei ao executável do programa.
  3. usei setcap 'cap_dac_override=+ep' cpptest para adicionar o recurso (também para o CAP_SYS_Admin ), mas quando uso getcap , obtenho apenas um deles, não os dois. (Você pode me ajudar nisso?)
  4. Alterei a permissão de /dev/sda para 755, 777, 766 e alterei a propriedade do dispositivo para o meu grupo usando chown root:users /dev/sda .

Eu escrevi um programa que realiza algumas operações de rede usando sockets e requer privilégios de root, mas adicionei CAP_NET_ADMIN e funcionou. Eu simplesmente não sei porque as capacidades não funcionam.

Esta é uma questão realmente importante. Qualquer ajuda é muito apreciada.

Por favor note: Eu forneci um código em C, mas este é um problema com o Linux não é um problema de programação.

    
por 3bdalla 04.03.2015 / 08:57

1 resposta

1

De acordo com esta discussão CAP_SYS_RAWIO de capacidade precisa ser aplicada ao smartctl executável.

    
por 04.03.2015 / 11:46