Chcę używać programu opartego na SDL do wyświetlania grafiki na konsoli, bez konieczności logowania się z konsoli i bez uruchamiania programu jako root. Na przykład chcę móc go uruchomić za pośrednictwem ssh. Docelowym systemem operacyjnym jest raspbian.
Oto krótki przykład w Pythonie, aby zilustrować problem:
import os, pygame
os.environ['SDL_VIDEODRIVER'] = 'fbcon'
pygame.init()
s = pygame.display.set_mode()
print "Success"
Działa to (działa do końca, nie zgłasza wyjątków), jeśli uruchomię go z konsoli i działa przez ssh, jeśli uruchomię go jako root.
Sprawdziłem, czy mój użytkownik jest w grupach audio i wideo.
Użyłem strace, aby zobaczyć, co różni się między uruchomieniem go z konsoli (co działa), uruchomieniem go jako root za pośrednictwem ssh (również działa) i uruchomieniem go jako zwykłego użytkownika za pomocą ssh (nie działa).
Pierwszą różnicą było to, że mój użytkownik nie miał uprawnień dostępu do / dev / tty0. Utworzyłem nową grupę (tty0), umieściłem mojego użytkownika w tej grupie i dodałem regułę udev, aby dać tej grupie dostęp do / dev / tty0.
Wyjście strace różni się przy tym wywołaniu ioctl - tutaj pokazana jest awaria; ioctl zwraca 0, gdy program jest uruchamiany z konsoli lub z ssh jako root:
open("/dev/tty", O_RDWR) = 4
ioctl(4, VT_GETSTATE, 0xbeaa01f8) = -1 EINVAL (Invalid argument)
(Adresy też się różnią, ale to nie jest ważne).
Biorąc pod uwagę, że mój program działa, gdy działa jako root, myślę, że to oznacza, że mam problem z uprawnieniami. Jak przyznać mojemu użytkownikowi niezbędne uprawnienia, aby móc uruchomić ten program bez logowania się na konsoli (i bez uruchamiania jako root)?