内蔵PCのスピーカーを利用する小さなCアプリを作成しました。これを実現するために、私は/dev/console
と話していると、スピーカーからビープ音が鳴ります。
ただし、コンパイルされた実行可能ファイルは、root
として実行した場合にのみ機能します。実行可能ファイルを実行しているユーザーを適切なグループに追加する必要があることは理解していますが、必要なアクセス許可を持っているグループがわからず、わかりません。
現在実行しようとしているユーザー(Apache
)として実行可能ファイルを実行すると、Permission denied
が得られます。
何か助けてください?
ファイルへのアクセスを制御するのと同じ方法で、デバイスへのアクセスを制御します。アクセス許可と所有権を確認し、アクセス許可を持つユーザーとして、またはアクセス許可を持つグループのメンバーとしてプログラムを実行します。
ただし、少なくとも私のシステムでは、
$ ll /dev/console
crw------- 1 root root 5, 1 Nov 29 06:59 /dev/console
/dev/console
へのアクセス許可はrootのみに制限されているため(おそらく正当な理由で)、rootとして実行するか、udev
ルールを変更して別の/dev/console
を作成する必要がありますグループ化してから、このグループのメンバーとしてプログラムを実行します(setgidビットなどを使用)。
しかし、PCスピーカーにアクセスするためのより良い方法があります(ほとんど知られていません):スピーカーは入力イベントデバイスとして表示され、正しい形式で書き込むことにより、スピーカー(周波数を含む)を直接制御できます。そのためのシステムに依存しないシンボリックリンクは
/dev/input/by-path/platform-pcspkr-event-spkr
シンボリックリンクをたどると、次のようなものが表示されます。
$ ll /dev/input/by-path/platform-pcspkr-event-spkr
lrwxrwxrwx 1 root root 9 Nov 29 06:57 /dev/input/by-path/platform-pcspkr-event-spkr -> ../event5
$ ll /dev/input/event5
crw-rw---- 1 root input 13, 69 Nov 29 06:57 /dev/input/event5
したがって、input
グループのすべてのメンバーがこのデバイスに書き込むことができます。これは、root
として実行するよりも安全です。
入力システムで使用されるイベントの形式は、/usr/src/linux/Documentation/input/input.txt
およびインクルードファイルで説明されています。要約すると
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
unsigned int value;
}
タイプはEV_SND
( "sound")、つまり0x12
です。そのような構造体をファイルに書き込むだけです。これにはCも必要ありません。コマンドラインのPerlで十分です。例:
Perl -e 'print pack("qssl", 0, 0x12, 2, 2000)' > /dev/input/by-path/platform-pcspkr-event-spkr
ビープ音をオフにします
Perl -e 'print pack("qssl", 0, 0x12, 2, 0)' > /dev/input/by-path/platform-pcspkr-event-spkr
セキュリティへの影響に慣れている限り、「setuid」フラグを使用して、ユーザーが実行可能ファイルをrootとして実行できるようにすることができます。
まず、実行可能ファイルの所有権をrootユーザーとグループに変更します。
# chown root:root /path/to/your_executable
次に、setuidフラグを有効にします。
# chmod u+s /path/to/your_executable
これで、いずれかのユーザーが実行可能ファイルを実行すると、「有効なユーザー」がrootになり、/ dev/consoleへのアクセスが許可されます。
次の出力を調べることで、setuidフラグを確認できます。
$ ls -l /path/to/your_executable
出力は次のようになります。
-rwsr-xr-x
最初のオクテットの「s」に注意してください。