Я хочу использовать программу на основе SDL для отображения графики на консоли, без необходимости входа в систему с консоли и без запуска программы от имени пользователя root. Например, я хочу иметь возможность запустить его через SSH. Целевая ОС распбиана.
Вот короткий пример на python для иллюстрации проблемы:
import os, pygame
os.environ['SDL_VIDEODRIVER'] = 'fbcon'
pygame.init()
s = pygame.display.set_mode()
print "Success"
Это работает (работает до завершения, не выдает исключений), если я запускаю его из консоли, и работает через ssh, если я запускаю его как root.
Я проверил, что мой пользователь в аудио и видео группах.
Я использовал strace, чтобы увидеть, что отличается от запуска его из консоли (который работает), запуска от имени пользователя root через ssh (также работает) и запуска его как обычного пользователя через ssh (не работает).
Первым отличием было то, что мой пользователь не имел разрешения на доступ к / dev / tty0. Я создал новую группу (tty0), поместил моего пользователя в эту группу и добавил правило udev, чтобы дать этой группе доступ к / dev / tty0.
Выходные данные strace расходятся при вызове ioctl - здесь показывается ошибка; ioctl возвращает 0, когда программа запускается из консоли или запускается из ssh от имени пользователя root:
open("/dev/tty", O_RDWR) = 4
ioctl(4, VT_GETSTATE, 0xbeaa01f8) = -1 EINVAL (Invalid argument)
(Адреса также различаются, но это не важно.)
Учитывая, что моя программа работает, когда она запускается с правами root, я думаю, это означает, что у меня проблема с разрешениями. Как дать пользователю необходимые полномочия для запуска этой программы без входа в систему с консоли (и без запуска с правами root)?
источник
Ответы:
Моя цель была такой же, как у оригинального постера, но с одним отличием: мне нужно было запускать приложение SDL как демон systemd. Моя Linux-машина - Raspberry Pi 3, а операционная система - Raspbian Jessie. К RPi не подключена клавиатура или мышь. Я подключаюсь к нему с помощью SSH. Мое SDL-приложение - это приложение на основе Pygame . Я установил pygame / SDL для использования драйвера кадрового буфера «fbcon» через переменную окружения SDL_VIDEODRIVER. Мой
systemd --version
вывод:Моя версия пакета pygame: (
aptitude show python-pygame
):Моя версия libSDL 1.2: (
aptitude show libsdl1.2debian
- на вашем компьютере имя пакета может отличаться):Рецепт
Добавьте эти строки в раздел [Service] файла .service вашего демона:
Если кому-то интересно, вот полный файл pyscopefb.service, который я использовал:
Выполните эти команды в командной строке (я предполагаю, что файл pyscopefb.service уже находится в правильном месте, где systemd может его найти):
Это работает для меня. Обратите внимание, я не проверял, может ли приложение pygame получать события клавиатуры и мыши или нет.
бонус
Мне также пришлось решить еще 2 проблемы, которые также могут быть интересны
В нижней части экрана был мигающий текстовый курсор с графикой кадрового буфера. Чтобы решить эту проблему, я добавил в свое приложение следующий код Python, который запускается в моем приложении перед инициализацией Pygame / SDL:
Примерно через 10 минут экран, подключенный к выходу HDMI Raspberry Pi, стал черным (но не выключенным), и моя графика не отображалась, хотя Pygame не сообщала об ошибках. Это оказалось функцией энергосбережения. Чтобы отключить это, я добавил следующий код Python, который также запускается до инициализации Pygame / SDL:
источник
/dev/tty7
и выдавать команду,ExecStartPre=/bin/chvt 7
чтобы избежать появления курсора, и он имеет преимущество в том, что не сталкивается с agetty, которое запускается по умолчанию на tty1 – tty6.Хотя ваш вопрос немного двусмысленный (что подразумевается под консолью), я попытаюсь ответить на наиболее распространенные случаи: / dev / console, / dev / tty, / dev / fb0 ... адаптируйте это к нужным устройствам. Мы предполагаем, что имя пользователя «myuser».
Посмотрите на разрешения устройства (это Ubuntu 15.04)
Принимать меры
/ DEV / консоли
группа "root", но доступ к группе запрещен. Мне не нравится просто добавлять разрешения в корневую группу, поэтому вместо этого я создаю группу, запускаю файл и меняю разрешения
/ DEV / TTY
/ DEV / fb0
Вы также можете использовать команду usermod для добавления вашего пользователя во все вышеперечисленные группы, если это вам нужно.
источник
Исходя из моего недавнего опыта, помимо предоставления разрешения вашему устройству tty (как упоминалось ранее), вам необходимо сделать еще 2 вещи:
setcap cap_sys_tty_config+eip /usr/bin/python3.5
(замените путь для Python своим). Конечно, примите во внимание, что вы предоставляете эту возможность для любого скрипта Python.openvt ./your_script.py
источник