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に切り替えたくないということです。
私が成功せずに試したこと:
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
。
ソケットを使用していくつかのネットワーク操作を実行するプログラムを作成しましたが、root権限が必要でしたが、それを追加してCAP_NET_ADMIN
機能しました。なぜ機能が機能しないのかわかりません。
これは非常に重要な質問です。どんな助けでも大変感謝します。
注:Cコードを提供しましたが、これはプログラミングの問題ではなくLinuxの問題です。
答え1
~によるとこれ実行可能ファイルにはディスカッションCAP_SYS_RAWIO
機能を適用する必要があります。smartctl