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입니다. 내 문제는 루트 액세스가 필요하지만 루트로 전환하고 싶지 않다는 것입니다.
내가 성공하지 못한 채 시도한 것:
CAP_SYS_ADMIN
프로그램 실행 파일에 기능이 추가되었습니다.CAP_DAC_OVERRIDE
실행 파일 에 추가smartctl
(제안된 대로)여기) 그리고 프로그램 실행 파일에도 추가했습니다.- 해당 기능을 추가한 적이 있는데
setcap 'cap_dac_override=+ep' cpptest
( 에서도 작동함CAP_SYS_Admin
) 이 기능을 사용하면getcap
둘 중 하나만 얻을 수 있고 둘 다 얻을 수는 없습니다. (도와주세요?) - 권한을
/dev/sda
755, 777, 766으로 변경하고 를 사용하여 장치의 소유권을 내 그룹으로 변경했습니다chown root:users /dev/sda
.
소켓을 사용하여 일부 네트워크 작업을 수행하는 프로그램을 작성했는데 루트 권한이 필요했지만 이를 추가 CAP_NET_ADMIN
하고 작동했습니다. 왜 기능이 작동하지 않는지 모르겠습니다.
이것은 매우 중요한 질문입니다. 어떤 도움이라도 대단히 감사하겠습니다.
참고: C 코드를 제공했지만 이는 프로그래밍 문제가 아니라 Linux 문제입니다.
답변1
~에 따르면이것실행 파일 에는 토론 CAP_SYS_RAWIO
기능을 적용해야 합니다 .smartctl