6

Я написал небольшое приложение на C, чтобы использовать внутренний динамик ПК. Чтобы добиться этого, я говорю о /dev/console которая, в свою очередь, издает звуковой сигнал из динамика.

Тем не менее, мой скомпилированный исполняемый файл работает, только если я запускаю от имени пользователя root . Я понимаю, что должен добавить пользователя, выполняющего исполняемый файл, в соответствующую группу, но я не знаю и не могу выяснить, какие группы имеют необходимые разрешения.

Запуск исполняемого файла от имени пользователя, которого я сейчас пытаюсь запустить как (apache), дает мне Permission denied .

Любая помощь, пожалуйста?

2 ответа2

5

Вы управляете доступом к устройству так же, как вы управляете доступом к файлу: просматривая разрешение и владение и выполняя программу либо как пользователь, имеющий разрешение на доступ, либо как член группы, имеющей разрешение на доступ.

Однако, по крайней мере, в моей системе,

$ ll /dev/console
crw------- 1 root root 5, 1 Nov 29 06:59 /dev/console

разрешения для /dev/console ограничены только пользователем root (вероятно, по уважительным причинам), поэтому вам нужно либо запустить его как root, либо изменить правила udev чтобы создать /dev/console с другой группой, а затем запустить программу как член этой группы (с битом setgid или иным образом).

Но есть и лучший способ получить доступ к динамику ПК (который малоизвестен): динамик отображается как устройство события ввода, и, записав в него правильный формат, вы можете напрямую управлять динамиком (включая частоту). Системно-независимая символическая ссылка для этого

/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 ("звук"), то есть 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
4

Если вас устраивают вопросы безопасности, вы можете использовать флаг 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' в первом октете.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .