root権限でユーザースクリプトを実行する

root権限でユーザースクリプトを実行する

Bluetooth機能を有効または無効にするためにrootアクセスを必要とするスクリプトを作成しました。ボタンにバインドしているため、rootとしてログインしてスクリプトを実行することはできません。スクリプトのファイル権限を正しく設定するには?最善の方法は、ルートのみファイルを編集して読み取ることができることです。しかし、完全な実行権限をどのように付与しますか?

BT_RFKILL=$(rfkill list | grep tpacpi_bluetooth_sw | sed 's/\([0-9]\+\):.*/\1/')
BT_STATE=$(rfkill list $BT_RFKILL | grep "Soft blocked: yes")

if [ "x" == "x$BT_STATE" ]; then
    sixad --stop
    sleep 2s
    rfkill block $BT_RFKILL
else
    rfkill unblock $BT_RFKILL
    sleep 2s
    sixad --start
fi
exit 0

sudoを使用すると、スクリプトは完全に実行されますが、単純なキーバインディングを介して実行するのが好きなので、これは理想的ではありません。

答え1

安全なアプローチは、おそらくsudoと両方を呼び出すスクリプト行で使用することです(両方にルートアクセスが必要であると仮定します)。次に、スクリプトを実行する必要があるユーザーまたはグループがパスワードなしでこれらのコマンドを実行できるようにsudoerを構成します。sixadrfkill

答え2

設定できます設定値スクリプトにタグを付け、所有者をroot(または必要な権限を持つ人)に設定します。 setuidフラグは、スクリプトを実行できる人がスクリプトを実行すると、プロセスのUIDがその所有者に設定されることを意味します。

たとえば、スクリプトがあるとします。ジョー, setuid フラグがオンになっているためアリスこれを実行するには、スクリプト自体に次の権限が必要です。ジョー(Joeが今ログインしていない場合でもこれを実行するのと同じです。)

IIUCはHTTPサーバーで実行したいと思います。これがすべてのサーバーで動作するかどうかはわかりませんが、少なくともDebianのApacheはsetuidスクリプトの実行を拒否します。バイナリ実行可能ファイルのみが許可されます。私はexec()スクリプトへのハードコーディングされたパスを使用する単純なラッパーをCにしてこの問題を解決しました。

しかし、私は確かに努力しますrootで何も実行しないリモート:より安全なアプローチは特別なユーザーは特定のタスクにのみ使用され、必要以上の権限がなく、上記の技術を使用します。 (わかりませんが、これはApacheに関する部分が適用されないことを意味します。これはルートのスクリプトにのみ適用できます。)

デフォルトでは、ユーザーを特定のグループのメンバーにして権限を割り当てます。多くのディストリビューションでは、デバイス固有のグループ(「cdrom」、「fax」など)を作成します。システムに「Bluetooth」グループがあることを確認してください。その場合は、新しいユーザーを作成してグループのメンバーにします。

関連情報