De acordo com esta discussão CAP_SYS_RAWIO
de capacidade precisa ser aplicada ao smartctl
executável.
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:
CAP_SYS_ADMIN
ao executável do programa. CAP_DAC_OVERRIDE
ao executável smartctl
(como sugerido ) e também adicionei ao executável do programa. 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?) /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.
De acordo com esta discussão CAP_SYS_RAWIO
de capacidade precisa ser aplicada ao smartctl
executável.