rootに切り替えずにrootとしてsmartctlを実行するには?

rootに切り替えずにrootとして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です。私の問題は、rootアクセスが必要ですが、rootに切り替えたくないということです。

私が成功せずに試したこと:

  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

ソケットを使用していくつかのネットワーク操作を実行するプログラムを作成しましたが、root権限が必要でしたが、それを追加してCAP_NET_ADMIN機能しました。なぜ機能が機能しないのかわかりません。

これは非常に重要な質問です。どんな助けでも大変感謝します。

注:Cコードを提供しましたが、これはプログラミングの問題ではなくLinuxの問題です。

答え1

~によるとこれ実行可能ファイルにはディスカッションCAP_SYS_RAWIO機能を適用する必要があります。smartctl

関連情報