0

デバイスファイル(root権限が必要)に書き込むことでデバイスを有効/無効にする必要があるユーザーレベルのアプリケーションがあります。

これが私のインターフェースの現在の実装です:

bool DeviceInterface::EnableDevice( bool isEnabled )
{
    bool isSuccessful = false;

    //enable device
    if(isEnabled)
    {
        isSuccessful = (system("enableDevice.sh 1") == 0)? true : false;
    }
    //disable device
    else
    {
        isSuccessful = (system("enableDevice.sh 0") == 0)? true : false;
    }
    return isSuccessful ;
}

私のスクリプト「enableDevice.sh」は単純に次のようになり、rootとして実行すると問題なく実行されます。

echo $1 > /sys/devices/device_file

デバイスファイルに書き込めるにはroot権限が必要なため、これは失敗します。私は「パイプ」、「フォーク」、「エグゼクティブ」にまったく慣れていません。スクリプトに「0」または「1」を渡してデバイスを有効または無効にする方法を教えてもらえますか?

4

2 に答える 2

1

次のように enableDevice.sh で chmod を実行します (root で):-

   #chmod 4755 enableDevice.sh

これは setuid ビットの設定と呼ばれます。これにより、root 以外のユーザーがこのスクリプトを実行できるようになり、所有者 (この場合は root) の権限で実行されます。したがって、プログラムは機能します。setuid について読んでください。EDIT : また、chmod の前に、enableDevice.sh の所有者とグループを root にします。それだけでうまくいきます。

于 2012-05-10T07:27:10.897 に答える
1

「enableDevice.sh」がこれを行うには、ルートとして実行する必要があります。suid (chmod u+S enableDevice.sh) のマークを付けて、ルートに chown することができます。chown を実行するには root になる必要があることに注意してください (妥当な UNIX システムでは)。

もちろん、いつでも自分の (プログラムの) グループまたはすべてのユーザーに対して書き込み権限を開くことができます。つまり、chmod g+w,o+w /sys/devices/device_file です。

これを行うことは本当にお勧めしません。そのスクリプトを '\"bunch of nothing at all > /dev/sda' で呼び出すと、システム ドライブの (おそらく) ルートが上書きされます。

スクリプトで "$1" をチェックしてから、0 または 1 をデバイスにエコーするか、どちらでもない場合は何もしないようにすることをお勧めします。つまり、特に suid スクリプトでは、ユーザー データを信頼しないでください。

case "$1" in
    enable)   VALUE=1 ;;
    disable)  VALUE=0 ;;
    *)        exit  ;;
esac
echo $VALUE > /sys/devices/device_file

さらに良いのは、ルートとして実行したデーモンを、パイプで取得する内容に応じて、上記を (効果的に) 実行する名前付きパイプを監視することです。

于 2012-05-10T07:27:34.560 に答える