Ich möchte ein SDL-basiertes Programm verwenden, um Grafiken auf der Konsole anzuzeigen, ohne mich von der Konsole aus anmelden zu müssen und ohne das Programm als Root auszuführen. Zum Beispiel möchte ich es über ssh ausführen können. Das Ziel-Betriebssystem ist Raspbian.
Hier ist ein kurzes Beispiel in Python, um das Problem zu veranschaulichen:
import os, pygame
os.environ['SDL_VIDEODRIVER'] = 'fbcon'
pygame.init()
s = pygame.display.set_mode()
print "Success"
Dies funktioniert (läuft bis zum Abschluss, wirft keine Ausnahmen), wenn ich es von der Konsole aus starte, und es funktioniert über ssh, wenn ich es als root starte.
Ich habe überprüft, ob sich mein Benutzer in den Audio- und Videogruppen befindet.
Ich habe strace benutzt, um zu sehen, was anders ist, als es von der Konsole aus (was funktioniert), als root über ssh (funktioniert auch) und als normaler Benutzer über ssh (funktioniert nicht) auszuführen.
Der erste Unterschied war, dass mein Benutzer keine Zugriffsberechtigung für / dev / tty0 hatte. Ich habe eine neue Gruppe (tty0) erstellt, meinen Benutzer in diese Gruppe aufgenommen und eine udev-Regel hinzugefügt, um dieser Gruppe Zugriff auf / dev / tty0 zu gewähren.
Die Ausgabe von strace weicht bei diesem ioctl-Aufruf ab - der Fehler wird hier angezeigt. ioctl gibt 0 zurück, wenn das Programm von der Konsole oder von ssh als root ausgeführt wird:
open("/dev/tty", O_RDWR) = 4
ioctl(4, VT_GETSTATE, 0xbeaa01f8) = -1 EINVAL (Invalid argument)
(Die Adressen unterscheiden sich auch, aber das ist nicht wichtig.)
Angesichts der Tatsache, dass mein Programm als Root ausgeführt wird, bedeutet dies, dass ich ein Berechtigungsproblem habe. Wie erteile ich meinem Benutzer die erforderlichen Berechtigungen, um dieses Programm ausführen zu können, ohne sich an der Konsole anzumelden (und ohne als Root ausgeführt zu werden)?