루트로 전환하지 않고 루트로 smartctl을 실행하는 방법은 무엇입니까?

루트로 전환하지 않고 루트로 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입니다. 내 문제는 루트 액세스가 필요하지만 루트로 전환하고 싶지 않다는 것입니다.

내가 성공하지 못한 채 시도한 것:

  1. CAP_SYS_ADMIN프로그램 실행 파일에 기능이 추가되었습니다.
  2. CAP_DAC_OVERRIDE실행 파일 에 추가 smartctl(제안된 대로)여기) 그리고 프로그램 실행 파일에도 추가했습니다.
  3. 해당 기능을 추가한 적이 있는데 setcap 'cap_dac_override=+ep' cpptest( 에서도 작동함 CAP_SYS_Admin) 이 기능을 사용하면 getcap둘 중 하나만 얻을 수 있고 둘 다 얻을 수는 없습니다. (도와주세요?)
  4. 권한을 /dev/sda755, 777, 766으로 변경하고 를 사용하여 장치의 소유권을 내 그룹으로 변경했습니다 chown root:users /dev/sda.

소켓을 사용하여 일부 네트워크 작업을 수행하는 프로그램을 작성했는데 루트 권한이 필요했지만 이를 추가 CAP_NET_ADMIN하고 작동했습니다. 왜 기능이 작동하지 않는지 모르겠습니다.

이것은 매우 중요한 질문입니다. 어떤 도움이라도 대단히 감사하겠습니다.

참고: C 코드를 제공했지만 이는 프로그래밍 문제가 아니라 Linux 문제입니다.

답변1

~에 따르면이것실행 파일 에는 토론 CAP_SYS_RAWIO기능을 적용해야 합니다 .smartctl

관련 정보