web-dev-qa-db-ja.com

実行可能ファイルへのアクセス/ dev / consoleを許可するにはどうすればよいですか?

内蔵PCのスピーカーを利用する小さなCアプリを作成しました。これを実現するために、私は/dev/consoleと話していると、スピーカーからビープ音が鳴ります。

ただし、コンパイルされた実行可能ファイルは、rootとして実行した場合にのみ機能します。実行可能ファイルを実行しているユーザーを適切なグループに追加する必要があることは理解していますが、必要なアクセス許可を持っているグループがわからず、わかりません。

現在実行しようとしているユーザー(Apache)として実行可能ファイルを実行すると、Permission deniedが得られます。

何か助けてください?

5
David Refoua

ファイルへのアクセスを制御するのと同じ方法で、デバイスへのアクセスを制御します。アクセス許可と所有権を確認し、アクセス許可を持つユーザーとして、またはアクセス許可を持つグループのメンバーとしてプログラムを実行します。

ただし、少なくとも私のシステムでは、

$ 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
6
dirkt

セキュリティへの影響に慣れている限り、「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」に注意してください。

3
diametralpitch