ฉันต้องการใช้โปรแกรมที่ใช้ SDL เพื่อแสดงกราฟิกบนคอนโซลโดยไม่ต้องเข้าสู่ระบบจากคอนโซลและไม่เรียกใช้โปรแกรมเป็นรูท ตัวอย่างเช่นฉันต้องการที่จะสามารถเรียกใช้ผ่านทาง ssh ระบบปฏิบัติการเป้าหมายคือ raspbian
นี่เป็นตัวอย่างสั้น ๆ ใน python เพื่อแสดงปัญหา:
import os, pygame
os.environ['SDL_VIDEODRIVER'] = 'fbcon'
pygame.init()
s = pygame.display.set_mode()
print "Success"
ใช้งานได้ (ทำงานจนเสร็จสมบูรณ์ไม่ส่งข้อยกเว้น) ถ้าฉันเรียกใช้จากคอนโซลและทำงานผ่าน ssh ถ้าฉันเรียกใช้เป็นรูต
ฉันตรวจสอบแล้วว่าผู้ใช้ของฉันอยู่ในกลุ่มเสียงและวิดีโอ
ฉันใช้ 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)
(ที่อยู่ยังแตกต่างกัน แต่นั่นก็ไม่สำคัญ)
เนื่องจากโปรแกรมของฉันทำงานเมื่อทำงานเป็นรูทฉันคิดว่านี่หมายความว่าฉันมีปัญหาการอนุญาต ฉันจะให้สิทธิ์ที่จำเป็นแก่ผู้ใช้ของฉันเพื่อให้สามารถเรียกใช้โปรแกรมนี้ได้โดยไม่ต้องเข้าสู่ระบบที่คอนโซล (และไม่ต้องทำงานในฐานะรูท)