मैं कंसोल पर ग्राफिक्स को प्रदर्शित करने के लिए एसडीएल-आधारित प्रोग्राम का उपयोग करना चाहता हूं, कंसोल से लॉग ऑन किए बिना, और प्रोग्राम को रूट के बिना चलाना। उदाहरण के लिए, मैं इसे ssh के माध्यम से चलाने में सक्षम होना चाहता हूं। लक्ष्य ओएस रास्पबियन है।
इस समस्या का वर्णन करने के लिए अजगर में एक छोटा उदाहरण दिया गया है:
import os, pygame
os.environ['SDL_VIDEODRIVER'] = 'fbcon'
pygame.init()
s = pygame.display.set_mode()
print "Success"
यह काम करता है (रन पूरा करने के लिए, अपवाद नहीं फेंकता है) अगर मैं इसे कंसोल से चलाता हूं, और यह ssh के माध्यम से काम करता है अगर मैं इसे रूट पर चलाता हूं।
मैंने जाँच की है कि मेरा उपयोगकर्ता ऑडियो और वीडियो समूहों में है।
मैंने यह देखने के लिए स्ट्रेस का उपयोग किया है कि इसे कंसोल से चलाने के बीच क्या अलग है (जो काम करता है), इसे ssh के माध्यम से रूट के रूप में चलाना (यह भी काम करता है), और इसे ssh (काम नहीं करता है) के माध्यम से एक नियमित उपयोगकर्ता के रूप में चलाना।
पहला अंतर यह था कि मेरे उपयोगकर्ता के पास / dev / tty0 तक पहुँचने की अनुमति नहीं थी। मैंने एक नया समूह (tty0) बनाया, उस समूह में अपने उपयोगकर्ता को रखा, और उस समूह को / dev / tty0 तक पहुँच प्रदान करने के लिए एक udv नियम जोड़ा।
इस ioctl कॉल पर स्ट्रेस आउटपुट डाइवर्ज होता है - विफलता यहां दिखाई देती है; ioctl 0 तब देता है जब प्रोग्राम कंसोल से चलाया जाता है या ssh से रूट के रूप में चलाया जाता है:
open("/dev/tty", O_RDWR) = 4
ioctl(4, VT_GETSTATE, 0xbeaa01f8) = -1 EINVAL (Invalid argument)
(पते भी अलग-अलग हैं, लेकिन यह महत्वपूर्ण नहीं है।)
यह देखते हुए कि मेरा कार्यक्रम तब काम करता है जब यह रूट के रूप में चलता है, मुझे लगता है कि इसका मतलब है कि मुझे एक अनुमति समस्या है। मैं अपने उपयोगकर्ता को कंसोल पर लॉग ऑन किए बिना (और रूट के रूप में चलने के बिना) इस कार्यक्रम को चलाने में सक्षम होने के लिए आवश्यक अनुमति कैसे दे सकता हूं?