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を構成します。sixad
rfkill
答え2
設定できます設定値スクリプトにタグを付け、所有者をroot(または必要な権限を持つ人)に設定します。 setuidフラグは、スクリプトを実行できる人がスクリプトを実行すると、プロセスのUIDがその所有者に設定されることを意味します。
たとえば、スクリプトがあるとします。ジョー, setuid フラグがオンになっているためアリスこれを実行するには、スクリプト自体に次の権限が必要です。ジョー(Joeが今ログインしていない場合でもこれを実行するのと同じです。)
IIUCはHTTPサーバーで実行したいと思います。これがすべてのサーバーで動作するかどうかはわかりませんが、少なくともDebianのApacheはsetuidスクリプトの実行を拒否します。バイナリ実行可能ファイルのみが許可されます。私はexec()
スクリプトへのハードコーディングされたパスを使用する単純なラッパーをCにしてこの問題を解決しました。
しかし、私は確かに努力しますrootで何も実行しないリモート:より安全なアプローチは特別なユーザーは特定のタスクにのみ使用され、必要以上の権限がなく、上記の技術を使用します。 (わかりませんが、これはApacheに関する部分が適用されないことを意味します。これはルートのスクリプトにのみ適用できます。)
デフォルトでは、ユーザーを特定のグループのメンバーにして権限を割り当てます。多くのディストリビューションでは、デバイス固有のグループ(「cdrom」、「fax」など)を作成します。システムに「Bluetooth」グループがあることを確認してください。その場合は、新しいユーザーを作成してグループのメンバーにします。